2

私のC#Windowsフォームプロジェクトには、次のものがあります。

  • mycontrol(キーボードです)

  • myform(テキストボックスとmycontrolのレイアウト)

myformにあるコードを実行したいのですが、 mycontrolのボタンを押します)

例えば:

mycontrolでBackspaceボタンを押すと、ボタンイベントを使用します

SendKeys.Send("{BACKSPACE}");

myformテキストボックスは、Backspaceキーを押したことを認識しています。

しかし、私はいくつかのカスタムボタン(機能的)を持っており、それらのボタンはmyformで定義する必要があります

たとえば、myformでは次のようになります。

private void btnOK_Click(object sender, EventArgs e)
        {
            DoSomething();

        }

全体の問題は、myformbtnOK_ClickまたはDoSomethingをmycontrolから実行する方法です

更新#2:

D0、NullReferenceを押している間、nullかどうかのチェックを削除しても何も起こりません。

内部部分クラス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.
}

MyFormで。Clickイベントが発生すると、メソッドが呼び出されます。

于 2013-03-26T12:04:41.817 に答える
1

aを使用してdelegate、2番目のフォームのコンストラクターに渡します。

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 に答える
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 に答える
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 に答える