C# 如何仅在上面一行的特定单元格被填充后向datagridview添加新行?

C# 如何仅在上面一行的特定单元格被填充后向datagridview添加新行?,c#,validation,datagridview,row,C#,Validation,Datagridview,Row,我正在用C#(.NET4.0)开发一个桌面应用程序。我有一个datagridview,通过custom(它继承BindingList)BindingList(添加了排序功能)填充了自定义对象。我使用cellValidating事件正确递增第一列(ID),并验证其他单元格的输入 问题是,当我到达新行/最后一行并在一个单元格中输入某些内容(我甚至可以在离开单元格之前删除所有输入)时,datagridview会自动将该行添加到绑定列表中,并在下面创建一个新行。我希望最后一行/新行仅在上面的行(前一新行

我正在用C#(.NET4.0)开发一个桌面应用程序。我有一个datagridview,通过custom(它继承BindingList)BindingList(添加了排序功能)填充了自定义对象。我使用cellValidating事件正确递增第一列(ID),并验证其他单元格的输入

问题是,当我到达新行/最后一行并在一个单元格中输入某些内容(我甚至可以在离开单元格之前删除所有输入)时,datagridview会自动将该行添加到绑定列表中,并在下面创建一个新行。我希望最后一行/新行仅在上面的行(前一新行)正确填充时添加

示例

ID     NAME      PRICE    ...

1      Beer       2.6

2      Cheese      3.3

_      _______     ____      <- empty row
ID NAME价格。。。
1啤酒2.6
2.3.3

_您必须处理
行验证
事件,并在检查特定条件后取消对事件的处理(验证规则)。然后,当前输入的行将不会提交到DataGridView,并且不会添加新行

例如:

if (dgv[0, e.RowIndex].Value == DBNull.Value)
{
    dgv.Rows[e.RowIndex].ErrorText = "You must enter a value for this field!";

    // Tell the DataGridView not to accept this row
    e.Cancel = true;
}

如果你正在开发一个Windows应用程序,并有文本框来从用户那里获得输入,以便更新到DATAGIDVIEW,你可以在C语言本身中完成它,考虑以下内容:

if(txtNAME.Text.Trim()!=String.Empty&&txtPRICE.Text.Trim()!=String.Empty)
{
  MessageBox.Show("Invalid type of input","Alert", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

else
{
  SqlConnection _sqlconnectionOne=new SqlConnection(*DatabaseConnectionString*);

  SqlCommand _sqlcommandOne=new SqlCommand();

  _sqlcommandOne.CommandType=CommandType.Text;
  _sqlcommandOne.CommandText="*INSERTStatement*";
  _sqlcommandOne.Connection=_sqlconnectionOne;
  _sqlcommandOne.ExecuteNonQuery();

  SqlConnection _sqlconnectionSecond=new SqlConnection(*DatabaseConnectionString*);

  SqlCommand _sqlcommandSecond=new SqlCommand();

  _sqlcommandSecond.CommandType=CommandType.Text;
  _sqlcommandSecond.CommandText="*SELECT*Statement*";
  _sqlcommandSecond.Connection=_sqlconnectionSecond;

  SqlDataAdapter _sqldataadapter=new SqlDataAdapter(_sqlcommandSecond);

  DataTable _datatable=new DataTable();

  _sqldataadapter.fill(_datatable);
  *DataGridViewName*.DataSource=_datatable;
}
或者,您可以将Leave事件用于文本框,但有时会变得有点拥挤。 欢迎提出建议