检测按下的键何时是第一个字符
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 感谢您的通知。我编辑了代码。以上是关于检测按下的键何时是第一个字符的主要内容,如果未能解决你的问题,请参考以下文章