我想让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);
}
}
答案 0 :(得分: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.EditedFormattedValue
而不是 cell.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。