2012-03-23 9 views
5

私はform1.csを持っており、そのフォームにform1.csのloadイベントでpanel1を持っています。私はコントロールをpanel1に追加しています。私の問題はNumbers.csというコントロールがあることです。このコントロールにボタンコントロールのコントロールを追加する必要があります。これどうやってするの?別のユーザーコントロールからフォーム上のパネルにコントロールを追加する方法

public partial class Number : UserControl 
{ 
    public Number() 
    { 
     InitializeComponent(); 
    } 

    private void btnAcceptWelcome_Click(object sender, EventArgs e) 
    { 
      //HERE I NEED TO PASS A CONTROL TO THE PANEL1 IN FORM1.CS 
      //NOT SURE HOW TO DO THIS. 
    } 
} 

MORE INFO

だから基本的に私は、ユーザーコントロールと呼ばれるフォルダがあり、そのフォルダに私が

Numbers.cs 
Letters.cs 
Welcome.cs 

それらのすべてのユーザーコントロールを持って、それから私は、フォーム

Form1.cs 
を持っています

Form1.csはWelcomeというインスタンスを作成し、フォームロード時にForm1.csのPanel1に追加されます。 Welcome.csにボタンがあります。このボタンをクリックすると、Numbers.csにスワップする必要があります。しかし、私はWelcome.csからこれを行う方法はわかりません

+0

Numbers.csはForm1でホストされており、Numbers.csまたはForm1で作成されるパネルに追加されるコントロールです。 –

+0

私はフォームform1.csを持っていますユーザーコントロールを作成しますが、時にはそれらのユーザーコントロールの1つは、form1.csに別のユーザーコントロールを追加する必要があります。 – user710502

+0

[.NET Winformsで積み重ねられたコントロールを処理する方法]の可能な複製?(http://stackoverflow.com/questions/327968/how-to-handle-stacked-controls-in-net-winforms) –

答えて

2

もう一つの方法は、制御を渡すために数字が提起したCustom Eventを使用し、Form1で扱うことであろうパネルのコントロールコレクションに追加します。


これは

をForm1のUserControl1に追加カスタムイベントの一例である

public partial class Form1 : Form 
{ 
    UserControl2 mySecondControl = new UserControl2(); 
    public Form1() 
    { 
     InitializeComponent(); 
     userControl11.AddControl+=new EventHandler(SwapControls); 

    } 

    private void SwapControls(object sender, EventArgs e) 
    { 
     panel1.Controls.Remove(userControl11); 
     userControl11.AddControl -= new EventHandler(SwapControls); 
     panel1.Controls.Add(mySecondControl); 
    } 
} 

ユーザーコントロール

public partial class UserControl1 : UserControl 
{ 
    public event EventHandler AddControl; 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     this.AddControl(this, new EventArgs()); 
    } 
} 
+1

私はWindowsフォームの赤ちゃんプログラマーです。 – user710502

+0

私はさらに多くの情報を追加しました – user710502

+0

@ user710502 UserControlsを交換するか、または –

0

両方ともform1内で作成されているので、panel1の参照はもう一方のコンストラクタに引数として渡すことができます。

+0

このパネルをNumbers.csでどのように参照できますか?私はUserControlsと呼ばれるフォルダを持って、そこに私は3つのユーザーコントロールのように今..しかし、それらの1つは、form1.csのどのpanel1(別のユーザーコントロールにスワップ)を変更する必要があります。 – user710502

+0

私は詳細を追加しました – user710502

+0

あなたが提案する責任の連鎖は、デバッグとメンテナンスを複雑にするだけです。 – IAbstract

0

あなたの説明はあまり明確ではありませんが、コンストラクタまたはプロパティで必要なコントロールを渡すことができます。 C#オブジェクトでは、常に参照によって、Buttonコントロール内の同じコントロールのアクションになります。あなた自身のイベントを書くことができ、パネルを登録することができます。より完全なコードサンプルは素晴らしいでしょう。

私はまだあなたが正確にやっていることを少しは確信していますが、それは問題ありません。最も柔軟なアプローチは、独自のカスタムイベントを作成することだと思います。歓迎でボタンのClickイベント内

public event WelcomeClick OnClick; 

public delegate void WelcomeClick(object sender, EventArgs e); 

内部は、あなたが、それは、インスタンスの静的または一部のいずれかとすることができるイベントハンドラを作成する必要がありますようこそ:任意のクラスの外でデリゲートを作成しますあなただけの同じパラメータでそのイベントを呼び出すことができます。

if (OnClick != null) 
       OnClick(sender, e); 
+0

私はさらに詳しい情報を追加しました – user710502

+0

これは読めないので別の答えに移ります – Mataniko

2

注:0

Form1が持っている(または取得することができます) Number

Numberにイベントハンドラを追加への参照と仮定すると、

  1. 未テストコード
  2. public partial class Number : UserControl 
    { 
        // event handler Form1 will subscribe to 
        public EventHandler<EventArgs> OnWelcomeAccepted = (o, e) => { }; 
    
        public Number() 
        { 
         InitializeComponent(); 
        } 
    
        private void btnAcceptWelcome_Click(object sender, EventArgs e) 
        { 
          // raise the event 
          OnWelcomeAccepted(sender, e); 
        } 
    } 
    

    を... Form1は、サブスクリプションを持っていますの後にInitializeComponent(); ControlAddedに追加のサブスクリプションを注意してください。

    public partial class Form1 : Form { 
        public Form1() 
        { 
         InitializeComponent(); 
    
         this.ControlAdded += Control_Added; 
         // subscribe to the event and provide the implementation 
         Number.OnWelcomAccepted += (o, e) => { Controls.Add(GetControl()); } 
        } 
    
        private void Control_Added(object sender, System.Windows.Forms.ControlEventArgs e) 
        { 
         // process size and placement and show 
        } 
    
    } 
    

    他の制御がForm1に直接何かを加えるべきではありません。 Form1は子を制御します。

関連する問題