我的Windows窗体应用程序中的datagridview有问题。 我设置AllowUserToAddRows = true,因此在用户双击最后一个空白行时,所选单元格进入编辑模式,当用户在textboxcolumn中写入内容时,会添加一个新行。
这一切都很好,但现在我想当用户编辑新行(双击)时,所有字段都填充了默认值,例如使用第一行的值,所以我在datagridview上设置了DefaultValuesNeeded事件,在后面的代码中,我填充所选行中的所有字段。
问题是,在DefaultValuesNeeded触发后,现在底部没有出现新行。
我该如何解决这个问题?
答案 0 :(得分:0)
如果你有一个DataGridView的绑定源,你可以在EndCurrentEdit()
事件处理程序中调用DefaultValuesNeeeded
来立即使用默认值提交新行。
{
dt = new DataTable();
dt.Columns.Add("Cat");
dt.Columns.Add("Dog");
dataGridView1.AllowUserToAddRows = true;
dataGridView1.DefaultValuesNeeded += dataGridView1_DefaultValuesNeeded;
dataGridView1.DataSource = dt;
}
void dataGridView1_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
{
var dgv = sender as DataGridView;
if(dgv == null)
return;
e.Row.Cells["Cat"].Value = "Meow";
e.Row.Cells["Dog"].Value = "Woof";
// This line will commit the new line to the binding source
dgv.BindingContext[dgv.DataSource].EndCurrentEdit();
}
如果您没有绑定来源,我们无法使用DefaultValuesNeeded
事件,因为它不起作用。但我们可以通过捕获CellEnter
事件来模拟它。
{
dataGridView1.Columns.Add("Cat", "Cat");
dataGridView1.Columns.Add("Dog", "Dog");
dataGridView1.AllowUserToAddRows = true;
dataGridView1.CellEnter += dataGridView1_CellEnter;
}
void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
var dgv = sender as DataGridView;
if (dgv == null)
return;
var row = dgv.Rows[e.RowIndex];
if (row.IsNewRow)
{
// Set your default values here
row.Cells["Cat"].Value = "Meow";
row.Cells["Dog"].Value = "Woof";
// Force the DGV to add the new row by marking it dirty
dgv.NotifyCurrentCellDirty(true);
}
}