2008-10-07 88 views
5

我正在使用VS 2008/C#並綁定本地List輔助類作爲DataGridView控件的DataSource。調用我的List helper類中的Remove()方法會觸發DataGridView的CellFormatting事件,這很有意義(有點)。刪除最後一行數據綁定DataGridView C#

當刪除網格中最後一行的DataBoundItem(只要網格有多行)時,DataGridView的Rows集合在該事件觸發前不會更新。因此,在CellFormatting事件處理程序中,由於Rows集合太大,我得到一個IndexOutOfRangeException。

我試着刪除使用DataGridView.Rows.Remove()方法的行,並使用BindingSource進行綁定,而不是直接將List綁定爲數據源。

我通過Google發現了一些對這種情況的引用,但是答案並不是即將出現,或者說在DataGridView或DataGridView.Rows集合上使用Delete()方法 - 兩者都不存在。

排序似乎也不是問題,因爲執行/不執行排序會得到相同的結果。

如果DataGridView只包含一行,那麼「最後一行」是唯一的例外,那就是一切正常。

回答

10

我以前有過這個問題,如果我沒有記錯的話,你可以做兩件事中的一件。從集合中刪除記錄時,將datagridview上的datasource屬性設置爲null,然後將其重新綁定到列表中。這應該夠了吧。

或者,你可以在你的dataGridview和你可以說e.Cancel = true的方法中處理DataError事件來抑制異常,或者你可以在那裏進一步處理它。

+0

設置爲空,並返回到集合工作。 – Pat 2009-06-12 22:40:09

0

這是一個很老的問題,但我通過處理row-remove事件來解決它,如下所示。

private void dgViewItems_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) 
{ 
    dataAdapter.Update((DataTable)bindingSource1.DataSource); 
} 

它工作。

0

我知道這是一個老問題,但我發現了另一個解決方案,爲我工作。在從數據源/綁定源中刪除項目之前,請斷開CellFormatting事件的事件處理程序,然後重新連線。例如:

RemoveHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting 
Me.BindingSource1.Remove(item) 
AddHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting 
0

我有同樣的問題。我找到了一個解決方案。嘗試將所有行復制到下一行。然後刪除第一行的dgv。這方面的一個示例代碼:

If Dgv.CurrentCell.RowIndex + 1 = Dgv.Rows.Count Then 
     For m = Dgv.Rows.Count - 2 To 0 Step -1 
      Dgv.Rows(m + 1).Cells(0).Value = Dgv.Rows(m).Cells(0).Value 
      Dgv.Rows(m + 1).Cells(1).Value = Dgv.Rows(m).Cells(1).Value 
      Dgv.Rows(m + 1).Cells(2).Value = Dgv.Rows(m).Cells(2).Value 
      Dgv.Rows(m + 1).Cells(3).Value = Dgv.Rows(m).Cells(3).Value 

     Next 
     Dgv.Rows.RemoveAt(0) 
     Exit Sub 
    End If 
    Dgv.Rows.Remove(Dgv.CurrentRow) 

試試吧:)

2

要隱藏的最後一行,在DataGridView的AllowUserToAddRows屬性更改如下所示:

myDataGridView1.AllowUserToAddRows = false 
1

首先只是禁用的財產Datagridview as

dataGridView1.AllowUserToAddRows = false; 

然後只是刪除最後一行多行你想要的e通過保持-1來使用for循環。

dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1); 
dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1);