简体   繁体   中英

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

I have a DataGridView and few TextBox and combo box controls. when i enter data in textbox controls and click on add button the values are added to DataGridView view for user view and on clicking save button the values gets saved in DB.

The problem is that I have a TextBox (Invoice_No), On this TextBox leave event i have written code to fetch data from DB to data grid view. Now i am not able to add additional row to this grid by entering values in TextBox controls. It gives the below error

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);
    }
}

Add row in your Datasource and then set the datasource to updated datatable. Like:

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;
    }
}

When the DataGridView is bound to a data using the DataSource property, you cannot add new rows to the DataGridView directly. This is an expected error and documented in MSDN .

The DataGridView control itself allows to you to add new rows if AllowUserToAddRows the property is set to true.

If you still want to use the text boxes to get input and add to the DataGridView you have to manipulate the underlying DataTable which you have set as DataSource .

Untested sample code

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);
        }            
    }
}

If you want to synchronize the DataGridView and the DataBase use the BindingSource . Check the answer of this question for more details.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM