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

时间:2013-03-26 11:54:30

标签: c# winforms controls

在我的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;
        }
    }

5 个答案:

答案 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事件的方法,然后只要用户单击“搜索”按钮就会执行该代码。

另请参阅Events Tutorial on MSDN

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