2012-07-12 73 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()