【问题标题】:How to change the cell value for entire datagridview column?如何更改整个 datagridview 列的单元格值?
【发布时间】:2017-07-14 04:41:14
【问题描述】:

我希望 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);
    }
}

【问题讨论】:

  • 不是真的,你必须循环。

标签: c# datagridview


【解决方案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.EditedFormattedValuenot cell.Value。 (因为Value 必须永远是null 才能使这个技巧起作用。)


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

以下是我在 100 次运行中发现的 sn-ps,每次运行 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。

【讨论】:

  • 感谢您的建议,但这只是一个附加功能;这意味着用户可以选择单击每个单元格,或者只需单击标题以全选。您拥有的令人印象深刻的时间数据。对于约 800 行,当前过程大约需要 45 秒。
  • 为了公平起见,我的测试行只有 3 列简单数据。仅在标题单元格上执行此操作会很容易,但确实如此,如果允许单元格值从 Null 更改,这将不适用于您的目的。我们或许能够从这一点上找到一个解决方案,但它对于维护目的来说太模糊了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多