C# 如何更改整个datagridview列的单元格值?

C# 如何更改整个datagridview列的单元格值?,c#,datagridview,C#,Datagridview,我想让datagridview列全部选中,或者不选中。下面的代码可以工作,但是有没有更简单/更快的方法?用于设置列中所有单元格的值 if(searchResultsGrid.Columns["checkboxColumn"].HeaderText == "CheckAll") { searchResultsGrid.Columns["checkboxColumn"].HeaderText = "UncheckAll"; foreach (DataGridViewRow row i

我想让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);
    }
}
你可以通过一些诡计以另一种方式实现这一点。列必须为
只读
,单元格值必须为
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;

但请注意:要获取选中状态,您将使用
cell.EditedFormattedValue
,而不是
cell.Value
。(因为
Value
必须始终为
null
才能使此技巧起作用。)


这具有创造性,但您还必须考虑未来的开发人员。当您决定优化代码时,您必须询问它将如何影响维护。循环很容易理解,而且执行起来也很快。你得权衡一下价值

下面是我在100次运行中发现的片段,每次运行10000行数据。以下是切换行的方法:

标准循环

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
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
空值切换

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
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

注意:不管行数多少,空值切换速度都是一致的。对于小数据(1000行),循环比NullValue方法快2/3。

不太可能,你确实需要循环。谢谢你的建议,但这只是一个附加功能;这意味着用户可以选择单击每个单元格,或者只单击标题选择全部。你有令人印象深刻的时间数据。对于大约800行,当前处理大约需要45秒。公平地说,我的测试行只有3列简单数据。仅在标题单元格上执行此操作很容易,但如果允许单元格值从
Null
更改,则此操作确实不适用于您的目的。从这一点上,我们也许能够找到一个解决方案,但对于维护来说,它太模糊了。