2011-04-09 89 views
2

我有一個DataGridViewCheckBoxColumn和其他一些文本框列一個DataGridView。我想遍歷每個單元格,看看複選框是否被選中然後執行某些操作。我正在使用以下循環方法。有沒有更好的方法呢?循環通過的DataGridView和讀取CheckBoxColumn值

我已經使用或條件,因爲在某些計算機中,它將.Value作爲選中狀態並在某些情況下將.Value設置爲true。

 foreach (DataGridViewRow row in dataGridView.Rows) 
       { 
        if ((bool)(row.Cells["Checkbox"]).Value || (CheckState)row.Cells["Checkbox"].Value == CheckState.Checked) 
        { 
         // Do something 
        } 

       } 

在此先感謝。

+0

裝有gridview的箱子檢查,還是用戶檢查他們然後你想做點什麼?如果是後者,當盒子被檢查時,你不能使用事件來處理它嗎? – 2011-04-09 08:08:28

+0

@Darren:沒有包裝盒是不預先檢查,但是用戶點擊它們。我的意圖是收集檢查行的數據併發送給他們打印。 – Marshal 2011-04-09 08:12:18

回答

1

它使用下面的代碼爲我工作:

foreach (DataGridViewRow row in dgv_labelprint.Rows) 
{ 
    if (value.Value == null) 
    { 

    } 
    else 
     if ((Boolean)((DataGridViewCheckBoxCell)row.Cells["CheckBox"]).FormattedValue) 
     { 
      //Come inside if the checkbox is checked 
      //Do something if checked 
     } 

} 
1

看看這個鏈接DirtyCellChanged然後,您可以跟蹤哪些行已被檢查並完成您的工作,而不必遍歷整個表格。與複選框打交道時,當用戶點擊,有時檢查,然後不要點擊其他地方提交編輯

此事件是非常有用的。

它的工作適合我過去。

+0

是的,但是如果用戶取消選中Box,我必須刪除行。所以,更好的選擇是讓他們檢查所有,然後遍歷GridView控件當用戶點擊提交或打印按鈕 – Marshal 2011-04-09 08:24:12

4

我認爲這將是比的foreach快

for (int i = 0; i < dataGridView.Rows.Count -1; i++) 
{ 
    DataGridViewRow row = dataGridView.Rows[i]; 
    if ((bool)(row.Cells["Checkbox"]).Value 
     || (CheckState)row.Cells["Checkbox"].Value == CheckState.Checked) 
    { 
     // Do something 
    } 
} 
+0

是的。這就是我尋找它的原因。這裏有90%的解決方案適用於每種解決方案。 +1。 – 2016-05-24 07:42:22

0
int subId; 

List<int> olist= new List<int>(); 

for (int i = 0; i < gvStudAttend.Rows.Count; i++) 
{  
    bool Ischecked = Convert.ToBoolean(gvStudAttend.Rows[i].Cells["Attendance"].Value); 
    if (Ischecked == true)  
    { 
     subId = gvStudAttend.Rows[i].Cells["SubjectID"].Value.ToString(); 
     olist.Add(subId); 
    } 
}