簡體   English   中英

DataGridView-當我按下回車鍵時,它會轉到下一個單元格

[英]DataGridView-when I press enter it goes to the next cell

我有一個包含 5 列的 datagridview,當我按“輸入”時它會轉到下一個單元格,當我按 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];
            }
        }
    }
}

也忘記 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,否則它將處理默認行為。

干杯!

這對我有用

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

嘗試使用這個:

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

只需復制並粘貼代碼。

唯一應該在表單中包含網格的東西。

因為當在 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);

}

您可以做的是處理 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;
   }
}

為了防止出現問題,您還應該插入一個子句來檢查用戶按下回車鍵后是否有可用的項目。

使用此解決方案:

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

祝你好運 ...

只需在輸入按鍵時向右移動...

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

這段代碼對我很有效

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM