【问题标题】:DataGridView-when I press enter it goes to the next cellDataGridView-当我按下回车键时它转到下一个单元格
【发布时间】:2012-03-12 20:10:51
【问题描述】:

我有一个 5 列的 datagridview,当我按“enter”时,它会转到下一个单元格,当我按 enter 时它到达行尾时,它会添加一个新行,但我的问题是当我移动时按回车键后到前一行,它会跳转行并且不会转到下一个单元格,有什么帮助吗?

public partial class Form1 : Form
{
    public static int Col;
    public static int Row;

    public Form1()
    {
        InitializeComponent();
    }       

    private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.AllowUserToAddRows = false;
        dataGridView1.Rows.Add();           
    }   

    private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
    {           
        Col = dataGridView1.CurrentCellAddress.X;        
        Row = dataGridView1.CurrentCellAddress.Y;     
    }

    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {            
        if (e.KeyChar == (int)Keys.Enter)
        {              
            if (Col + 1 < 5)
            {
                dataGridView1.CurrentCell = dataGridView1[Col + 1, Row];
            }
            else
            {                        
                dataGridView1.Rows.Add();
                dataGridView1.CurrentCell = dataGridView1[Col - 4, Row + 1];
            }
        }
    }
}

【问题讨论】:

    标签: c# winforms ado.net


    【解决方案1】:

    忘记 CellEnter 事件和 Form1_KeyPress 事件。只需像这样处理 dataGridView1_KeyDown 事件:

        private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Enter)
            {
                int col = dataGridView1.CurrentCell.ColumnIndex;
                int row = dataGridView1.CurrentCell.RowIndex;
    
                if (col < dataGridView1.ColumnCount - 1)
                {
                    col ++;
                }
                else
                {
                    col = 0;
                    row++;
                }
    
                if (row == dataGridView1.RowCount)
                    dataGridView1.Rows.Add();
    
                dataGridView1.CurrentCell = dataGridView1[col, row];
                e.Handled = true;
            }
        }
    

    请注意我对代码做了一点改动,记得把Handled事件属性设置为true,否则会处理默认行为。

    干杯!

    【讨论】:

    • Reinaldo 非常感谢您的回答,还有一个问题我想问您,编辑单元格我必须按两次 Enter,第一次将我的数据插入单元格,第二次移动到另一个单元格,有什么办法可以通过按一个输入来完成两项工作?我的意思是当我在按一个输入后结束输入一个单元格时,它会进入下一个单元格???我想问你可以解释一下 e.handled=true 是什么?还是谢谢
    • 可以处理dataGridView1_CellEnter事件并添加dataGridView1.BeginEdit(false);
    • 我的朋友还有一个问题,假设我有 3 行和 3 列,我在进入下一行后将数据输入到 row1 和 column1,当我回到 row1 时输入数据编辑数据我按回车键跳到下一行:(这让我发疯了。我不想跳到下一行我想跳到下一列
    • 是的,这是默认行为。要解决这个问题,请像这样覆盖表单中的 ProcessCmdKey: protected override bool ProcessCmdKey(ref System.Windows.Forms.Message m, System.Windows.Forms.Keys k) { if (m.Msg == 256 && k == System.Windows.Forms.Keys.Enter) { dataGridView1.EndEdit(); } 返回 base.ProcessCmdKey(ref m, k); }
    • 我的朋友非常感谢,你能帮我解释一下这个 ovverride 方法有什么作用吗??
    【解决方案2】:

    这对我有用

    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Enter)
            {                
                e.SuppressKeyPress = true;
                int row = dataGridView1.CurrentRow.Index;
                int col = dataGridView1.CurrentCell.ColumnIndex;
            }
        }
    

    【讨论】:

      【解决方案3】:

      试试这个:

      bool notlastColumn = true;
      
      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;
          int i = irow;
          if (keyData == Keys.Enter)
          {
              if (icolumn == dataGridView1.Columns.Count - 1)
              {
                   //dataGridView1.Rows.Add();
                  if (notlastColumn == true)
                  {
                      dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[0];
                  }
                  dataGridView1.CurrentCell = dataGridView1[0, irow + 1];
               }
              else
              {
                  dataGridView1.CurrentCell = dataGridView1[icolumn + 1, irow];
              }
              return true;
          }
          else
              if (keyData == Keys.Escape)
              {
                  this.Close();
                  return true;
              }
          //below is for escape key return
          return base.ProcessCmdKey(ref msg, keyData);
          //below is for enter key return 
          return base.ProcessCmdKey(ref msg, keyData);     
      }
      

      只需复制并粘贴代码。

      你的表单中唯一应该有网格的东西。

      【讨论】:

      • 不适用于隐藏列,给出异常当前单元格不能设置为不可见单元格。
      【解决方案4】:

      因为在 datagridview 单元格上按 enter 时不会触发 keyDown 事件,这最好感谢@Nagarjun

      bool notlastColumn = true;
      
      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;
      int i = irow;
      if (keyData == Keys.Enter)
      {
          if (icolumn == dataGridView1.Columns.Count - 1)
          {
               //dataGridView1.Rows.Add();
              if (notlastColumn == true)
              {
                  dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[0];
              }
              dataGridView1.CurrentCell = dataGridView1[0, irow + 1];
           }
          else
          {
              // to pass hidden cell, because will fire exception
              //exception: Current cell cannot be set to an invisible cell
              // the do while loop will enable you to pass any hidden cell
               do
                {
                  icolumn++;
                } while (!dgv[icolumn, irow].Visible);
              dataGridView1.CurrentCell = dataGridView1[icolumn, irow];
          }
          return true;
      }
      else
          if (keyData == Keys.Escape)
          {
              this.Close();
              return true;
          }
      //below is for escape key return
      return base.ProcessCmdKey(ref msg, keyData);
      

      }

      【讨论】:

        【解决方案5】:

        您可以做的是处理 KeyDown 事件以检查是否按下了返回键,然后取消该事件并告诉应用程序在您的 datagridview 中使用 +1 的选定索引:

        private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
        {
           if (e.KeyData == Keys.Enter)
           {
              int column = dataGridView1.CurrentCell.ColumnIndex;
              int row = dataGridView1.CurrentCell.RowIndex;
              dataGridView1.CurrentCell = dataGridView1[column, row+1];
              e.Handled=true;
           }
        }
        

        为了防止出现问题,您还应该插入一个子句来检查用户按下返回后是否有可用的项目。

        【讨论】:

          【解决方案6】:

          使用此解决方案:

          private void Form1_Load(object sender, EventArgs e)
              {
                  dtg.AllowUserToAddRows = false;
              }
          protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
              {
                  int iCol = dtg.CurrentCell.ColumnIndex;
                  int iRow = dtg.CurrentCell.RowIndex;
          
                  if (keyData == Keys.Enter)
                  {
                      if (iCol == dtg.ColumnCount - 1)
                      {
                          if (iRow + 1 == dtg.RowCount)
                          {
                              dtg.Rows.Add();
                          }
          
                          dtg.CurrentCell = dtg[0, iRow + 1];
                      }
                      else
                      {
                          dtg.CurrentCell = dtg[iCol + 1, iRow];
                      }
                      return true;
                  }
                  else if (keyData == Keys.Escape)
                  {
                      Close();
                      return true;
                  }
                  return base.ProcessCmdKey(ref msg, keyData);
              }
          

          祝你好运...

          【讨论】:

            【解决方案7】:

            输入按键时向右移动...

            private void datagridview_KeyDown(object sender, KeyEventArgs e)        
            {   
                 if (e.KeyCode == Keys.Enter)
                 {
                      SendKeys.Send("{Right}");
                 }
            }
            

            【讨论】:

            • 您应该考虑添加对您的代码正在执行的操作的描述,因为只是代码转储并不能提供特别丰富的信息。
            【解决方案8】:

            这段代码对我很有效

             bool notlastColumn = true;
            
                protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
                {
                    int icolumn = dgvReceDet.CurrentCell.ColumnIndex;
                    int irow = dgvReceDet.CurrentCell.RowIndex;
                    int i = irow;
                    if (keyData == Keys.Enter)
                    {
                        if (icolumn == dgvReceDet.Columns.Count - 1)
                        {
                            //dataGridView1.Rows.Add();
                            if (notlastColumn == true)
                            {
                                dgvReceDet.CurrentCell = dgvReceDet.Rows[i].Cells[0];
                            }
                            dgvReceDet.CurrentCell = dgvReceDet[0, irow + 1];
                        }
                        else
                        {
                            // to pass hidden cell, because will fire exception
                            //exception: Current cell cannot be set to an invisible cell
                            // the do while loop will enable you to pass any hidden cell
                            do
                            {
                                icolumn++;
                            }
                            while (icolumn <= dgvReceDet.Columns.Count - 1 && !dgvReceDet[icolumn, irow].Visible);
                            if (icolumn <= dgvReceDet.Columns.Count - 1)
                            {
                                dgvReceDet.CurrentCell = dgvReceDet[icolumn, irow];
                            }
                            else
                            {
                                SendKeys.Send("{DOWN}");
                                SendKeys.Send("{HOME}");
                            }
            
                        }
                        return true;
                    }
                    else
                        if (keyData == Keys.Escape)
                    {
                        this.Close();
                        return true;
                    }
                    //below is for escape key return
                    return base.ProcessCmdKey(ref msg, keyData);
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-12-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-01-09
              • 2012-06-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多