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.