2016-06-30 6 views
0

この問題は検索されましたが見つかりませんでした。コードで作成されたタブページでメソッドを実行

フォーム1のコードでは、その中にusercontrolを含むTabPageを作成してから、formPage1.TabControlにTabPageを追加し、usercontrolのpublicメソッドLoadDataを呼び出します。 問題:新しいタブページがアクティブになっているとき、またはフォーカスを取得したときにデータをリロードする必要があります。コードでタブページを作成しなかった場合は、単にTabControlのselectedIndex変更イベントを使用できますが、コードで作成する必要があります。 どうすればいいですか?様式1:

private void CreateNewTab() 
    { 

     TabPage tp1 = new TabPage(); 
     tp1.Text = "HSV"; 
     tp1.Name = "tpHSV"; 
     if (tabContMain.TabPages.ContainsKey(tp1.Name) == false) 
     { 
      HSVControl hsvc = new HSVControl(); 
      hsvc.Dock = DockStyle.Fill; 

      hsvc.LoadData(); 

      tp1.Controls.Add(hsvc); 
      tabContMain.TabPages.Add(tp1); 

     } 

    } 

==== EDIT ===============コメント 感謝。私の問題をより良く説明しよう。 selectedIndex変更イベントは正常に動作します。私はそれがテキストまたは名前でタブにアクセスすることができます。問題は、hsvc.LoadData()メソッドを呼び出すことです。 hsvcユーザーコントロールを含むタブをクリックすると、このメソッドを呼び出す必要があります。 LoadData()はpublicですが、Form1(selectedIndex変更イベントを保持)でアクセスする方法が見つかりません。 hsvc制御への参照が必要です。

私はこのようにForm1クラスにプロパティを追加しました:

private UserControl mControl; 

それを割り当てる:

 HSVControl hsvc = new HSVControl(); 
     hsvc.Dock = DockStyle.Fill; 
     hsvc.LoadData(); 
     mControl=hsvc; 

を次にSelectedIndexを変更イベントでそれを呼び出すが、それはまだそこに表示されません。

+2

がここに同じイベントを使用してください。コード内にイベントハンドラを割り当てることができます。このmsdn [example](https://msdn.microsoft.com/en-us/library/edzehd2t(v = vs.110).aspx#Anchor_3)を参照してください。デザイナーが生成したコードを調べて、イベントの処理方法を確認してください。または、あなたのメソッドで 'tabContMain.SelectedIndexChange + ='を書いてから 'Tab'キーを2回押します。 –

+0

'TabControl.SelectedIndexChanged'のように思えます。あなたはどんな問題を抱えていますか?そのイベントハンドラでhsvcを参照する方法がないのは単なるですか?その場合は、フォームクラスに参照を保持するフィールドを追加するだけです。 – adv12

+0

'SelectedIndexChanged'イベントで' hsvc.LoadData() 'を呼び出してください。今私は答えを変えた。 – mostafa8026

答えて

0

TabControlSelectedTabというプロパティがあります。以下のようにそのプロパティを使用します。

その最後の行で
private void CreateNewTab() 
{ 

    TabPage tp1 = new TabPage(); 
    tp1.Text = "HSV"; 
    tp1.Name = "tpHSV"; 
    if (tabContMain.TabPages.ContainsKey(tp1.Name) == false) 
    { 
     HSVControl hsvc = new HSVControl(); 
     hsvc.Dock = DockStyle.Fill; 

     hsvc.LoadData(); 

     tp1.Controls.Add(hsvc); 
     tabContMain.TabPages.Add(tp1); 
     tabContMain.SelectedTab = tp1; 

    } 

} 

、それはTabControlはそのSelectedIndexChangedイベントを呼び出すことができます。次に、このイベントでLoadDataイベントを呼び出します。

private void TabControl_SelectedIndexChangedEvent(object sender, EventArgs e) 
{ 
    //So Because Hsvc is a public field. I call its method here: 
    if(TabControl.SelectedTab.Name = "My Desired Tab"; 
    { 
     hsvc.LoadData(); 
    } 
} 
0

その解決策は、私の顔を見るようなものでした。私はそれが最高だとは思わないが、これはとてもうまくいった。インタフェース作成

HSVControl : UserControl,IControlBase 

とユーザーコントロール上の既存loaddataの()メソッドを有する:

public interface IControlBase 
{ 
    void LoadData(); 
} 

は、ユーザーコントロールインターフェイスを実装していました。 SelectedIndexを変更で次に

private IControlBase mControl; 

変更

private UserControl mControl; 

mControl.LoadData(); 
+0

...または 'mControl'を' HSVControl'として宣言し、 'IControlBase'を完全にスキップすることができました。 – adv12

+0

YEP、そうです。テストされ、正常に動作します。私は同様のニーズ/コントロールを持つより多くのタブを持っているので、私はそれをインターフェイスとして残します。先端に感謝します。 –

+0

デザインの観点から見ると、実際の型で厳密にそれらを参照するのではなく、これと将来類似する 'TabPages'のためのインタフェースを定義する唯一の利点は、それらを一般的に扱うことです(例えば、それらを 'IControlBase'として受け取り、' IControlBase'メソッドを呼び出します)。そのようなコードにインターフェイスが必要な場合でも、実際の型のインスタンスとしてフィールドを宣言するのが最善の方法です。そのため、コード内の型固有のメソッドを、実際の型にキャストすることなく呼び出せます。 – adv12

関連する問題