2012-03-12 38 views
5

tôi có một datagridview với 5 cột, khi tôi nhấn "enter" nó đi đến ô tiếp theo và khi nó đến cuối hàng khi tôi nhấn enter thêm một hàng mới, nhưng vấn đề của tôi là khi tôi di chuyển đến các hàng trước sau khi tôi nhấn Enter nó nhảy các hàng và không đi đến các tế bào tiếp theo, bất kỳ trợ giúp?DataGridView-khi tôi nhấn enter nó đi đến ô kế tiếp

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

Trả lời

9

Hãy quên đi sự kiện CellEnter và sự kiện Form1_KeyPress. Chỉ cần xử lý các sự kiệndataGridView1_KeyDown như thế này:

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

Xin lưu ý rằng tôi đã thay đổi mã một chút, và nhớ để thiết lập Cầm sở hữu sự kiện là true, nếu không nó sẽ xử lý hành vi mặc định.

Chúc mừng!

+0

Reinaldo cảm ơn bạn rất nhiều vì câu trả lời của bạn, có quastion khác i wanaa hỏi bạn, để chỉnh sửa một tế bào tôi phải nhấn enter hai lần, lần đầu tiên để chèn dữ liệu của tôi vào ô và lần thứ hai để di chuyển đến ô khác, có cách nào bằng cách nhấn một lần nhập vào hai công việc không? i có nghĩa là khi tôi kết thúc nhập vào ô sau khi nhấn một nhập nó đi đến các tế bào tiếp theo ??? và tôi wanaa yêu cầu bạn có thể giải thích những gì là e.handled = true? thanks anyway – user1264708

+0

Bạn có thể xử lý sự kiện dataGridView1_CellEnter và thêm dataGridView1.BeginEdit (false); – Reinaldo

+0

bạn của tôi có vấn đề khác, cho phép tôi nghĩ 3 hàng và 3 cột, tôi nhập dữ liệu vào hàng1 và cột1 sau khi tôi chuyển sang hàng tiếp theo và nhập dữ liệu khi tôi quay lại hàng1 để chỉnh sửa dữ liệu tôi nhấn enter nó nhảy đến hàng tiếp theo: (nó làm tôi điên lên. Tôi không muốn nhảy sang hàng kế tiếp tôi muốn đến cột tiếp theo – user1264708

1

Hãy thử sử dụng này:

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

Chỉ cần sao chép và dán đoạn mã.

Chỉ điều bạn nên có lưới trong biểu mẫu của mình.

+0

không hoạt động đối với các cột ẩn, đưa ra ngoại lệ Ô hiện tại không thể được đặt thành một ô ẩn. – Hisham

0

Những gì bạn có thể làm là xử lý sự kiện KeyDown để kiểm tra xem phím Enter được nhấn, bạn hủy sự kiện này và nói với các ứng dụng để sử dụng các chỉ số được lựa chọn 1 trong datagridview của bạn:

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

Để ngăn chặn các vấn đề bạn cũng nên chèn một mệnh đề để kiểm tra xem có các mục có sẵn sau khi một người dùng nhấn trở lại.

0

Sử dụng giải pháp này:

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

Good Luck ...

4

làm việc này cho tôi

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

hoạt động, thêm e.handled – arvind

0

vì keyDown envent sẽ không cháy khi nhấn enter trên tế bào datagridview chí này hãy gửi lời cảm ơn tốt nhất tới @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

Chỉ cần di chuyển sang phải khi nhấn phím là nhập ...

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

Bạn nên xem xét việc thêm mô tả về những gì mã của bạn đang làm như chỉ một kết xuất mã không đặc biệt mang tính thông tin. – silentsod

Các vấn đề liên quan