通过KeyDown向DataGridView添加新行

时间:2016-04-05 08:17:27

标签: c# datagridview

我有一个DataGridView有4列(第3列是隐藏的)。 DataGridView在加载时已准备好进行用户输入(我添加了一行并设置了AllowUserToAddRows=false)。当用户按下Enter时,下一个单元格将被聚焦并可编辑。在第三列之后按Enter然后应插入新行。

要添加新行,我必须将已插入的数据写回datatable,因为DataGridView已经是数据绑定。

当我尝试访问插入了一些值的第一行时,它总是返回零:

enter image description here

enter image description here

如何访问第一行?谢谢!

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);

    }
}

1 个答案:

答案 0 :(得分:1)

关于设置DataGridView.DataSource,您必须了解的是:

  • 对来源所做的更改将反映在DataGridView

考虑到这一点,请考虑以下事项:

  1. 致电dtKasse.Clear();也会清除您的DataGridView.Rows
  2. DataTable中的每一行的源DataGridView添加新行将导致无限循环。
  3. 重置DataGridView.DataSource是多余的。
  4. 解决方案:在KeyDown事件中,更改内部if语句,只需向源DataTable添加新行:

    if (row == gv_Input.RowCount) 
    {
        DataRow dr = dtKasse.NewRow();
        dtKasse.Rows.Add(dr);
    }
    

    此外,您应在设置e.Handled = true后添加CurrentCell并致电BeginEdit,否则您将看到导航细胞的不良行为。