CHill60
Это оказалось более неловко, чем я ожидал!
Выбор подходящего события для размещения кода был первой проблемой. CellValidated или CellValueChanged были моими первыми мыслями, но они не были запущены, когда я ожидал (например, CellValidated не запускается при нажатии флажка, но когда вы нажимаете в другом месте - не очень хороший пользовательский опыт)
В конце концов я выбрал dataGridView2_CellClick
событие, которое приносит свои собственные проблемы ... при проверке .Value
из ячейки при первом же щелчке вы обнаружите, что это null
Поэтому мне пришлось использовать EditingCellFormattedValue
вместо этого-беда в том, что в момент запуска события это значение все еще противоположный о том, что мы думаем ... другими словами, когда мы нажимаем галочку, это значение все еще ложно - оно имеет значение, которое мы перемещаем от не та ценность, которую мы движем к Я немного работаю над этим моментом, чтобы привлечь внимание к тому, что не (!
) оператор в линии
var checkValue = !(bool)((DataGridViewCheckBoxCell)dataGridView2.Rows[r].Cells[c]).EditingCellFormattedValue;
Следующий вопрос, который следует рассмотреть, заключается в том, являются ли свойства
AllowUserToAddRows
было установлено значение true или false (по умолчанию true). В приведенном ниже коде я обрабатываю либо то, либо другое, но если вы опустите настройку this в false при использовании
foreach
вы получите исключение
Цитата:
Необработанное исключение типа "System.NullReferenceException" произошло в Sandbox.exe
Дополнительная информация: ссылка на объект не установлена на экземпляр объекта.
Вот мое полное решение
private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e)
{
var r = e.RowIndex;
var c = e.ColumnIndex;
if (dataGridView2.Rows[r].Cells[c].GetType() != typeof(DataGridViewCheckBoxCell)) return;
var procodSearch = dataGridView2.Rows[r].Cells[2].Value.ToString();
var typcodSearch = dataGridView2.Rows[r].Cells[3].Value.ToString();
var checkValue = !(bool)((DataGridViewCheckBoxCell)dataGridView2.Rows[r].Cells[c]).EditingCellFormattedValue;
var temp = dataGridView1.AllowUserToAddRows;
dataGridView1.AllowUserToAddRows = false;
foreach (DataGridViewRow dr in dataGridView1.Rows)
{
if (dr.Cells[dataGridView1.Columns["procod"].Index].Value.ToString().Equals(procodSearch)
&& dr.Cells[dataGridView1.Columns["typcod"].Index].Value.ToString().Equals(typcodSearch))
((DataGridViewCheckBoxCell)dr.Cells[0]).Value = checkValue;
}
dataGridView1.AllowUserToAddRows = temp;
temp = dataGridView3.AllowUserToAddRows;
dataGridView3.AllowUserToAddRows = false;
foreach (DataGridViewRow dr in dataGridView3.Rows)
{
if (dr.Cells[dataGridView3.Columns["typcod"].Index].Value.ToString().Equals(typcodSearch))
((DataGridViewCheckBoxCell)dr.Cells[0]).Value = checkValue;
}
dataGridView3.AllowUserToAddRows = temp;
}
Или если вы предпочитаете использовать Linq:
private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e)
{
var r = e.RowIndex;
var c = e.ColumnIndex;
if (dataGridView2.Rows[r].Cells[c].GetType() != typeof(DataGridViewCheckBoxCell)) return;
var procodSearch = dataGridView2.Rows[r].Cells["procod"].Value.ToString();
var typcodSearch = dataGridView2.Rows[r].Cells["typcod"].Value.ToString();
var checkValue = !(bool)((DataGridViewCheckBoxCell)dataGridView2.Rows[r].Cells[c]).EditingCellFormattedValue;
var temp = dataGridView1.AllowUserToAddRows;
dataGridView1.AllowUserToAddRows = false;
foreach (DataGridViewRow dr in dataGridView1.Rows.Cast<DataGridViewRow>()
.Where(dr => dr.Cells[dataGridView1.Columns["procod"].Index].Value.ToString().Equals(procodSearch)
&& dr.Cells[dataGridView1.Columns["typcod"].Index].Value.ToString().Equals(typcodSearch)))
((DataGridViewCheckBoxCell)dr.Cells[0]).Value = checkValue;
dataGridView1.AllowUserToAddRows = temp;
temp = dataGridView3.AllowUserToAddRows;
dataGridView3.AllowUserToAddRows = false;
foreach (DataGridViewRow dr in dataGridView3.Rows.Cast<DataGridViewRow>()
.Where(dr => dr.Cells[dataGridView3.Columns["typcod"].Index].Value.ToString().Equals(typcodSearch)))
((DataGridViewCheckBoxCell)dr.Cells[0]).Value = checkValue;
dataGridView3.AllowUserToAddRows = temp;
}
Это не идеальное решение - например, я сделал некоторые предположения о том, какие столбцы содержат флажки (я предположил столбец 0 выше), и нет никакой проверки на наличие нулевых значений ни в одном столбце, но это начало.