Windows窗体-在窗体和控件之间传递参数
本文关键字:窗体 参数 之间 Windows 控件 | 更新日期: 2023-09-27 18:06:00
在我的c# Windows窗体项目中,我有:
-
mycontrol (键盘)
-
myform(它是文本框和mycontrol的布局)
我想运行一些代码,这是在myform,但通过按按钮在mycontrol)
例如:当我在mycontrol中按退格键时,我只使用button Event
SendKeys.Send("{BACKSPACE}");
和myform文本框知道我按了退格键。
但是我有一些自定义按钮(功能)这些按钮应该定义在myform
例如在myform我有:
private void btnOK_Click(object sender, EventArgs e)
{
DoSomething();
}
整个问题是-如何运行myform btnOK_Click或DoSomething从mycontrol
更新# 2:当我删除检查它是否为空时,按D0, NullReference没有任何反应。
内部部分类myForm: BaseForms{公共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;
}
}
在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事件时调用。
尝试下面的方法内部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());
}
}
}
使用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();
控件应该公开一个事件,然后表单可以订阅该事件并对其进行操作。
给事件起一个有意义的名字。如果你的控件包含一个搜索按钮,并且用户点击了它,让你的控件触发一个名为SearchButtonClicked
的事件,例如。
然后表单可以包含一个订阅SearchButtonClicked
事件的方法,并且该代码将在用户单击Search按钮时执行。
在MyControl类中添加一个MyForm的引用
class MyControl
{
MyForm _form=null;
MyControl(MyForm form)
{
_form=form;
}
void DoSth()
{
if(_form!=null)
_form.DoSomething();
}
}