2012-03-12 53 views
5

我有一个datagridview 5列,当我按下“输入”它进入下一个单元格,当它到达行的末尾时,我按下输入它添加一个新的行,但我的问题是,当我按下输入后,我移动到前面的行跳转行,并没有去下一个单元格,有什么帮助?DataGridView - 当我按下输入它去下一个单元格

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]; 
      } 
     } 
    } 
} 

回答

9

忘记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; 
     } 
    } 

请注意,我改变了代码一点,记得设置已处理的事件属性为true,否则将处理的默认行为。

干杯!

+0

雷纳尔多非常感谢你的回答,还有另外一个quastion我wanaa问你,编辑细胞,我必须按两次输入,第一次将我的数据插入单元格,第二次移动到另一个单元格,有没有办法按下一个输入它做两个工作?我的意思是,当我按下后,一个输入到下一个单元格???我问你可以解释什么是e.handled = true?谢谢 – user1264708 2012-03-13 09:00:27

+0

你可以处理dataGridView1_CellEnter事件并添加dataGridView1.BeginEdit(false); – Reinaldo 2012-03-13 15:31:10

+0

我的朋友还有另一个问题,让我想我有3行和3列,我进入一个数据到row1和column1后,我进入下一行,输入数据,当我回到row1编辑数据我按回车它跳到下一行:(它让我疯狂。我不想跳到下一行我想去下一列 – user1264708 2012-03-13 18:09:56

1

尝试使用这样的:

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

只需复制并粘贴代码。

只有你应该在你的窗体中有网格。

+0

对隐藏列不起作用,并给予异常当前单元格不能设置为不可见单元格。 – Hisham 2016-10-26 06:55:59

0

你可以做的是处理KeyDown事件来检查按下返回键,取消该事件,并告诉应用程序使用的+1所选择的指数你的datagridview:

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

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

0

使用此解决方案:

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

好运...

4

这对我的作品

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; 
     } 
    } 
+0

works,added e.handled – arvind 2015-04-10 09:30:37

0

,因为当按下datagridview的单元格这将进入该keydown envent将不会触发最好谢谢@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); 

}

0

刚刚转会权当按键是进入...

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

你应该考虑添加一个你的代码在做什么的描述,因为只是代码转储并不是特别有用。 – silentsod 2016-12-07 17:33:21

相关问题