我有一个DataGridView
有4列(第3列是隐藏的)。 DataGridView
在加载时已准备好进行用户输入(我添加了一行并设置了AllowUserToAddRows=false)
。当用户按下Enter
时,下一个单元格将被聚焦并可编辑。在第三列之后按Enter
然后应插入新行。
要添加新行,我必须将已插入的数据写回datatable
,因为DataGridView
已经是数据绑定。
当我尝试访问插入了一些值的第一行时,它总是返回零:
如何访问第一行?谢谢!
Datatable
的代码:
dtKasse.Columns.Add("Nummer");
dtKasse.Columns.Add("Unternummer");
dtKasse.Columns.Add("Betrag");
dtKasse.Columns.Add("Datum");
dtKasse.Rows.Add("", "", "", DateTime.Now.ToShortTimeString());
gv_Input.AllowUserToAddRows = false;
gv_Input.DataSource = dtKasse;
DataGridViewCell cell = gv_Input.Rows[0].Cells[0];
gv_Input.CurrentCell = cell;
gv_Input.BeginEdit(true);
隐藏第三栏:
private void gv_Input_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
gv_Input.Columns[3].Visible = false;
}
按Enter
:
private void gv_Input_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Enter)
{
int col = gv_Input.CurrentCell.ColumnIndex;
int row = gv_Input.CurrentCell.RowIndex;
if (col < 2)
{
col++;
}
else
{
col = 0;
row++;
}
if (row == gv_Input.RowCount)
{
dtKasse.Clear();
foreach (DataGridViewRow dgr in gv_Input.Rows)
{
dtKasse.Rows.Add(dgr.Cells[0].Value, dgr.Cells[1].Value, dgr.Cells[2].Value, dgr.Cells[3].Value);
}
DataRow dr = dtKasse.NewRow();
dtKasse.Rows.Add(dr);
gv_Input.DataSource = dtKasse;
}
DataGridViewCell cell = gv_Input.Rows[row].Cells[col];
gv_Input.CurrentCell = cell;
gv_Input.BeginEdit(true);
}
}
答案 0 :(得分:1)
关于设置DataGridView.DataSource
,您必须了解的是:
DataGridView
。考虑到这一点,请考虑以下事项:
dtKasse.Clear();
也会清除您的DataGridView.Rows
。DataTable
中的每一行的源DataGridView
添加新行将导致无限循环。DataGridView.DataSource
是多余的。 解决方案:在KeyDown
事件中,更改内部if语句,只需向源DataTable
添加新行:
if (row == gv_Input.RowCount)
{
DataRow dr = dtKasse.NewRow();
dtKasse.Rows.Add(dr);
}
此外,您应在设置e.Handled = true
后添加CurrentCell
并致电BeginEdit
,否则您将看到导航细胞的不良行为。