Vee*_*Wee 6 c# data-binding datagridview
我是c#的新手,并尝试将datagridview绑定到visual studio 2010中的mssql数据库.数据绑定正常,一切似乎都有效.除了一些奇怪的错误:
我在以下主题中收到错误:更新同一行2次,删除新插入的行,删除另一行后更新行(对DeleteCommand的单词更改)
我在Google上找到的解决方案都不适合我.我希望有人可以帮助我.这是te代码:
private void fillDatagrid()
{
//fill datagrid ADO.NET
conn = new SqlConnection(TestApp.Properties.Settings.Default.TestdatabaseConnectionString);
cmd = conn.CreateCommand();
conn.Open();
cmd.CommandText = "SelectFrom";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@table", SqlDbType.NVarChar, 50).Value = "Countries";
cmd.Parameters.Add("@filters", SqlDbType.NVarChar, 300).Value = "";
adapt = new SqlDataAdapter(cmd);
dt = new DataTable();
adapt.Fill(dt);
dt.TableName = "Countries";
conn.Close();
BindingSource src = new BindingSource();
src.DataSource = dt;
dt.RowChanged += new DataRowChangeEventHandler(dt_RowChanged);
dgDatabaseGrid.DataSource = src;
dgDatabaseGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
//dgDatabaseGrid.RowValidating += new DataGridViewCellCancelEventHandler(dgDatabaseGrid_RowValidating);
//disable columns:
dgDatabaseGrid.Columns[0].Visible = false;
dgDatabaseGrid.Columns["date_insert"].Visible = false;
dgDatabaseGrid.Columns["user_insert"].Visible = false;
dgDatabaseGrid.Columns["date_change"].Visible = false;
dgDatabaseGrid.Columns["user_change"].Visible = false;
dgDatabaseGrid.Columns["deleted"].Visible = false;
//auto size last column
dgDatabaseGrid.Columns["remarks"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
SqlCommandBuilder cb = new SqlCommandBuilder(adapt);
}
void dt_RowChanged(object sender, DataRowChangeEventArgs e)
{
try
{
adapt.Update(dt);
}
catch (SqlException ex)
{
Debug.WriteLine(ex.Message);
}
}
private void dgDatabaseGrid_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
if (!e.Row.IsNewRow)
{
DialogResult response = MessageBox.Show("Are you sure?", "Delete row?",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);
if (response == DialogResult.Yes)
{
//ipv delete --> deleted=1
conn.Open();
cmd = conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "DeleteFrom";
cmd.Parameters.Add("@table", SqlDbType.NVarChar, 50).Value = "Countries";
cmd.Parameters.Add("@id", SqlDbType.Int).Value = e.Row.Cells[0].Value;
cmd.ExecuteNonQuery();
conn.Close();
//delete from datagrid:
dt.Rows[dgDatabaseGrid.SelectedCells[0].RowIndex].Delete();
}
//always cancel!
e.Cancel = true;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
我知道现在已经很晚了,但也许会有所帮助.
对您的代码进行了以下更改:
try
{
adapt.Update(dt);
Run Code Online (Sandbox Code Playgroud)
将这些行放在这里并使用您的变量
Me.yourTableAdapter.Update(Me.yourDataSet.yourTable)
Me.yourDataSet.youTable.AcceptChanges()
Me.yourTableAdapter.Fill(Me.yourDataSet.yourTable)
Run Code Online (Sandbox Code Playgroud)
它对我来说就像一个魅力,希望它对你有用.
}
catch (SqlException ex)
{
Debug.WriteLine(ex.Message);
}
Run Code Online (Sandbox Code Playgroud)
更新同一行两次后
是否有时间戳列(或数据库服务器上更改/填充的任何其他列)?
当内存中的行与数据库中的行不同时,可能会出现问题。而且因为您对 SelectCmd 使用 SP,所以更新后(可能)不会刷新。
删除新插入的行后
类似,导致插入后未获取新 ID
当删除另一行时更新一行后(单词更改为DeleteCommand)
完全不清楚。
但是为什么要“手动”删除行而不是将其留给 adjustment.Update() 呢?并且你确定这两个方法都没有被执行吗?