2017-07-13 49 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

相关问题