0

現在、クラスpanel.csを呼び出すmainForm.csがあります

panel.csは、_click、_mousedown、_mouseupなどのイベントを含む複数の画像ボックスを保持します

panel.csからmainForm.csの関数を呼び出したい

コールバック/デリゲートを使用する必要がありますか?この機能にアクセスする別の方法はありますか

Main main = new Main();を試しました。main.functioninMainが機能しません

どんな助けや指示もいただければ幸いです。

例えば

panel.cs
  private void pb_button1_Click(object sender, EventArgs e)
  {
    this.BeginInvoke(new Action(main.functioninMain));
  }
4

3 に答える 3

1

このようなデリゲートとイベントを使用できる場合

public partial class MainForm : Form
{
        public MainForm()
        {
            InitializeComponent();
        }

    private void button1_Click(object sender, EventArgs e)
    {
        Panel formPanel = new Panel();
        formPanel.OnPanelClick += new Panel.OnPanelButtonClick(formPanel_OnPanelClick);
        formPanel.Show();
    }

    void formPanel_OnPanelClick(string a)
    {
        MessageBox.Show(a);
    }
}

public partial class Panel : Form
{
    public delegate void OnPanelButtonClick(string a);
    public event OnPanelButtonClick OnPanelClick = null;

    public Panel()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (OnPanelClick != null)
        {
            OnPanelClick("from Panel.cs");
        }
    }
}
于 2012-04-20T05:44:59.893 に答える
1

MainForm の別のオブジェクトをインスタンス化しないでください。これにより、複製が作成され、新しい MainForm 内のすべてのオブジェクトが実際の MainForm の値を持たなくなります。

アプローチ 1 以下のように MainForm の静的インスタンスを作成してみることができます

public partial class MainForm : Form
{
    public static MainForm Instance = null;
    public MainForm()
    {
        InitializeComponent();
        Instance = this;
    }
    public SomeMethod()
    {
    }
}

パネル クラスがあれば、MainClass のパブリック メソッドと変数に簡単にアクセスできます。

class Panel : Form
{
    public Panel()
    {
        MainForm.Instance.SomeMethod();
    }

}

編集:ハンドルをパラメーターとしてフォームに渡します (Ben Voigtの提案から)

アプローチ 2:

Ben が示唆したように、より安全なコードを作成することも重要です。よりクリーンなアプローチは、コントロールのハンドルをパラメーターとして渡し、それらにアクセスすることです。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        TestClass test = new TestClass();
        test.ModifyText(textBox1);
    }
}

public class TestClass
{
    public void ModifyText(TextBox textBox)
    {
        textBox.Text = "New text";
    }
}
于 2012-04-20T04:59:43.447 に答える