Mohamed Shakir Ответов: 1

Соединение трех элементов datagridview с помощью установки флажка


Я создал три вида datagridviews в форме. Все три данные gridviews взяты только из одной таблицы. Один gridview содержит (itmcod,title,procod,typcod,title2) эти поля. Второй gridview содержит (typetitle, procod,typcod, title2). А третий gridview содержит title2, typcod. Все три вида сетки имеют несколько уникальных полей (procod, typcod). Если я автоматически выбираю одно значение из datagridview2 (используя флажок), то два других gridviews, которые имеют одну и ту же строку значений procod и typcod, должны быть выбраны с помощью флажка selecion.

Что я уже пробовал:

Я связал три таблицы в одну временную таблицу и восстановил данные в gridview из temptable. но я не знаю, как использовать опцию выбора флажка для этого

1 Ответов

Рейтинг:
6

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 выше), и нет никакой проверки на наличие нулевых значений ни в одном столбце, но это начало.


Mohamed Shakir

Это хорошее решение. Это работает. Спасибо, Чилл60. Потрясающий.