2012-04-20 14 views
0

現在C#コール機能外現在のクラスから

_mouseup私が呼び出したい、など_CLICK、_mousedownなどのイベントで複数のpictureboxesを保持している

panel.csクラスpanel.csを呼び出すmainForm.csを持っていますmainForm.csのpanel.csの関数

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

私は試しました メインメイン=新しいメイン(); main.functioninMainは機能しません。

ご迷惑をおかけして申し訳ございません。あなたが重複したり、実際のMainFormの値を持っていない新しいMainFormというのwithingすべてのオブジェクトを作成するのMainFormの別のオブジェクトを、インスタンス化してはならない例

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

答えて

1

ため

。あなたはあなたの静的インスタンスを作成しようとすることができ

アプローチ1 あなたは、パネルクラスを持っている場合さて、あなたは、パブリックメソッドとMainClass

の変数を簡単にアクセスすることができ

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

以下のようにMainFormを

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

} 

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

アプローチ2:ベンが示唆したように

、そんなにきれいなアプローチは、それらにアクセスするために、パラメータとして、コントロールのハンドルを渡すとされ、より安全なコードを持っていることも重要です。

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"; 
    } 
} 
+1

これはおそらく1つだけなので、メインウィンドウでは機能しますが、パネルの作成時に親にハンドルを渡す方が賢明な方法です。 –

+0

作品!大変ありがとうsoooo! – justin89

+0

@BenVoigt:はい私はあなたの提案に同意し、したがってハンドルをコントロールするハンドルを渡すためのアプローチで答えを更新しました。 – Marshal

0

すべてのコスト(クラスAはクラスBに依存し、クラスBはクラスAに依存します)を回避する必要があります。

これを行う方法はたくさんありますが、簡単な方法の1つはインターフェイスを使用することです。 mainForm.csはこのようにそれを実装しています

public class mainForm : IMainForm { 
    // This method is defined in the interface, so mainForm 
    // must implement it. 
    public string GetStringFromMainForm() { 
    return "Hello from MainForm"; 
    } 

    public void CreatePanel() { 
    // pass in a reference to myself so panel knows how to 
    // talk to me. 
    var panel = new Panel(this); 
    } 
} 

とIMainForm(インターフェース)は次のようになります。

public interface IMainForm { 
    string GetStringFromMainForm(); 
} 

その後、あなたのパネルクラスはmainForm.csを参照することなく、メインフォームに話すことができます明示的に:

public class Panel { 
    // use a private variable to keep track of main form 
    private IMainForm _mainForm; 

    // Constructor: pass in a class that implements IMainForm. It isn't 
    // a type of MainForm, so there's no dependency on the concrete class. 
    public Panel(IMainForm mainForm) { 
    _mainForm = mainForm; 
    } 

    public void TalkToMainForm() { 
    var resultFromMainForm = _mainForm.GetStringFromMainForm(); 
    Console.WriteLine(resultFromMainForm); 
    } 
} 
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"); 
     } 
    } 
} 
関連する問題