2016-07-20 23 views
0

Winフォームでは、これらの3つのテストメソッドがあります。最初にボタンを作成し、2つ目のタブでタブコントロールを作成し、3番目に作成したボタンを最初のタブに移動します。NullReferenceException動的に作成されたコントロール、オブジェクトが存在するようです。

private void button1_Click(object sender, EventArgs e) 
    { 
     Button przycisk = new Button(); 
     przycisk.Location = new Point(24, 250); 
     przycisk.Name = "nowy"; 
     przycisk.Text = "utworzony"; 
     przycisk.Width = 131; 
     przycisk.Height = 23; 
     Controls.Add(przycisk); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     TabControl zakladki = new TabControl(); 
     zakladki.Location = new Point(208, 160); 
     zakladki.Name = "zakl"; 
     zakladki.Height = 150; 
     zakladki.Width = 208; 
     zakladki.TabPages.Add("zakladka1", "pierwsza"); 
     zakladki.TabPages.Add("zakladka2", "druga"); 
     Controls.Add(zakladki); 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     TabControl zakladki = (TabControl)Controls.Find("zakl", false).FirstOrDefault(); 
     int numerZakladki = 1; 
     foreach (TabPage zakladka in zakladki.TabPages) 
     { 
      Control kt = Controls["nowy"]; 
      kt.Location = new Point(10, 10); // System.NullReferenceException 
      zakladka.Controls.Add(kt); 
      numerZakladki++; 
     } 
    } 

参照ボタンの位置を変更しようとすると、動作を理解するのが難しいです。上記のコードはSystem.NullReferenceExceptionをスローしますが、実行すると

if (kt != null) 
{ 
    kt.Location = new Point(10, 10); 
} 

が動作します。誰も私にそれを説明することはできますか?

+0

「button1」(つまり、「przycisk」コントロールを作成しました)をクリックしましたか? –

+0

はい私は正しい順序でボタンをクリックしました:) – jankes

答えて

1

新しいTabControlには2つのタブがあります。 ボタンを最初のタブに移動すると、メインフォームのコントロールがnullになります。 ループのないコード:

private void button3_Click(object sender, EventArgs e) 
    { 
     TabControl zakladki = (TabControl)Controls.Find("zakl", false).FirstOrDefault(); 
     Control kt = Controls["nowy"]; 
     kt.Location = new Point(10, 10); 
     zakladki.TabPages[0].Controls.Add(kt); 
    } 
0

nowyコントロールはルートコントロール(Formと思います)に追加されましたが、タブページのzaklで検索しようとしています。 zaklと同じように、タブページにコントロールを追加するか、ルートコントロールでコントロールを見つける必要があります。

0

「nowy」ボタンは、Form.Controlsから最初のTabPageControlsコレクションに移動します。これにより、最初のコレクションからコントロールが削除されるので、コードは次の繰り返しで例外をスローします。 Controlは、1つだけを有することができる。Parent

各タブごとに別々に(移動する代わりに)Buttonを作成するか、最初のタブにのみButtonを追加してください(foreachループなし)。