当用户按下C#中DataGridView的最后一列时,如何添加新行

时间:2016-12-07 12:51:28

标签: c# datagridview

  • 当用户在DataGridView的最后一栏按Enter键时,如何跳转到下一行?

  • 此代码也给我一个我需要解决的错误:

      

    索引超出范围必须是非负且小于的大小   集合。

    private void DataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        try
        {
            if (e.KeyCode == Keys.Enter)
            {
                e.SuppressKeyPress = true;
                int iColumn = DataGridView1.CurrentCell.ColumnIndex;
                int iRow = DataGridView1.CurrentCell.RowIndex;
                if (iColumn >= DataGridView1.Columns.Count - 2)
                    DataGridView1.CurrentCell = DataGridView1[0, iRow + 1];
                else
                    DataGridView1.CurrentCell = DataGridView1[iColumn + 1, iRow];
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString())
        }
    }
    

1 个答案:

答案 0 :(得分:0)

您可以使用# THIS DOES NOT WORK library(mlr) # Here I would import results from my experiments instead of using random data # e.g. scores for 5 classifiers and 30 data sets, each results = data.frame(replicate(5, runif(30, 0, 1))) # This is the functionality I'm looking for bmr = benchmarkResultFromDataFrame(results) cd = generateCritDifferencesData(bmr) plotCritDifferences(cd) 处理此问题,但是您会错过用户在编辑单元格时点击 Enter 的情况。要捕获所有案例,请从DataGridView.KeyDown派生您自己的类并覆盖DataGridView。使用上面注释中建议的逻辑,当检测到最后一行的 Enter 时,添加另一行。不要担心手动更改ProcessCmdKey。让基类自己处理它。

CurrentCell

您只需注意 添加新行的方式,具体取决于您的public class MyDataGridView : DataGridView { protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { bool enterKeyDetected = keyData == Keys.Enter; bool isLastRow = this.CurrentCell.RowIndex == this.RowCount - 1; if (enterKeyDetected && isLastRow) { Console.WriteLine("Enter detected on {0},{1}", this.CurrentCell.RowIndex, this.CurrentCell.ColumnIndex); // Add the new row. } return base.ProcessCmdKey(ref msg, keyData); } }

  • DataSource
  • A this.Rows.Add();

    DataTable
  • A DataTable dt = (DataTable)this.DataSource; dt.Rows.Add(); (请参阅List vs BindingList

    BindingList<T>

最后,只需将BindingList<T> bl= (BindingList<T>)this.DataSource; bl.Add(new T()); 的实例替换为此自定义实例。

所有这一切,如果您没有DataGridView,只需设置DataSource即可,因为编辑DataGridView.AllowUserToAddRows = true会触发另一个添加。