2015-11-08 58 views
0

我有一個未綁定的DGV,用戶可以向其中添加行。阻止DataGridView提交新的空行

默認情況下,網格底部有一個空行。我們稱它爲X行。 當用戶開始編輯X行中的單元格時,將在其下方添加一個新的空白行(X + 1)。

new blank row added when editing cell

但在添加新行後,它可能刪除行X中的所有文本,離開它,而它的空白。網格留下2個連續的空白行。

2 blank rows left when leaving cell

使用CellEndEdit事件,我想:

  1. 刪除行X - 得到了一個InvalidOperationException:操作是無效的,因爲它會導致重入調用SetCurrentCellAddressCore功能。
  2. 刪除行X + 1 - 得到了一個InvalidOperationException:未提交的新行無法刪除。

無法與CellValueChanged事件一起做,因爲null爲null不會被視爲更改。

有沒有辦法來防止這種行爲/確保在任何時候只有一個空行存在? 謝謝!

+0

設置'AllowUserToAddRows'爲false,並添加cotrol自己新行! – TaW

回答

0

第一個錯誤是告訴你,如果其中一個單元格具有當前焦點,則無法移除該行。因此,在CellEndEdit上,將CurrentCell設置爲上面一行中的某個單元格(在嘗試刪除該行之前)。

編輯:示例代碼

public class FormClick : Form { 

    DataGridView dgv = new DataGridView { Dock = DockStyle.Fill }; 
    DataTable table = new DataTable(); 

    public FormClick() { 
     table.Columns.Add("A"); 
     table.Columns.Add("B"); 
     dgv.DataSource = table; 
     Controls.Add(dgv); 

     dgv.CellEndEdit += dgv_CellEndEdit; 
    } 

    void dgv_CellEndEdit(object sender, DataGridViewCellEventArgs e) { 

     DataRow row = ((DataRowView) dgv.Rows[e.RowIndex].DataBoundItem).Row; 
     bool allEmpty = true; 
     for (int i = 0; i < table.Columns.Count; i++) { 
      String s = row[i].ToString(); 
      if (s.Length > 0) { 
       allEmpty = false; 
       break; 
      } 
     } 
     if (allEmpty) { 
      dgv.Rows.RemoveAt(e.RowIndex); 
     } 
    } 
} 
+0

嗨,如果我按回車鍵結束編輯,它會很好用,但如果我點擊另一個單元格,則會拋出同樣的錯誤(「...可重入的SetCurrentCellAddressCore函數調用」)。有任何想法嗎? – eranfu

+0

澄清 - 在這種情況下,從DGV.CurrentCell行引發異常... – eranfu

+0

@eranfu我以爲我能夠重現異常,但不能。請修改我編輯的答案中的示例代碼以重新創建錯誤。 – Loathing