在 DataGridView 中编辑一个 TextBox 单元格,就像它是一个普通的 TextBox 一样(按下箭头时不会跳跃)

Posted

技术标签:

【中文标题】在 DataGridView 中编辑一个 TextBox 单元格,就像它是一个普通的 TextBox 一样(按下箭头时不会跳跃)【英文标题】:Edit a TextBox cell in DataGridView as if it were a normal TextBox (no jumping on pressing arrows) 【发布时间】:2012-06-19 20:22:06 【问题描述】:

我在 DataGridView 中有“多行”(自动换行)文本框列。能够像普通文本框一样编辑它们会很棒,也就是说,当我按下向下箭头时,我希望插入符号在文本框中向下一行,我不希望它跳到下一行行,像往常一样。同样,我希望按 Enter 在文本框单元格中创建一个新行,但它会完成编辑

否则说:我想覆盖某些按键(或按键)的正常行为,以便用户可以像编辑普通文本框一样编辑文本框单元格,并使用箭头在其中导航并使用 enter 创建新行。

我尝试在 DataGridView 中操作 keydown 事件,但没有成功。

感谢您的任何想法或 cmets。

【问题讨论】:

when I press down arrow, the caret goes down one line within the textbox, it does not jump to the next row - 这是预期的还是不预期的? @AngshumanAgarwal,我更改了第一段以使我的目的更清晰。感谢您指出歧义。 您看到MS-EXCEL 中的行为了吗?只需打开电子表格并尝试。 If you HIT F2 on a cell, then it goes into Editing Mode. And, to go to a new line whle editing you have to use ALT+Enter. 但是,只需按下Enterends the editing 并移动到下面的新行/单元格。所以,只是问一下——为什么要放弃标准功能? @AngshumanAgarwal Alt+Enter 也完成了编辑,这与 MS Excel 不同。标准功能对于单元格的单行内容是可以的,但是在编辑多行文本时,您无法在文本中上下移动并且无法创建新行,或者至少我不知道如何。 可以标记您自己的答案...尤其是当它有效且没有其他已发布的解决方案时.. 【参考方案1】:

This question here 向我展示了一种解决方法。代码如下:

class MyDataGridView : DataGridView


    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    
        if ((keyData == Keys.Enter) && (this.EditingControl != null))
        
            //new behaviour for Enter
            TextBox tb = (TextBox)EditingControl;
            int pos = tb.SelectionStart;
            tb.Text = tb.Text.Remove(pos, tb.SelectionLength);
            tb.Text = tb.Text.Insert(pos, Environment.NewLine);
            tb.SelectionStart = pos + Environment.NewLine.Length;
            tb.ScrollToCaret();
            //and do nothing else
            return true;
        
        else if ((keyData == Keys.Up) && (this.EditingControl != null))
        
            //programmatically move caret up
            //(look at related question to see how)
            return true;
        
        else if ((keyData == Keys.Down) && (this.EditingControl != null))
        
            //programmatically move caret down
            //(look at related question to see how)
            return true;
        
        //for the rest of the keys, proceed as normal
        return base.ProcessCmdKey(ref msg, keyData);
    

所以这是对 DataGridView 的简单更改,它可以工作。我只需要

创建这个新类,然后 将 DesignerClass 中的两行更改以使用 MyDataGridView 而不是 DataGridView(声明和初始化)

其他一切都按预期工作。

相关问题:how to programmatically move caret up and down one line.

【讨论】:

以上是关于在 DataGridView 中编辑一个 TextBox 单元格,就像它是一个普通的 TextBox 一样(按下箭头时不会跳跃)的主要内容,如果未能解决你的问题,请参考以下文章

DataGridView:编辑时更改编辑控件大小

在datagridview中编辑文本框

C#里怎样清空DataGridview中的数据

使用 c# 编辑 DataGridview 并将其保存在数据库表中

如何通过点击datagridview的一行,获得这一行中的数据?c#高手指教

在 DataGridView 中编辑一个 TextBox 单元格,就像它是一个普通的 TextBox 一样(按下箭头时不会跳跃)