检测按下的键何时是第一个字符

Posted

技术标签:

【中文标题】检测按下的键何时是第一个字符【英文标题】:Detect when the key pressed is the first char 【发布时间】:2021-05-17 03:17:08 【问题描述】:

我已将 KeyPress 事件处理程序添加到我的 DataGridView。如果用户在单元格中按下“=”,则触发此事件。但是= 键必须是第一个字符。 如何检测按下的键是否是第一个字符?

我为此使用了此处显示的代码。我创建了一个字符串变量,名为meter。它保留最后按下的键,所以我可以从meter 的长度了解它是否是第一个字符。 它实际上是有效的,但是当用户删除密钥时,它会给出错误的结果。 有没有人给我一些建议?也许不同的解决方案?

// this keeps pressed key and makes string. 
string meter = string.Empty; 

void Control_KeyPress(object sender, KeyPressEventArgs e)

   // if the first pressed "=" key. Then meter="=". So meter length=1
   meter = meter +e.KeyChar.ToString();

   if (meter.Length == 1)
   
      //if user keypress "="
      if (e.KeyChar == '=')
      
          //do things
      
   

【问题讨论】:

Control_KeyPress 附加到哪个控件? -- 请注意,您可以使用KeyDown 事件,检查= 字符是否已经存在:如果有,则抑制键,否则,将其添加到第一个位置。我假设用户不能向这些单元格添加多个 =。您还可以在自定义 DataGridViewTextBoxColumn 中使用自定义 TextBox 或 RichTextBox 控件,并在自定义控件中添加所有逻辑。 @Jimi 你关于自定义控制的想法启发我思考文本值更改选项。 Datagridview 控件没有文本更改事件,但我从“EditingControlShowing”事件添加到单元格“textChange”事件。所以它允许我检测文本是否为空。最后它在没有添加任何自定义的情况下被修复。再次感谢。 【参考方案1】:

我不确定对 KeyPress 做出反应是否明智。如果操作员将等号按住一段时间会发生什么,以便 KeyPress 一个接一个地快速出现,或者如果操作员选择几行并按下等号会发生什么?

那么复制粘贴来粘贴等号或拖放呢?

我想你想要的是这样的:

每当操作员在编辑DataGridView的DataGridViewTextBoxCell X时,并且在编辑单元格X的EditingControl的内容时只包含等号,我想调用procedure MyProcedure(DataGridViewCell cell)

(TODO:为 MyProcedure 发明专有名称)

因此,当操作员完成对单元格的编辑时,您不希望这样做,而是希望在单元格编辑期间这样做。

为此,您需要访问DataGridViewTextBoxEditingControl Class 此对象仅在 DataGridViewTextBoxCell 类处于编辑模式时可用。您可以在操作员通过事件DataGridView.EditingControlShowing开始编辑之前访问该对象

使用视觉工作室设计器:

this.dataGridView1.EditingControlShowing += this.OnEditingControlShowing);

在事件处理程序中订阅即将显示的编辑控件的TextChanged event

private void OnEditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)

    e.Control.TextChanged += ShownEditingControl_TextChanged;

现在,只要操作员在 Cell 的编辑控件中键入内容,您就会收到通知:

private void ShownEditingControl_TextChanged(object sender, EventArgs e)

    DataGridViewTextBoxEditingControl shownEditingControl =
        (DataGridViewTextBoxEditingControl)sender;

    // Do what you want to do:
    Debug.WriteLine(shownEditingControl.Text);

如果文本仅包含等号,或者如果文本有多个以等号作为第一个字符的字符,您可以执行您想要执行的操作。

if (shownEditingControl.Text == "="

    // do what you want to do if the operator edited only the equal sign
    // for example:
    DataGridView dgv = shownEditingControl.EditingControlDataGridView;
    DataGridViewCell cell = dgv.CurrentCell;
    MyProcedure(cell);

【讨论】:

【参考方案2】:

我找到了解决办法。如果其他用户遇到类似问题,我会解释如何解决。

首先感谢@Jimi。他给了我这个想法。

我使用“EditingControlShowing”事件添加了代表单元格文本框的“cellTb”对象。因此它允许我检测文本是否为“=”。这是代码。

DataGridViewCell currentCell;
TextBox cellTb; // this represents cell textbox
private void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
       
  e.Control.KeyUp += new KeyEventHandler(Control_KeyUp);
   currentCell = this.dgv.CurrentCell;
   cellTb = (TextBox)e.Control;
  
    
                    
void Control_KeyUp(object sender, KeyEventArgs e) //  

  if (cellTb.Text == "=") // this is my check operations.
     
        if (e.KeyCode == Keys.D0)  //if user keyup "=" 
             
               //do things
              
 
      


编辑:解释

@Harald Coppoolse.Actually 是我的错,没有准确地告诉我我想要做什么。我想尝试类似的 excel 应用程序。如果用户按“=”,则他/她可以选择列,然后当按 Enter 时将显示结果。但问题是在用户按下“=”之后,选择另一个单元格会使光标离开主单元格。我之前问过这个问题。下面有一个链接。但我问的是一些难以实现的。 @JohnG.(评论者)建议我使用文本框控件。

Handle select click event datagridview

这似乎是有道理的。所以我决定使用文本框。我添加了图片以便于理解我是如何执行它的。

目前看来成功了,但不知道以后会出现什么问题。

我想谈谈你引起注意的点。

“如果运算符将等号向下保留一段时间会发生什么? 而,”

我现在尝试它返回类似“=====”的字符串。这是用户问题。

“如果操作员选择了几行并按下等号怎么办? 那么复制粘贴来粘贴等号,或者拖放呢?”

其实我从来没有想过这种情况。但是如果有条件我会试试的。

最后我会根据你的指示更改我的代码。

非常感谢您和您的时间。

【讨论】:

扮演魔鬼的拥护者。我相信您需要更仔细地测试此解决方案。由于我在代码中没有看到单元格的 KeyPress 事件处理程序被“关闭”的任何地方,我将假设它在网格等其他事件中被关闭,CellEndEdit 事件。如果代码在编辑完成后没有“为每个单元格”关闭处理程序,那么代码会将相同的事件连接到不同的单元格。因此......随着用户“编辑”越来越多不同的单元格,该事件将为每个先前编辑的单元格触发一次。 另外,你有没有测试过在线的逻辑…cellTb.Text == ""…如果单元格中有文本,这将返回false,但是,如果文本被选中并且用户“替换”选择的文本带有一个“=”字符,这个逻辑就中断了。此逻辑仅查找文本,而不考虑可能选择的内容。当单元格中已有文本并用单个“=”字符“替换”文本时,您是否对此进行了测试? 最后,如果您想“验证”用户在单元格中键入的文本,当用户尝试“离开”单元格时检查这一点可能比检查每个按键按下时更容易.检查按键将涉及退格、选择、插入和粘贴文本以及“编辑”单元格中文本的其他可能方式。恕我直言,让用户做他们想做的事,并在他们尝试离开单元格时检查结果。 @JohnG 感谢您的通知。我编辑了代码。

以上是关于检测按下的键何时是第一个字符的主要内容,如果未能解决你的问题,请参考以下文章

控制台检查按下的键,就像在 monogame 中一样

如何检测按下的鼠标何时进入不同框架中的小部件

如何检测当前按下的键?

我试图检测某个被按下的键(Python)

在 mfc 应用程序中捕获键盘上按下的键

如何检查在VB中按下的键