mekenix Ответов: 1

Datagridview сталкивается друг с другом


Это строка кода, которая вызывает проблему. Этот код работает, но есть проблема.

public void LoadProducts()
        {//this line of code is completely alien to me and it is for to search bar
            int i = 0;
            dataGridView2.Rows.Clear();
            cn.Open();
            cm = new SqlCommand("Select p.pcode, p.barcode, p.pdesc, b.brand, c.category, p.price, p.qty from tblProduct as p inner join tblBrand as b on b.id = p.bid inner join tblCategory as c on c.id = p.cid where p.pdesc like @pdesc", cn);
            cm.Parameters.AddWithValue("@pdesc", "%" + textAra.Text + "%");
            dr = cm.ExecuteReader();
            while (dr.Read())
            {
                i++;
                dataGridView2.Rows.Add(i, dr[0].ToString(), dr[1].ToString(), dr[2].ToString(), dr[3].ToString(), dr[4].ToString(), dr[5].ToString(), dr[6].ToString());
            }
            dr.Close();
            cn.Close();
        }


Я вызываю эту функцию из формы внутри другой формы, и эти две формы имеют отдельные представления datagridviews. Теперь материнская форма имеет datagridview1, а дочерняя-datagridview2.

Материнская форма имеет кнопку, при нажатии на которую отображается наша дочерняя форма, и вот в чем проблема. Когда я пишу

private void pictureBox1_Click(object sender, EventArgs e)
       {

           this.Dispose();

       }


моя детская форма закрывается, и моя материнская форма возвращается. Но это дает мне ошибку говоря

No row can be added to a DataGridView control that does not have columns. Columns must be added first


Теперь есть код в материнской форме, который я использую, чтобы назвать мою детскую форму.


private void btnSearch_Click(object sender, EventArgs e)
        {
            if(textSearch.Text == String.Empty) 
            {
                frmLookProduct früb = new frmLookProduct();
                früb.ShowDialog();
                früb.LoadProducts();
            }
        }


я считаю, что проблема заключается в том, что früb.LoadProducts(); line.

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

Когда я уберу фрюба.LookProduct(); и используйте ту же строку кода в

private void frmLookProduct_Load(object sender, EventArgs e)
        {
            LoadProducts();
        }


это не дает никаких проблем, но разве это не вызовет дальнейших проблем?

1 Ответов

Рейтинг:
11

OriginalGriff

Утилизация-это способ сказать: "я покончил с этим навсегда; я никогда больше ничего не хочу в нем, пожалуйста, утилизируйте его для меня".
Когда вы вызываете Dispose в своей форме, она закрывается, и все ресурсы, используемые формой, также удаляются.
Таким образом, форма сообщает DataGridView выгрузить всю информацию, которую он использует, и он это делает: он отбрасывает всю информацию о столбце и все, что с ним связано.

Это все равно что засунуть напечатанное письмо в измельчитель, а потом сжечь клочки.

Не выбрасывайте ничего и не ждите, что это сработает потом - так же, как и письмо, оно исчезло!

Вместо того чтобы утилизировать обработчик щелчков, вызовите Close.
Но подумайте об этом: почему вы пытаетесь загрузить данные в элемент управления на форме, которую вы только что закрыли? Разве вы не должны вызывать LoadProducts, прежде чем сказать ему, чтобы он отображался? ShowDialog не возвращается до тех пор, пока форма не будет закрыта...

private void btnSearch_Click(object sender, EventArgs e)
        {
            if(textSearch.Text == String.Empty) 
            {
                frmLookProduct früb = new frmLookProduct();
                früb.LoadProducts();
                früb.ShowDialog();
            }
        }
Может сработать лучше.


mekenix

Это сработало. Спасибо сэр

OriginalGriff

Всегда пожалуйста!