我已经制作了一个自定义数字键盘控件,我希望将其置于我的winform应用程序中。所有按钮都有一个OnClick
事件,可以将值发送到我放置自定义控件的表单中的聚焦文本框。像这样:
private void btnNum1_Click(object sender, EventArgs e)
{
if (focusedCtrl != null && focusedCtrl is TextBox)
{
focusedCtrl.Focus();
SendKeys.Send("1");
}
}
focusedCtrl
应该设置在按钮的MouseDown
事件上,如下所示:
private void btnNum1_MouseDown(object sender, EventArgs e)
{
focusedCtrl = this.ActiveControl;
}
其中this.ActiveControl
表示表单上的活动控件。
我的问题是,在事件检测到之前的聚焦控件之前,按钮始终会获得焦点。在按钮获得焦点之前,如何检测哪个控件具有焦点?还有其他我应该使用的活动吗?提前谢谢!
编辑:另外,我宁愿不在表单中的每个文本框上使用GotFocus
事件来设置focusedCtrl
,因为这可能很乏味,因为我想拥有所有编码我的自定义控件是在控件本身而不是放在它的表单上。 (但是,如果没有其他实际的方法可以做我要求的事情,我会这样做)
答案 0 :(得分:2)
您的要求是不明智的,您需要某种保证,您的按钮不会将文本戳到不适当的地方。你确实需要让表格合作,只知道哪些地方合适。
但这并非不可能,您可以在将输入事件发送到具有焦点的控件之前嗅探输入事件。换句话说,记录哪个控件在聚焦事件之前具有焦点。使用IMessageFilter接口可以在Winforms中实现。
在项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具箱顶部拖放到表单上,替换现有按钮。
using System;
using System.Windows.Forms;
class CalculatorButton : Button, IMessageFilter {
public string Digit { get; set; }
protected override void OnClick(EventArgs e) {
var box = lastFocused as TextBoxBase;
if (box != null) {
box.AppendText(this.Digit);
box.SelectionStart = box.Text.Length;
box.Focus();
}
base.OnClick(e);
}
protected override void OnHandleCreated(EventArgs e) {
if (!this.DesignMode) Application.AddMessageFilter(this);
base.OnHandleCreated(e);
}
protected override void OnHandleDestroyed(EventArgs e) {
Application.RemoveMessageFilter(this);
base.OnHandleDestroyed(e);
}
bool IMessageFilter.PreFilterMessage(ref Message m) {
var focused = this.FindForm().ActiveControl;
if (focused != null && focused.GetType() != this.GetType()) lastFocused = focused;
return false;
}
private Control lastFocused;
}
答案 1 :(得分:1)
Control focusedCtrl;
//Enter event handler for all your TextBoxes
private void TextBoxesEnter(object sender, EventArgs e){
focusedCtrl = sender as TextBox;
}
//Click event handler for your btnNum1
private void btnNum1_Click(object sender, EventArgs e)
{
if (focusedCtrl != null){
focusedCtrl.Focus();
SendKeys.Send("1");
}
}
答案 2 :(得分:1)
你有一个名为lostFocus的事件你可以使用
button1.LostFocus +=new EventHandler(dataGridView1_LostFocus);
并且在事件中:
Control lastFocused;
void dataGridView1_LostFocus(object sender, EventArgs e)
{
lastFocused = sender as Control;
}
通过这种方式,您可以随时了解以前关注的控件是什么
现在,如果我错了,请纠正我,但是你要SendKeys.Send("1");
知道哪个textBox
需要接收该号码。为此,您可以使用GotFocus
事件并仅向其注册textBox
。
您也可以执行Windows正在执行的操作,并且只使用一个文本框,如下所示:
如果它符合您的需求
答案 3 :(得分:0)