我正在使用sqladapter
直接从datagridview
更改数据库值。
为此我使用下面的代码:
private void ok_Modify_Click(object sender, EventArgs e) {
//modify mod = new modify();
//modify_gv.DataSource = mod.TabletoMod(tickerBox.Text, FundBox.Text);
connetionString = Properties.Settings.Default.TraFra;
connection = new SqlConnection(connetionString);
Sql = "select * from Approval where Ticker ='" + tickerBox.Text + "'";
try {
connection.Open();
adapter = new SqlDataAdapter(Sql, connection);
adapter.Fill(ds);
connection.Close();
modify_gv.DataSource = ds.Tables[0];
} catch (Exception ex) {
MessageBox.Show(ex.ToString());
}
}
private void modify_gv_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
try {
cmdBuilder = new SqlCommandBuilder(adapter);
changes = ds.GetChanges();
if(changes != null)
adapter.Update(changes);
// MessageBox.Show("Changes Done");
} catch (Exception ex) {
MessageBox.Show(ex.ToString());
}
}
但是,每次我在datagridview
中进行更改时,变量“changes”始终为null。你知道为什么吗?
答案 0 :(得分:1)
我认为您可能会发现DataGridView控件在您离开“当前”行之前不会写入对基础数据源的更改 - 因此,当CellValueChanged事件触发时,它没有将更改写入绑定的DataRow
例如,如果您要处理DataTable对象的“RowChanged”事件,GetChanges将返回已更改的行(您还可以观察到事件仅在您离开正在编辑的行时触发)< / em>的
我确信有一种方法可以强制DataGridView控件将更改写入底层DataRow,但我还没有尝试过它(BeginEdit / EndEdit?)。
答案 1 :(得分:0)
在ds.AcceptChanges()
ds.GetChanges()