2017-07-13 32 views
1

我想爲datagridview列檢查全部,或者不選中。下面的代碼工作,但有沒有更容易/更快的方式做到這一點?爲了設置列中所有單元格的值?如何更改整個datagridview列的單元格值?

if(searchResultsGrid.Columns["checkboxColumn"].HeaderText == "CheckAll") 
{ 
    searchResultsGrid.Columns["checkboxColumn"].HeaderText = "UncheckAll"; 
    foreach (DataGridViewRow row in searchResultsGrid.Rows) 
    { 
     row.Cells["checkboxColumn"].Value = true; 
     searchResultsGrid.UpdateCellValue(0, row.Index); 
    } 
} 
else 
{ 
    searchResultsGrid.Columns["checkboxColumn"].HeaderText = "CheckAll"; 
    foreach (DataGridViewRow row in searchResultsGrid.Rows) 
    { 
     row.Cells["checkboxColumn"].Value = false; 
     searchResultsGrid.UpdateCellValue(0, row.Index); 
    } 
} 
+1

不是,你必須循環。 – TaW

回答

1

可以實現這一目標通過一些弄虛作假的另一種方式。該列必須爲ReadOnly,單元格值爲Null。單擊列中的任何單元格將切換列的默認NullValue;基本上切換每個細胞。

DataGridViewCheckBoxColumn chk = new DataGridViewCheckBoxColumn(false); 
chk.HeaderText = "CheckAll"; 
chk.Name = "checkboxColumn"; 
chk.ReadOnly = true; 
this.dataGridView1.Columns.Add(chk); 

this.dataGridView1.CellClick += DataGridView1_ToggleAll; 

private void DataGridView1_ToggleAll(object sender, DataGridViewCellEventArgs e) 
{ 
    DataGridViewCheckBoxColumn col = this.dataGridView1.Columns[e.ColumnIndex] as DataGridViewCheckBoxColumn; 

    if (col?.Name == "checkboxColumn") 
    { 
     bool checkAll = (bool)col.DefaultCellStyle.NullValue; 
     col.HeaderText = checkAll ? "CheckAll" : "UncheckAll"; 
     col.DefaultCellStyle.NullValue = !checkAll; 
    } 
} 

但請注意:讓你使用cell.EditedFormattedValuecell.Value選中狀態。 (因爲需要的Value將永遠是null的這一招工作。)


這有創造性的觸摸到它,但你還必須考慮未來的發展。當你決定優化代碼時,你必須問問它會如何影響維護。循環很容易理解,並且仍然可以快速執行。你必須衡量價值。

下面是我的研究結果中的片段,每行100行,每行包含10,000行數據。這些是run times切換行:

標準循環

Elapsed = 00:00:00.0315538 
Elapsed = 00:00:00.0107964 
Elapsed = 00:00:00.0676696 
Elapsed = 00:00:00.0232370 
Elapsed = 00:00:00.0243285 

NullValue屬性繃

Elapsed = 00:00:00.0006645 
Elapsed = 00:00:00.0006712 
Elapsed = 00:00:00.0006804 
Elapsed = 00:00:00.0007579 
Elapsed = 00:00:00.0003037 

注:NullValue屬性來回切換速度,儘管行數一致。對於小數據(1000行),循環比NullValue方法快2/3。

+0

感謝您的建議,但這只是一個附加功能;這意味着用戶可以選擇單擊每個單元格,或者只需單擊標題來選擇全部。令人印象深刻的時間數據。對於〜800行,當前進程大約需要45秒。 –

+1

爲了公平起見,我的測試行只有3列簡單數據。只有在標題單元格上執行此操作將很容易,但這是真的,如果單元格值允許從「Null」更改,則這對您的目的不起作用。我們*可能*能夠從這一點出發找出解決方案,但是出於維護目的,它會太模糊。 – OhBeWise

相關問題