C# 在填充当前行之前,是否阻止新行出现在DataGridView中?
我在C#3.5中的WinForm应用程序中有一个DataGridViewC# 在填充当前行之前,是否阻止新行出现在DataGridView中?,c#,winforms,datagridview,datagridviewrow,C#,Winforms,Datagridview,Datagridviewrow,我在C#3.5中的WinForm应用程序中有一个DataGridView AllowUserToAddNewRow属性设置为true。当用户在DataGridView中键入任何文本时,另一个新行将自动添加到DataGridView。我不希望添加这一新行,直到对当前行执行了一些检查,并在其中填写了所有必要的信息 示例:我有一个带有空行的DataGridView: 当我开始键入时,会添加新行,这太早了: 我想要的是,只有在用户输入数量后才能添加新行: 我认为在事件单元格中,单击可以检查您所在的列
AllowUserToAddNewRow
属性设置为true。当用户在DataGridView中键入任何文本时,另一个新行将自动添加到DataGridView。我不希望添加这一新行,直到对当前行执行了一些检查,并在其中填写了所有必要的信息
示例:我有一个带有空行的DataGridView:
当我开始键入时,会添加新行,这太早了:
我想要的是,只有在用户输入数量后才能添加新行:
我认为在事件单元格中,单击可以检查您所在的列,然后添加新行,例如:
DataGridView1.Rows.add()
设置AllowUserToAddNewRow=false
现在,首先在数据源中添加一个空行,例如,如果要将DataGridView绑定到名为DT的DataTable,那么就在前面
dataGridView1.DataSource = DT;
做点像
DT.Rows.Add(DT.NewRow());
这是为了最初有一个空行,以便可以输入第一条记录。
然后处理事件dataGridView1.CellEndEdit,在该事件中编写如下内容:
void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 1)//The index of your Quantity Column
{
int qty = (int)DT.Rows[e.RowIndex][e.ColumnIndex];
if (qty > 0)//Your logic if required
{
DT.Rows.Add(DT.NewRow());
}
}
}
这就是它的实现方式 a) 您可以使用检查RowLeave事件中当前行的内容
String.IsNullOrWhiteSpace(GridPGLog.Rows[e.RowIndex].Cells[0].value.toString())
using (or) Cells[0] || cells[1] || cell[2] || ..
如果发现任何错误,请将焦点设置为错误单元格,并强制用户输入数据
DataGridViewRow rowToSelect = this.dgvJobList.CurrentRow;
rowToSelect.Selected = true;
rowToSelect.Cells[0].Selected = true;
this.dgvJobList.CurrentCell = rowToSelect.Cells[0];
b) 或者您可以放置一个保存按钮并使用foreach循环检查所有新添加的行我知道这是旧的。
最简单的方法是,从设计视图中取消选中“启用添加”
基本上,这是一个简单的游戏,包含一些事件,并启用/禁用AllowUserToAddressRow属性:
public Form1()
{
InitializeComponent();
//creating a test DataTable and adding an empty row
DataTable dt = new DataTable();
dt.Columns.Add("Column1");
dt.Columns.Add("Column2");
dt.Rows.Add(dt.NewRow());
//binding to the gridview
dataGridView1.DataSource = dt;
//Set the property AllowUserToAddRows to false will prevent a new empty row
dataGridView1.AllowUserToAddRows = false;
}
现在事件。。。
当单元格识别编辑时,它将触发一个名为CellBeginEdit的事件。在编辑模式下,将AllowUserToAddress设置为false
private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
dataGridView1.AllowUserToAddRows = false;
}
当单元格识别到编辑结束时,它将触发一个名为CellEndEdit的事件。当它结束编辑模式时,检查您的条件。根据结果集,AllowUserToAddress设置为true,而不是保留为false
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
//instead of MessageBox there could be as well your check conditions
if (MessageBox.Show("Cell edit finished, add a new row?", "Add new row?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
dataGridView1.AllowUserToAddRows = true;
else dataGridView1.AllowUserToAddRows = false;
}
不需要用户通过鼠标进行导航,可能是他们通过键盘进行界面您上面提到的这一点可以在RowValidating事件上通过e轻松实现。Cancel=true,但我希望如果当前行未填充,则不应添加新行。如果您执行它,用户将无法将焦点放在行外以添加新行,但这不是我正在寻找的答案我只想取消行添加抱歉无法理解您…取消行添加是什么意思?如果您的意思是不应该在DataGrid中添加新行,那么只需设置AllowUserToAddNewRow=false,正如我在上面第一行中提到的,我希望行应该添加条件。我认为这就是我们在这里试图实现的目标。这样做的想法是,行永远不会自动添加(通过将AllowUserToAddNewRow设置为False来实现这一点,我感觉您忽略了这一点)。一旦将此属性设置为false,新行将永远不会添加,那么如何添加新行呢?您向基础数据源添加新行,并“有条件地”这样做,即当我在上面的CellEndEdit ebent处理程序代码中显示Quaty大于0时。yeh!我已经实现了这个解决方案,但是在这个解决方案中,我们没有任何新行,所以我们无法识别哪一行是新的。但是,尽管我已经用这个解决方案解决了我的问题,谢谢。这是解决不需要时出现的额外空行的最简单方法。