如何在填充上面一行的特定单元格之后将新行添加到datagridview?

时间:2011-02-26 11:05:35

标签: c# validation datagridview row

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

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

示例

ID     NAME      PRICE    ...

1      Beer       2.6

2      Cheese      3.3

_      _______     ____      <- empty row

现在,如果我点击(输入),新的行ID将自动设置为3,如果我将点击留给&#39;啤酒&#39;单元格,新行ID为空,所有默认值都为空(这应该是&amp;确实有效)。 问题是如果单击/输入新行并输入名称的内容(即使我在离开单元格之前删除了内容),也会在此行下方添加一个新行,即新行。因此,这一行被添加到BindingList并且不完整,不应该添加它直​​到所有必需的单元格被正确填充(例如价格)。

我不知道该怎么做。请帮帮我,我对C#很新。

感谢您的时间和答案。

2 个答案:

答案 0 :(得分:3)

您必须在检查特定条件(验证规则)后处理RowValidating事件并取消对事件的处理。然后,当前正在输入的行将不会提交到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;
}

答案 1 :(得分:0)

如果您正在开发一个Windows应用程序并且有文本框来从用户那里获取输入以更新到DataGridView,您可以在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;
}

或者你可以使用文本框的离开事件,但有时会变得有点喧嚣。 建议随时欢迎!