阻止Windows窗体DataGridView在按ENTER键时移动到下一行

本文关键字:一行 移动 窗体 Windows DataGridView 在按 ENTER 阻止 | 更新日期: 2023-09-27 18:24:59

我知道这个问题(或它的变体)已经出现过几次了。但到目前为止,我还没有找到一个适合我的解决方案

我正在使用包含DataGridView的C#编写一个WindowsFormsUserControl,以将员工数据的只读集合作为一种美化的选择列表。网格是只读的(在control_load上填充),并将FullRowSelect设置为选择方法。我希望用户能够双击鼠标或使用当前行上的Enter键来从该行中选择一个Id值,该Id值由订阅者拾取以在其他地方处理。

在分配所选员工值后处理KeyDown事件时,我试图阻止选择移动到下一行。这很好,除非CurrentCell.RowIndex为零时。有人知道我如何为CurrentCell.Rowindex=0工作吗?

private void dgvEmployees_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        if (dgvEmployees.CurrentRow.Cells[0].Value != null)
        {
            this.SelectedEmployeeId = (int) dgvEmployees.CurrentRow.Cells[0].Value;
            this.OnEmployeeSelected(new TestEmployeeGridListEventArgs() { 
            SelectedEmployeeId = this.SelectedEmployeeId, 
            SelectedEmployeeIdentifier = dgvEmployees.CurrentRow.Cells["Identifier"].Value.ToString() 
            });
        }
        // Prevent pressing <enter key> moving onto the next row.
        if (dgvEmployees.CurrentCell.RowIndex > 0)
        { 
            dgvEmployees.CurrentCell = dgvEmployees[1, dgvEmployees.CurrentCell.RowIndex - 1];
            dgvEmployees.CurrentRow.Selected = true;
        } 
        else
        {
            dgvEmployees.CurrentCell = dgvEmployees[1, 0];
            dgvEmployees.Rows[0].Cells[1].Selected = true;
        }           
    }
}

阻止Windows窗体DataGridView在按ENTER键时移动到下一行

感谢Reniuz的提醒。我所需要的只是设置e.Handled = truee.SuppressKeyPress = true来替换整个if (dgvEmployees.CurrentCell.RowIndex > 0)语句。

if (e.KeyCode == Keys.Enter)
{
    if (dgvEmployees.CurrentRow.Cells[0].Value != null)
    {
        this.SelectedEmployeeId = (int) dgvEmployees.CurrentRow.Cells[0].Value;
        this.OnEmployeeSelected(new TestEmployeeGridListEventArgs() { 
            SelectedEmployeeId = this.SelectedEmployeeId, 
            SelectedEmployeeIdentifier = dgvEmployees.CurrentRow.Cells["Identifier"].Value.ToString() 
        });
    }
    e.SuppressKeyPress = true;
}

试试这个。。。。它的完美工作在数据网格中查看单元格编辑事件进入然后关注下一个单元格而不是行。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
 {
 // Check if Enter is pressed //  DGV Cell Edit // dgv1 as DataGrideView
 if (keyData == Keys.Enter /* && txtledger.Text != "" */)
 {
 try       
{
   if (dgv1.CurrentCell.ColumnIndex == 18 ) 
// 18 is Column Count and focusing length
       {                       
        dgv1.CurrentCell = dgv1.Rows[dgv1.CurrentRow.Index + 1 ].Cells[1];
        return true;
       }
       else
       {
        SendKeys.Send("{Right}");  //Tab OR Right Key Ur Need
       }
     }
  catch (Exception e)
  {                    
  dgv1.Rows.Add();
  dgv1.CurrentCell = dgv1.Rows[dgv1.CurrentRow.Index].Cells[1];
  }
  return true;
  }
  return base.ProcessCmdKey(ref msg, keyData);
  }

这会很好用的。。它禁用了datagridview内部的普通回车键进程来处理单元格编辑事件,以关注同一行中的下一个单元格。如果有任何问题,请检查u r形式的所有keydown事件…