如何在上面一行的特定单元格填充后向数据视图添加新行?

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

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

ID NAME PRICE ... 1 Beer 2.6 2 Cheese 3.3 _ _______ ____ <- empty row 

现在,如果我单击(输入),新行ID将自动设置为3,如果我将“点击”保留为“啤酒”单元格,则新行ID为空,所有默认值均为空(这是它应该和工作的方式)。 问题是如果单击/输入新行并为名称键入内容(即使我在离开单元格之前删除了内容),也会在此行下方添加一个新行,即新行。 因此,此行被添加到BindingList并且不完整,在正确填充所有必需单元格(例如价格)之前不应添加该行。

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

谢谢你的时间和答案。

您必须在检查特定条件( validation规则 )后处理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; } 

如果您正在开发一个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; } 

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