繁体   English   中英

DataGridView TextBox 单元格编辑,将 Enter 键改为 Act Like Tab

[英]DataGridView TextBox cell Editing, Change Enter Key to Act Like Tab

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

基本上,当在编辑文本框单元格时按下 Enter 键时,我希望它像按 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];
        }
    }

这是将上述事件添加到单元格文本框的代码

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

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

如果有人知道如何从 datagridview 中正确获取“Enter”按键,请在编辑单元格时提供帮助。

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。

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

 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 获取输入之前触发。 使用这个和我修改过的数据网格视图,我能够在单元格内获取 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 事件

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

我重用了从DataGridView继承想法,但尝试直接解决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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM