0

我正在使用 asqladapter来直接从 a 更改数据库值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,变量“更改”始终为空。你知道为什么吗?

4

2 回答 2

1

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

例如,如果您要处理 DataTable 对象的“RowChanged”事件,GetChanges 将返回更改的行(您还可以观察到该事件仅在您离开正在编辑的行时触发)

我确信有一种方法可以强制 DataGridView 控件将更改写入底层 DataRow,但我还没有尝试过(BeginEdit/EndEdit ?)

于 2012-08-14T16:24:21.977 回答
0

ds.AcceptChanges()之前打电话ds.GetChanges()

于 2014-07-08T14:30:24.853 回答