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

时间:2017-07-13 19:07:35

标签: c# 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 个答案:

答案 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。