错误“当控件是数据绑定时,无法以编程方式将行添加到datagridview的行集合中”

我有一个DataGridView和几个TextBox和combobox控件。 当我在文本框控件中输入数据并单击添加按钮时,将值添加到DataGridView视图以供用户查看,单击保存按钮时,值将保存在DB中。

问题是我有一个TextBox (Invoice_No),在这个TextBox离开事件我已经编写了代码来从DB获取数据到数据网格视图。 现在,我无法通过在TextBox控件中输入值来向此网格添加其他行。 它给出了以下错误

当控件是数据绑定时,无法以编程方式将行添加到datagridview的行集合中

 private void textBox1_Leave(object sender, EventArgs e) { MySqlConnection connection = new MySqlConnection(myconnectionstring); string getinvdtlcnt = "SELECT COUNT(*) FROM invoice_detail WHERE invoice_no = '" + textBox1.Text + "'"; MySqlCommand cmd = new MySqlCommand(getinvdtlcnt, connection); connection.Open(); var ObjResult = cmd.ExecuteScalar(); int Result = Convert.ToInt32(ObjResult); connection.Close(); if (Result > 0) { dataGridView1.Columns.Clear(); string getinvdtl = "SELECT invoice_no Invoice_No,invoice_line_no Invoice_Line_No,barcode Barcode,product_name Product_Name,description Description,vendor_name Vendor_Name,unit_qty Unit_Qty,UOM,total_qty Total_Qty,single_qty_cost Single_Qty_Cost,single_qty_retail Single_Qty_Retail,cost Cost,retail Retail,discount Discount,amount Amount FROM invoice_detail WHERE invoice_no = '" + textBox1.Text + "'"; connection.Open(); MySqlDataAdapter adapter = new MySqlDataAdapter(getinvdtl, connection); MySqlCommandBuilder cmdbuilder = new MySqlCommandBuilder(adapter); DataTable dt = new DataTable(); adapter.Fill(dt); dataGridView1.DataSource = dt; connection.Close(); int r; bool isRvalid = int.TryParse(Result.ToString(),out r); textBox2.Text = (Result + 1).ToString(); textBox3.Focus(); } } private void BtnAdd_Click(object sender, EventArgs e) { if (textBox1.Text == "" | textBox3.Text == "" | textBox4.Text == "" | comboBox1.SelectedIndex == 0 | textBox5.Text == "" | textBox6.Text == "" | textBox7.Text == "" | textBox8.Text == "" | textBox9.Text == "" | textBox10.Text == "" | textBox11.Text == "" | textBox12.Text == "") { MessageBox.Show("Values Should not Be empty!"); textBox3.Focus(); } else { dataGridView1.Rows.Add(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, richTextBox1.Text, comboBox1.Text, textBox5.Text, comboBox2.Text, textBox6.Text, textBox7.Text, textBox8.Text, textBox9.Text, textBox10.Text, textBox11.Text, textBox12.Text); } } 

在数据源中添加行,然后将数据源设置为更新的数据表。 喜欢:

 private void BtnAdd_Click(object sender, EventArgs e) { if (textBox1.Text == "" | textBox3.Text == "" | textBox4.Text == "" comboBox1.SelectedIndex == 0 | textBox5.Text == "" | textBox6.Text == "" | textBox7.Text == "" | textBox8.Text == "" | textBox9.Text == "" | textBox10.Text == "" | textBox11.Text == "" | textBox12.Text == "") { MessageBox.Show("Values Should not Be empty!"); textBox3.Focus(); } else { DataTable dt = dataGridView1.DataSource as DataTable; dt.Rows.Add(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, richTextBox1.Text, comboBox1.Text, textBox5.Text, comboBox2.Text, textBox6.Text, textBox7.Text, textBox8.Text, textBox9.Text, textBox10.Text, textBox11.Text, textBox12.Text); dataGridView1.DataSource = dt; } } 

DataGridView使用DataSource属性绑定到数据时,您无法直接向DataGridView添加新行。 这是预期的错误,并记录在MSDN中 。

如果AllowUserToAddRows属性设置为true, DataGridView控件本身允许您添加新行。

如果您仍想使用文本框获取输入并添加到DataGridView ,则必须操作已设置为DataSource的基础DataTable

未经测试的示例代码

 private void BtnAdd_Click(object sender, EventArgs e) { if (textBox1.Text == "" | textBox3.Text == "" | textBox4.Text == "" | comboBox1.SelectedIndex == 0 | textBox5.Text == "" | textBox6.Text == "" | textBox7.Text == "" | textBox8.Text == "" | textBox9.Text == "" | textBox10.Text == "" | textBox11.Text == "" | textBox12.Text == "") { MessageBox.Show("Values Should not Be empty!"); textBox3.Focus(); } else { DataTable dt = dataGridView1.DataSource as DataTable; if(dt != null) { DataRow row = table.NewRow(); // set the field values as required dt.Rows.Add(row); dataGridView1.DataSource = dt; } else { dataGridView1.Rows.Add(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, richTextBox1.Text, comboBox1.Text, textBox5.Text, comboBox2.Text, textBox6.Text, textBox7.Text, textBox8.Text, textBox9.Text, textBox10.Text, textBox11.Text, textBox12.Text); } } } 

如果要同步DataGridViewDataBase使用BindingSource 。 查看此问题的答案以获取更多详细信息。