2010-12-01 42 views
27

向誰可能涉及到,我尋覓了大量的時間,工作出路這個錯誤的錯誤:已刪除行的信息不能通過行

"Deleted row information cannot be accessed through the row"

我明白訪問,一旦行已從數據表中刪除,無法以典型方式訪問它,這就是我遇到此錯誤的原因。最大的問題是我不知道該如何做才能得到我想要的結果,我將在下面概述。

基本上,當「dg1」中的一行被刪除時,它下面的行取代了刪除的行(顯然),從而繼承了刪除的行索引。此方法的目的是替換並重置行索引(通過從數據集中相應的值中抓取它)來獲取刪除行的位置,並將索引值作爲索引值。

現在我只是使用一個標籤(lblText)來嘗試獲取進程的響應,但是當最後一個嵌套的if語句嘗試比較值時,它會崩潰。

下面是代碼:

void dg1_Click(object sender, EventArgs e) 
    { 
     rowIndex = dg1.CurrentRow.Index; //gets the current rows 
     string value = Convert.ToString(dg1.Rows[rowIndex].Cells[0].Value); 

     if (ds.Tables[0].Rows[rowIndex].RowState.ToString() == "Deleted") 
     { 

      for (int i = 0; i < dg1.Rows.Count; i++) 
      { 

       if (Convert.ToString(ds.Tables[0].Rows[i][0].ToString()) == value) 
       //^**where the error is occurring** 
       { 
        lblTest.Text = "Aha!"; 
        //when working, will place index of compared dataset value into         rowState, which is displaying the current index of the row I am focussed on in 'dg1' 
       } 
      } 
     } 

由於提前時間的幫助,我真的搜索,如果它是很容易通過一個簡單的谷歌搜索找出然後讓自己重複恨上我,因爲我試過。

  • GC

回答

31

內部if語句中的數據列的當前值將不可用於刪除的行。要檢索已刪除行的值,請指定您想要的原始值。這應該可以解決您的錯誤:

if (Convert.ToString(ds.Tables[0].Rows[i][0, DataRowVersion.Original].ToString()) == value) 
0

刪除一行之後,重新綁定網格與數據表,無需手動復位指數,數據表HANDELS它。

因此您需要重新綁定網格的數據源。

+0

我很抱歉,我應該澄清,我不是試圖在所有更新的數據源,我試圖讓這個,DataGrid中的行無論在位置,數據網格將始終顯示該信息在數據集中的索引。即 - 數據網格的第2行返回的索引爲1,但在數據集中,該行的索引爲2.不向數據庫提交刪除操作,我需要從數據集中獲取該行的索引並將其放入datagrid所以在dg中的相應行(具有相同信息的行)顯示索引爲2. – zillaofthegods 2010-12-01 07:23:31

+0

也許我對你的解釋感到困惑,我仍然習慣於c#數據庫訪問的邏輯。 – zillaofthegods 2010-12-01 07:28:00

12

在你的「如果崩潰」,你可以檢查,如果該行被訪問它的值之前刪除:

if (ds.Tables[0].Rows[i].RowState != DataRowState.Deleted && 
    Convert.ToString(ds.Tables[0].Rows[i][0].ToString()) == value) 
{ 
    // blaaaaa 
} 

此外,我不知道爲什麼你的ToString ()RowState,而不是將其與DataRowState.Deleted進行比較。

36

您也可以使用DataSet的AcceptChanges()方法來完全應用刪除。

ds.Tables[0].Rows[0].Delete(); 
ds.AcceptChanges();