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;
        }
    }

Windows窗体-在窗体和控件之间传递参数

在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();
    }
}