Как изменить значение ячейки для всего столбца 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);
}
}
536   1  

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 строк данных. Это были времена выполнения переключения строк:

Стандартный Цикл

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

Переключение Значений Null

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 строк) цикл был на 2/3 быстрее, чем метод NullValue.

Comments

    Ничего не найдено.