DataGridView TextBox单元格编辑,更改输入键以执行类似标签

时间:2016-10-30 01:53:37

标签: c# datagridview

我正在重新提出这个问题,因为我现在有一些代码可以解决我的问题(我删除了旧的问题)。

基本上在编辑文本框单元格时按下回车键时,我希望它像Tab键一样(当前行中的下一列而不是下一行相同的列)。

我的问题是到目前为止我所尝试的大部分内容都不起作用,但这是我目前尝试的解决方案。

此代码应该更改正在编辑/选择的单元格。

    private void PreTranslateDGV_KeyPressEvent(object sender, KeyEventArgs e)
    {
        DataGridViewTextBoxEditingControl a = (DataGridViewTextBoxEditingControl) sender;
        //a.PreviewKeyDown -= PreviewKeyDownEventHandler (dataGridView1_PreviewKeyDown)
        MyDataGridView s = (MyDataGridView) a.EditingControlDataGridView;
        if (e.KeyCode == Keys.Enter)
        {
            e.SuppressKeyPress = true;
            int newRow;
            int newColumn;
            if (s.CurrentCell.ColumnIndex == s.ColumnCount - 1)         // it's a last column, move to next row;
            {
                newRow = s.CurrentCell.RowIndex + 1;
                newColumn = 0;

                if (newRow == s.RowCount)
                    return; // ADD new row or RETURN (depends of your purposes..)
            }
            else                // just change current column. row is same
            {
                newRow = s.CurrentCell.RowIndex;
                newColumn = s.CurrentCell.ColumnIndex + 1;
            }

            s.CurrentCell = s.Rows[newRow].Cells[newColumn];
        }
    }

这是将Above事件添加到Cell的文本框

的代码
private void PreTranslateDGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)e.Control;
        tb.KeyDown += new KeyEventHandler (PreTranslateDGV_KeyPressEvent);
    }

这大部分是我从StackOverflow中找到的代码,因为我一直试图让它工作一段时间。

如果有人知道如何从数据网格视图中正确获取“输入”键盘,请在编辑单元格时提供帮助。

PS:我在MSDN论坛上阅读(丢失的链接)当编辑文本框单元格时,按Enter键时停止编辑。这可以解释为什么我上面的代码不会触发Enter,但它触发其他所有内容。

我现在试图通过覆盖processcmdkey

来做到这一点
    class MyDataGridView : KryptonDataGridView
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if ((keyData == Keys.Enter) && (this.EditingControl != null))
        {
            return false;
        }
        //for the rest of the keys, proceed as normal
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

但不管我似乎返回什么,Enter键都不会传递给KeyPressEvent。

2 个答案:

答案 0 :(得分:1)

经过多次,烦人的麻烦。这是我目前使用的解决方案:

 private void PreTranslateDGV_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        DataGridViewTextBoxEditingControl a = (DataGridViewTextBoxEditingControl) sender;
        //a.PreviewKeyDown -= PreviewKeyDownEventHandler (dataGridView1_PreviewKeyDown)
        MyDataGridView s = (MyDataGridView) a.EditingControlDataGridView;
        if (e.KeyCode == Keys.Enter)
        {
            int newRow;
            int newColumn;
            if (s.CurrentCell.ColumnIndex == s.ColumnCount - 1)         // it's a last column, move to next row;
            {
                newRow = s.CurrentCell.RowIndex + 1;
                newColumn = 0;

                if (newRow == s.RowCount)
                    s.Rows.Add(1); // ADD new row or RETURN (depends of your purposes..)
            }
            else                // just change current column. row is same
            {
                newRow = s.CurrentCell.RowIndex;
                newColumn = s.CurrentCell.ColumnIndex + 1;
            }
            s.CurrentCell = s.Rows[newRow].Cells[newColumn];
        }
    }
    private void PreTranslateDGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)e.Control;
        tb.PreviewKeyDown -= PreTranslateDGV_PreviewKeyDown;
        tb.PreviewKeyDown += PreTranslateDGV_PreviewKeyDown;

        //e.Control.KeyDown += new KeyEventHandler(PreTranslateDGV_KeyPressEvent);
    }

我将KeyPressEvent更改为PreviewKeyDown事件。在ProcessCmdKey获取输入之前触发。使用这个和我修改过的datagridview,我可以在单元格内部获取Enter键以像Tab一样。

   class MyDataGridView : KryptonDataGridView
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if ((keyData == Keys.Enter) && (this.EditingControl != null))
        {
            return true;
        }
        //for the rest of the keys, proceed as normal
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

当给ProcessCmdKey输入密钥时,它立即返回" true"说明它已被处理。它是由PreviewkeyDown事件

所拥有的

希望这有助于其他人。我不确定有多少其他方法可以做到这一点,但这种方法对我有用。

答案 1 :(得分:0)

我重用了DataGridView中的idea of inheriting,但是尝试直接解决ProcessCmdKey覆盖中的任务。

class PerfectDataGridView : DataGridView {
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if ((keyData == Keys.Enter) &&
            (EditingControl != null) &&
            (CurrentCell.RowIndex == RowCount - 1)) {

            SendKeys.Send("{TAB}");
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
}