2016-04-27 4 views
0

私は、ユーザーが選択できるコンボボックスを含むメインフォームを持っています。次に、メインフォーム内で開き、メインフォームのコンボボックスに関連するさまざまな情報を含む2つのセカンダリフォームを切り替えます。どうすればメインフォームのコンボボックスでIndexChanged関数のような他のフォームの値を更新することができますが、他のすべてのフォームに影響しますか?この形式ではコンボボックスをメインコントロールとして使用

private void CrashReports_Click(object sender, EventArgs e) 
    { 
     tabControl1.SelectedTab = tabPage4; 
     tabControl1.Visible = true; 
     CrashReports CrashReportsTab = new CrashReports(this); 
     CrashReportsTab.TopLevel = false; 
     panel4.Controls.Add(CrashReportsTab); 
     CrashReportsTab.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
     CrashReportsTab.TopLevel = false; 
     CrashReportsTab.Dock = DockStyle.Fill; 
     CrashReportsTab.Show(); 
    } 

、それがメインフォームでコンボボックスが言うけど何に基づいていくつかの計算を行います。ここで は、二次のいずれかの形式がオープン(このような彼らはすべての作業)を取得したときに何が起こるかのコードですメインフォームが変更されたときに更新されるようには見えません。メインフォームのコンボボックスに元の値が何であったかに基づいて、ボタンが最初にクリックされたときにのみ更新されます。基本的には、メインフォームのcomboBoxが変更されたときにすぐにセカンダリフォームを更新するコードの抜粋が必要です。

ありがとうございます。

+0

他のすべての形式は同じですか?それらはすべて「CrashReports」形式ですか? – Mikanikal

+0

これらはすべて 'CrashReports'フォームではありません。さまざまなタイプのデータを表示するため、すべて異なるタイプです。 –

+0

下記の私の編集を参照してください。それぞれの参照を使用して、特に 'IndexChanged'イベントで呼び出すか、それぞれのフォームの' IndexChanged'イベントのハンドラを登録したり、より多くのデータを取り込む特別なイベントを作成したり、 IndexChanged'イベントはフォームをループし、その特別イベントを特別に呼び出してデータを取得することができます。 – Mikanikal

答えて

0

他のフォームの参照は常にどこかにあります。参照が利用可能であることを確認し、ComboBoxIndexChangedイベントにアクセスするだけです。あなたは、あなたのメインフォームのリストに参照を残すか、panel4.Controlsのプロパティを使って参照にアクセスできます。

メッセージングの構造と、どの情報を引き渡す必要があるかを考えます。すべてのSecondaryフォームから派生したBase SubFormを作成することができます。これは、UpdateFromSelectionChangeというイベントがあり、渡す必要がある情報をそのパラメータに含めることができます。各フォームは、そのイベントを個別に、具体的には自分のニーズに合わせて処理することができます。

ハンドラを別のフォームに設定する例。

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

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Form2 myForm2 = new Form2(); 

     // Do not use this line if you handle looping through the controls 
     // in your combobox1_SelectedIndexChanged method. 
     comboBox1.SelectedIndexChanged += myForm2.HandlerForIndexChanges; 

     myForm2.Show(); 
    } 

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     // This handles the selection change. 

     foreach (Form2 cont in panel4.Controls.OfType<Form2>()) 
     { 
      cont.SomeOtherWay("Some", "Other", "Way"); 
     } 
    } 
} 

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

    public void HandlerForIndexChanges(object o, EventArgs e) 
    { 
     // I can handle the event change here for my form as well. 
    } 

    public void SomeOtherWay(string st, string st2, string st3) 
    { 
     // Access to more data!!! 
    } 
} 
+0

他のフォームへの参照をどのように渡すのですか? –

+0

@ AlminPIlica投稿した例を見てください。 2つの例があります。必要なことをするには他の方法もあります。 'Form2'を常に' Form1'のクラスレベルに保つことができます。次に、ボタンをクリックするだけで表示され、 'Form1'のすべてのメソッドで利用できます。 – Mikanikal

+0

@ AlminPIlicaフォームの参照をどのように渡すことができるかを確認するには、このSOの投稿をチェックしてください。 http://stackoverflow.com/questions/20441789/how-to-disable-form2-combo-boxes-based-on-form1-combo-box-value?rq=1 – Mikanikal

関連する問題