在我的C#Windows Forms项目中,我有:
mycontrol (它是键盘)
myform (它是textbox和mycontrol的布局)
我想在 myform 中运行一些代码,但是按 mycontrol 中的按钮
例如:
当我在 mycontrol 中按Backspace按钮时,我只使用按钮事件
SendKeys.Send("{BACKSPACE}");
和 myform 文本框知道我按Backspace。
但是我有一些自定义按钮(功能),那些按钮应该在 myform中定义
例如在 myform 中我有:
private void btnOK_Click(object sender, EventArgs e)
{
DoSomething();
}
整个问题是 - 如何从 mycontrol
运行 myform btnOK_Click或DoSomething更新#2:
当我删除检查它是否为空时按下D0,NullReference时没有任何反应。
内部部分类myForm:BaseForms { public myForm(){ 的InitializeComponent(); ShowMyControl(); }
private void ShowMyControl(){
KeyboardControl myControl = new KeyboardControl();
myControl.KeyboardKeyPressed += new Action<string>(OnMyControlKeyPressed);
this.Controls.Add(myControl);
}
private void OnMyControlKeyPressed(string key)
{
switch (key)
{
case "D0":
MessageBox.Show("A");
break;
case "D1":
MessageBox.Show("B");
break;
default:
MessageBox.Show("C");
break;
}
}
...
}
和
public partial class KeyboardControl : UserControl
{
public event Action<string> KeyboardKeyPressed;
...
private void HandlingMouseClick1(Point PressedItem)
{
...
case Keys.D0:
if (KeyboardKeyPressed != null)
KeyboardKeyPressed("D0");
break;
}
}
答案 0 :(得分:3)
在MyForm_Load或其他任何地方(如果您动态初始化MyControl),您可以添加类似MyControl.Click += new System.KeyEventHandler(this.MyControl_Click)
的内容并放置一个名为
private void MyControl_Click(sender object, KeyEventArgs e)
{
... //Find out which key was pressed, proceed.
}
在MyForm中。引发Click事件时将调用该方法。
答案 1 :(得分:1)
使用delegate
并将其传递给第二种形式的构造函数。
public delegate void MyDelegate(Object SomeData);
您需要根据要使用的方法签名创建委托。
MyDelegate del = form1.DoSomething;
Form2 form2 = new Form2(..., del);
然后,您可以封装 form1 中的方法并将其传递给 form2 ,然后在 form2 中调用它。
public Form2(..., MyDelegate del){ }
del.Invoke();
查看代理人here。
答案 2 :(得分:1)
您的控件应该公开表单可以订阅并执行的事件。
为您的活动提供有意义的名称。如果您的控件包含“搜索”按钮并且用户单击它,请让您的控件触发一个名为SearchButtonClicked
的事件。
然后表单可以包含一个订阅SearchButtonClicked
事件的方法,然后只要用户单击“搜索”按钮就会执行该代码。
答案 3 :(得分:1)
尝试以下方法 在MyForm里面
public class MyForm : Form
{
//.ctor
MyForm() { }
private void ShowMyControl(){
MyControl myControl = new MyControl();
myControl.KeyboardKeyPressed += new Action<string>(OnMyControlKeyPressed);
this.Controls.Add(myControl);
}
private void OnMyControlKeyPressed(string key)
{
switch(key)
{
case "D0" :
DoSomething();
break;
case "D1" :
DoSomethingElse();
break;
default :
SendKeys(key);
break;
}
}
}
/*MyControl*/
namespace Keyboards
{
public class MyControl : Control
{
public event Action<string> KeyboardKeyPressed;
private void HandlingMouseClick(Point PressedItem)
{
if(KeyboardKeyPressed != null)
KeyboardKeyPressed(PressedItem.ToString());
}
}
}
答案 4 :(得分:0)
在MyControl类中添加MyForm的引用
class MyControl
{
MyForm _form=null;
MyControl(MyForm form)
{
_form=form;
}
void DoSth()
{
if(_form!=null)
_form.DoSomething();
}
}