代码之家  ›  专栏  ›  技术社区  ›  lc.

在进入编辑模式时捕获第一个字符-DataGridView中的自定义编辑控件

  •  4
  • lc.  · 技术社区  · 16 年前

    我正在托管一个自定义编辑控件 DataGridView ,据记录,这是 TextBox Button 一起在a UserControl 我继承了 DataGridViewColumn 对于新专栏和 DataGridViewTextBoxCell 对于新的细胞。

    与正常 ├文本框单元格 ,如果在单元格有焦点时按某个键,它将开始编辑模式 您键入的字符将出现在 TextBoxEditingControl 然而,在我继承的单元格中,按键时没有传递任何值。(事实上,您必须手动将当前单元格值传入 InitializeEditingControl 否则什么都不会出现。)因此,您键入的第一个字符(开始编辑模式的字符)将丢失。

    我试过了 OnKeyPress , OnKeyDown ,以及 OnKeyUp DataGridViewCell 但他们从未接到过电话。 KeyEntersEditMode 然而,它似乎确实会被调用,而且只有在检查按键时才会被调用,所以这可能是一个很好的起点。问题就变成了如何将Key_INFO转换为 char 这对于字母表和数字来说是微不足道的,但由于并非所有键盘都是平等的,处理其他按键充其量是混乱和复杂的。如果有一个转换器类可以自动完成这项工作,请告诉我。

    其他人是否遇到过这个问题或找到了一个好的解决方法?

    注意:此问题适用于以下情况 EditMode 设置为以下任何变化 EditOnKeystroke .设置为 EditOnEnter 对于我的项目来说,这是一个有效的解决方法,但我想模拟 文本框编辑控件 也。

    4 回复  |  直到 16 年前
        1
  •  1
  •   bobbyalex    16 年前

    尝试将用户控件的KeyPreview设置为true。然后检查启动编辑过程的键是否会触发用户控件的向下键。如果是这样,一旦文本控件进入编辑模式,您就可以简单地存储和分配字符。

        2
  •  1
  •   Stefan Schönbächler    16 年前

    我的解决方案是覆盖 OnKeyPress 论风俗 UserControl .

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
      _textBox.Text = e.KeyChar.ToString();
      _textBox.SelectionStart = 1;
      _textBox.SelectionLength = 0;
      base.OnKeyPress(e);
    }
    
        3
  •  0
  •   bodziec    14 年前

    嗨 今天我也遇到了同样的问题。我的解决方案是覆盖CustomCell中的KeyEntersEditMode,并在其中放置一些算法来转换或确定字符是否可以传递给编辑控件。然后,我将此值存储为私有变量。我重写InitializeEditingControl方法,并使用我存储的值作为控件的初始值。使用它后,我将其设置为null,这样以后就不会使用它了。

    
    private string startString;
    public override bool KeyEntersEditMode(KeyEventArgs e)
    {
        var result = base.KeyEntersEditMode(e);
        if (e.KeyData == Keys.D1)
        {
            startString = "1";
        }
        return result;
    }
    
    public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        if(startString != null)
        {
            initialFormattedValue = startString;
            startString = null;
        }
        base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
        var c = this.DataGridView.EditingControl as MyEditingControl;
        string initialFormattedValueStr = initialFormattedValue as string;
        if (initialFormattedValueStr == null)
        {
            c.Text = string.Empty;
        }
        else
        {
            c.Text = initialFormattedValueStr;
            c.SelectionStart = initialFormattedValueStr.Length;
        }
    
    }
    
        4
  •  0
  •   Uwe Keim    13 年前

    要获取TextBox中的第一个字符,请执行以下操作:

    1) 添加“ImportsSystem.Runtime.InteropaServices”或使用C#

    2) 将映射添加到user32.dll中的SendMessage

    VB.Net example:
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    End Function
    
    C# example:
    [DllImport("USER32.DLL", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
    

    3) 将密钥从UserControl重定向到TextBox

    Protected Overrides Function ProcessKeyEventArgs(ByRef m As System.Windows.Forms.Message) As Boolean
        SendMessage(Me.ComboBox.Handle, m.Msg, m.WParam, m.LParam)
        Return True
    End Function
    
    protected override bool ProcessKeyEventArgs(ref Message m)
    {
        SendMessage(textBox.Handle, m.Msg, m.WParam, m.LParam);
        return true;
    }
    

    4) 有 example on Microsoft page with the DataGridViewNumericUpDown here ,下载源代码。

    5) 完成。

    推荐文章