0

Есть дгв2, в котором находятся чекбоксы. По какой то причине, при попытке получить значение ячейки, я получаю ошибку. введите сюда описание изображения

Допустим, хочу посмотреть в содержимое ячейки вот так

private void Import_DoubleClick(object sender, EventArgs e)
        {
            MessageBox.Show(dataGridView2.Rows[0].Cells[0].Value.ToString());
        }

Получаю ошибку

System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта."

System.Windows.Forms.DataGridViewCell.Value.get вернул null.

Юмор в том, что есть код, который обращается к дгв2 точно так же, и никаких проблем, работает всегда. В нем я сохраняю дгв2 в бд.

private void button5_Click(object sender, EventArgs e)
        {
            string src = "0", upd = "0";
            if (radioButton1.Checked) src = "1";
            if (checkBox1.Checked) upd = "1";
        MySql.command($"UPDATE import SET link = '{MySql.escape(textBox2.Text)}', isupdate = '{upd}', source = '{src}', type = '{MySql.escape(comboBox1.Text)}', sklad = '{MySql.escape(comboBox2.Text)}', skip = '{textBox1.Text}', group_id = '{textBox3.Text}' WHERE name = '{MySql.escape(name)}'");

        MySql.command($"DELETE FROM import_ WHERE import_name = '{MySql.escape(name)}'");

        for (int i = 0; i < dataGridView3.Columns.Count; i++)
        {
            string combobox = "----------";
            if (dataGridView3.Rows[0].Cells[i].Value as string != null) combobox = dataGridView3.Rows[0].Cells[i].Value.ToString();

            MySql.command($"INSERT INTO import_ (columnindex, import_name, comboBox, checkBox) VALUES ('{i}','{MySql.escape(name)}','{MySql.escape(combobox)}','{dataGridView2.Rows[0].Cells[i].Value}')");
        }

        MessageBox.Show("Сохранено");
    }

Приведу еще код, который создает и заполняет все дгв.

private void loadGridsInfo()
        {
            var dt = MySql.getTable($"SELECT columnindex, comboBox, checkBox FROM import_ WHERE import_name = '{name}'");
            dt = dt.AsEnumerable().OrderBy(n => int.Parse(n[0].ToString())).CopyToDataTable();
            int count = dt.Rows.Count;
            int min;
            if (dataGridView1.Columns.Count < count) min = dataGridView1.Columns.Count;
            else                                     min = count;
        for (int i = 0; i &lt; min ; i++)
        {
            if (dt.Rows[i][2].ToString() == &quot;True&quot;) dataGridView2.Rows[0].Cells[i].Value = true;

            dataGridView3.Rows[0].Cells[i].Value = dt.Rows[i][1].ToString();
        }
    }

private void adaptGrids() { dataGridView2.Rows.Clear(); dataGridView3.Rows.Clear(); dataGridView2.Columns.Clear(); dataGridView3.Columns.Clear();

        for (int i = 0; i &lt; dataGridView1.Columns.Count; i++)
        {
            var clmn1 = new DataGridViewComboBoxColumn();
            var clmn2 = new DataGridViewCheckBoxColumn();

            clmn1.HeaderText = &quot;C&quot; + i;
            clmn2.HeaderText = &quot;C&quot; + i;
            clmn1.Width = dataGridView1.Columns[i].Width;
            clmn2.Width = dataGridView1.Columns[i].Width;
            clmn1.DataSource = comboBox;

            dataGridView2.Columns.Add(clmn2);
            dataGridView3.Columns.Add(clmn1);
        }
        dataGridView2.Rows.Add();
        dataGridView3.Rows.Add();
    }

Один из тех случаев, когда даже не знаю куда копать. Есть идеи?


NoMad
  • 25
  • Я вижу у вас несколько DGV, быть может вы выбрали не ту, которая нужна, а исключения можно избежать например вот так dataGridView2.Rows[0].Cells[0].Value?.ToString() ?? "<null>". который обращается к дгв2 точно так же - не вижу dgv2, вижу dgv3. – aepot May 29 '22 at 21:58
  • Кстати, почитайте вот это, это поможет упростить код, раз в несколько. Война с ячейками таблицы - не то, чем стоит заниматься. – aepot May 29 '22 at 22:03
  • Хм, интересная тема. Но есть некоторые вопросов. К примеру я получаю из базы данных DataTable. Как мне его быстро отобразить в дгв, обычно я это делаю через DataSource. Как я понял, количество колонок определяется классом Person, и менять быстро мы это не можем. А так же нету возможности обращаться к ячейкам или колонкам по индексу, а не по имени. – NoMad May 30 '22 at 19:42
  • aepot, если не затруднит, добавьте меня в Телеграмме. Буду признателен за возможность периодически задавать вам вопросы. @nnoommaadd – NoMad May 30 '22 at 19:44
  • Person в том случае - модель данных. Чтобы использовать классы в качестве моделей вместо DataTable, надо учиться использовать ORM, например Entity Framework, тогда будет только объектная модель и больше ничего. А чтение и запись данных сведется к взаимодействию с моделью, и писать SQL запросы вообще не надо будет. При чем даже таблицы создавать не надо, EF сам для вас их создаст, такой подход к разработке с участием БД называется Code First. Очень популярная схема, используется практически на всех серьезных серверах. – aepot May 30 '22 at 20:22

0 Answers0