2012-07-12 184 views
0

我正在使用sqladapter以直接从datagridview更改数据库值。.GetChanges始终显示为空

为此我使用下面的代码:

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发生变化时,变量“变化”总是空。你知道为什么吗?

+0

之前你叫'AcceptChanges'地方?这将清除数据集上的更改跟踪。 – 2012-07-12 12:11:59

+0

我试过cmdBuilder = new SqlCommandBuilder(adapter); ds.AcceptChanges(); changes = ds.Tables [0] .GetChanges();但更改仍为空 – 2012-07-12 13:08:52

+0

不,我的意思是*不*调用'AcceptChanges'这是否会导致'GetChanges'不返回任何内容。 – 2012-07-12 13:18:03

回答

1

我认为您可能会发现DataGridView控件不会将更改写入底层数据源,直到您移出“当前”行 - 因此,在CellValueChanged事件触发时,它没有将更改写入绑定DataRow中。

如果,例如,你来处理你的DataTable对象的“RowChanged”事件,GetChanges将返回更改的行(你也可以观察到,该事件只有当你离开的行大火正在编辑)。我确信有一种方法可以强制DataGridView控件将更改写入底层的DataRow,但我没有试过(BeginEdit/EndEdit?)

0

呼叫ds.AcceptChanges()ds.GetChanges()