2

在我的 C# Windows Forms 项目中,我有:

  • mycontrol(它是键盘)

  • myform(它是文本框的布局,和 mycontrol )

我想运行一些myform中的代码,但是通过按下mycontrol中的按钮)

例如:

当我在mycontrol中按 Backspace 按钮时,我只使用 Button Event

SendKeys.Send("{BACKSPACE}");

并且myform文本框知道我按了退格键。

但我有一些自定义按钮(功能),这些按钮应该在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;
        }
    }
4

5 回答 5

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

在我的表格中。当引发 Click 事件时,将调用该方法。

于 2013-03-26T12:04:41.817 回答
1

您的控件应该公开一个事件,然后表单可以订阅并采取行动。

给您的活动起一个有意义的名称。例如,如果您的控件包含一个搜索按钮并且用户单击它,则让您的控件触发一个名为 的事件SearchButtonClicked

然后表单可以包含一个订阅该SearchButtonClicked事件的方法,然后只要用户单击“搜索”按钮,就会执行该代码。

另请参阅MSDN 上的事件教程

于 2013-03-26T12:00:53.183 回答
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());
    }
  }
}
于 2013-03-26T14:42:00.427 回答
1

使用 adelegate并将其传递给第二种形式的构造函数。

public delegate void MyDelegate(Object SomeData);

您需要根据要使用的方法签名创建一个委托。

MyDelegate del = form1.DoSomething;
Form2 form2 = new Form2(..., del);

然后,您可以从您的form1封装一个方法并将其传递给form2,然后在form2中调用它。

public Form2(..., MyDelegate del){ }

del.Invoke();

在这里寻找代表。

于 2013-03-26T11:58:55.760 回答
0

在 MyControl 类中添加对 MyForm 的引用

class MyControl
{
    MyForm _form=null;
    MyControl(MyForm form)
    {
        _form=form;
    }

    void DoSth()
    { 
        if(_form!=null)
           _form.DoSomething();
    }
}
于 2013-03-26T11:57:48.550 回答