错误 "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
以及组合框控件。当我在文本框控件中输入数据并单击添加按钮时,值将添加到 DataGridView
view 以供用户查看,单击保存按钮时,值将保存在数据库中。
问题是我有一个 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);
}
}
}
如果要同步 DataGridView
和 DataBase
,请使用 BindingSource
。查看此 question 的答案以获取更多详细信息。
我有一个 DataGridView
和几个 TextBox
以及组合框控件。当我在文本框控件中输入数据并单击添加按钮时,值将添加到 DataGridView
view 以供用户查看,单击保存按钮时,值将保存在数据库中。
问题是我有一个 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);
}
}
}
如果要同步 DataGridView
和 DataBase
,请使用 BindingSource
。查看此 question 的答案以获取更多详细信息。