我正在使用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#很新。
感谢您的时间和答案。
答案 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;
}
或者你可以使用文本框的离开事件,但有时会变得有点喧嚣。 建议随时欢迎!