错误 "Rows cannot be programatically added to datagridview's row collection when the control is data-bound"

Error "Rows cannot be programatically added to datagridview's row collection when the control is data-bound"

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

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

Rows cannot be programatically added to datagridview's row collection when the control is data-bound

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 属性 设置为真,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。查看此 question 的答案以获取更多详细信息。