У меня проблема с datagridview в приложении для Windows. Я устанавливаю AllowUserToAddRows = true, поэтому при двойном щелчке мышью на последних пустых строках выбранная ячейка переходит в режим редактирования, и когда пользователь пишет что-то в текстовой колонке, добавляется новая строка.
Это нормально, но теперь я бы это сделал, когда новая строка редактируется пользователем (двойной щелчок), все поля заполняются значениями по умолчанию, например, используя значения из первой строки, поэтому я устанавливаю событие DefaultValuesNeeded на моем datagridview и в коде Я заполняю все поле в выбранной строке.
Проблема в том, что теперь ни одна новая строка не появляется внизу после DefaultValuesNeeded fire.
Как я могу решить эту проблему?
Если у вас есть источник привязки к вашему DataGridView, вы можете вызвать EndCurrentEdit()
в DefaultValuesNeeeded
события 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);
}
}