【问题标题】:How to move focus on next cell in a datagridview on Enter key press event如何在 Enter 按键事件上将焦点移到 datagridview 中的下一个单元格
【发布时间】:2012-03-12 12:03:11
【问题描述】:

朋友们,我正在使用 C# 开发 Windows 应用程序。我正在使用 datagridview 来显示记录。我需要的功能是当我按下“Enter”键时,焦点应该转到下一个单元格(同一行的列)。如果它是网格中的最后一列,那么焦点应该转到下一行的第一列。我已经尝试过使用

    SendKeys.Send("{Tab}")

在 datagridview1_KeyDown 和 datagridview1_KeyPress 事件中。但焦点是斜向下移动。请帮我解决这个问题。

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:
    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        e.SuppressKeyPress = true;
        int iColumn = dataGridView1.CurrentCell.ColumnIndex;
        int iRow = dataGridView1.CurrentCell.RowIndex;
        if (iColumn == dataGridView1.Columncount-1)
        {
            if (dataGridView1.RowCount > (iRow + 1))
            {
                dataGridView1.CurrentCell = dataGridView1[1, iRow + 1];
            }
            else
            {
                //focus next control
            }
        }
        else
            dataGridView1.CurrentCell = dataGridView1[iColumn + 1, iRow];
    }
    

    【讨论】:

    • 它在工作,但不是 100%。当第一次填充网格时,我选择第一个单元格。然后按“Enter”,现在焦点转到第二行(虽然我有 4 列)。并且在到达最后一个单元格(最后一行,最后一列)之后,它给出的错误是“索引超出范围”..
    • 是的..我知道..当时我很安静很匆忙。所以我没有完成那个..你也可以在到达最后一行时编写代码,然后如果你需要创建一个新行,你可以创建然后
    • 我在第一天就接受了你的回答。你的两个解决方案都帮助我解决了我的问题。所以第二天我也接受了 Amrit 的回答。我不能接受超过 1 个答案吗?
    【解决方案2】:
    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
    {
        int icolumn = dataGridView1.CurrentCell.ColumnIndex;
        int irow = dataGridView1.CurrentCell.RowIndex;
    
        if (keyData == Keys.Enter)
        {                                
            if (icolumn == dataGridView1.Columns.Count - 1)
            {
                dataGridView1.Rows.Add();
                dataGridView1.CurrentCell = dataGridView1[0, irow + 1];
            }
            else
            {
                dataGridView1.CurrentCell = dataGridView1[icolumn + 1, irow];
            }
            return true;
        }
        else
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }
    

    【讨论】:

    • 当 UI 上有一个文本框,datagridview 旁边,当你在文本框上按 Enter 时,它也会执行。
    【解决方案3】:

    您可以使用 datagridview 的 selectionchanged 事件。 在你的表格中

           private DataGridViewCell _celWasEndEdit;
    
            private void datagridview_SelectionChanged(object sender, EventArgs e)
        {
    
            if (MouseButtons != 0) return;
    
            if (_celWasEndEdit != null && datagridview.CurrentCell != null)
            {
                // if we are currently in the next line of last edit cell
                if (datagridview.CurrentCell.RowIndex == _celWasEndEdit.RowIndex + 1 &&
                    datagridview.CurrentCell.ColumnIndex == _celWasEndEdit.ColumnIndex)
                {
                    int iColNew;
                    int iRowNew = 0;
                    if (_celWasEndEdit.ColumnIndex >= datagridview.ColumnCount - 1)
                    {
                        iColNew = 0;
                        iRowNew = dgvItems.CurrentCell.RowIndex;                   
                    }
                    else
                    {
                            iColNew = _celWasEndEdit.ColumnIndex + 1;
                            iRowNew = _celWasEndEdit.RowIndex;
                    }
                    datagridview.CurrentCell = datagridview[iColNew, iRowNew];
                }
            }
            _celWasEndEdit = null;
          }
    
        private void datagridview_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            _celWasEndEdit = dgvItems[e.ColumnIndex, e.RowIndex];
        }
    

    【讨论】:

    • 它只是一个变量,用于跟踪正在编辑的单元格
    • 私有 DataGridViewCell _celWasEndEdit;我已经写在上面的解决方案中
    • 如果不进行编辑,我想将焦点从一个单元格水平移动到下一个单元格。我该怎么做?
    • 我已经用了很多次了,我重新检查了我们能做什么
    • 'MouseButtons',不错的关键字。
    【解决方案4】:
    bool notlastColumn =true; //class level variable--- to check either last column is reached or not
    
    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if (dataGridView1.ColumnCount - 1 == e.ColumnIndex)  //if last column
        {
            KeyEventArgs forKeyDown = new KeyEventArgs(Keys.Enter);
            notlastColumn = false;
            dataGridView1_KeyDown(dataGridView1, forKeyDown);
        }
        else
        {
            SendKeys.Send("{up}");
            SendKeys.Send("{right}");
        }
    }
    
    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter && notlastColumn) //if not last column move to nex
        {
            SendKeys.Send("{up}");
            SendKeys.Send("{right}");
        }
        else if (e.KeyCode == Keys.Enter)
        {
            SendKeys.Send("{home}");//go to first column
            notlastColumn = true;
        }
    }
    

    【讨论】:

      【解决方案5】:

      即使我尝试的代码将焦点移到下一个单元格,当单元格处于编辑模式时,它们会影响鼠标单击。 这就是我最终想到的。

          bool _dgv_list_cellEndEdit = false; // class level variable
      
          void dataGridView1_KeyDown(object sender, KeyEventArgs e)
          {
              if (e.KeyData == Keys.Enter)
              {
                  e.SuppressKeyPress=true;
                  SendKeys.Send("{Tab}");
              }
          }
      
          void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
          {
              _dgv_list_cellEndEdit=true;
          }
      
          void dataGridView1_MouseDown(object sender, MouseEventArgs e)
          {
              _dgv_list_cellEndEdit=false;
          }
      
          void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
          {
              if(_dgv_list_cellEndEdit)
              {
                  _dgv_list_cellEndEdit=false;
                  SendKeys.Send("{Up}");
                  SendKeys.Send("{Tab}");
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2012-05-11
        • 2017-05-08
        • 1970-01-01
        • 1970-01-01
        • 2019-12-13
        • 2023-03-27
        • 2019-11-04
        • 2023-02-15
        • 1970-01-01
        相关资源
        最近更新 更多