2011-06-20 10 views
6

ファイルのすべての行にボタンをパネルに追加したいとします。 私のコードは、これまでのところです:C#ループ内のパネルにコントロールを追加する

StreamReader menu = new StreamReader("menu.prefs"); 
int repetition = 0; 

while(!menu.EndOfStream) 
{ 
    Button dynamicbutton = new Button(); 
    dynamicbutton.Click += new System.EventHandler(menuItem_Click); 
    dynamicbutton.Text = menu.ReadLine(); 
    dynamicbutton.Visible = true; 
    dynamicbutton.Location = new Point(4+repetition*307, 4); 
    dynamicbutton.Height = 44; 
    dynamicbutton.Width = 203; 
    dynamicbutton.BackColor = Color.FromArgb(40,40,40); 
    dynamicbutton.ForeColor = Color.White; 
    dynamicbutton.Font = new Font("Lucida Console", 16); 
    dynamicbutton.Show(); 
    menuPanel.Controls.Add(dynamicbutton); 
    repetition++; 
    MessageBox.Show(dynamicbutton.Location.ToString()); 
} 
menu.Close(); 

問題は最初のコントロールが作成されるということです。

+0

デバッグループが複数回繰り返されていて、 'menuPanel.Controls'リアルに1つのボタンだけが含まれているとチェックしましたか? –

答えて

9

このコードを試してみてください。

1.ファイルには1つのエントリしかないので、パネルにボタンが1つしか追加されていない可能性があります。

2.パネルの幅は、ダイナミックボタンの幅の合計よりも小さいです。

私は問題が発生している主な理由はないと思われます。

ですので、FlowLayoutPanelを使用することをおすすめします。動的コンテンツを追加するには、すべての子コントロールを自動的にレイアウトします。

+0

私はばかだ!私は何を考えていた!あなたは天才です。ボタンは列に表示するためのものです!!!!私はそこで叙事詩的なことをしなかった。 – YoshieMaster

0

は、コードが正常に見えるが、以下のような状況があるかもしれません

 StreamReader menu = new StreamReader("menu.prefs"); 
     var str = menu.ReadToEnd(); 
     var items = str.Split(new string[] {"\r\n" } , StringSplitOptions.RemoveEmptyEntries); 
     foreach (var item in items) 
     { 
      Button dynamicbutton = new Button(); 
      dynamicbutton.Click += new System.EventHandler(menuItem_Click); 
      dynamicbutton.Text = item; 
      dynamicbutton.Visible = true; 
      dynamicbutton.Location = new Point(4+repetition*307, 4); 
      dynamicbutton.Height = 44; 
      dynamicbutton.Width = 203; 
      dynamicbutton.BackColor = Color.FromArgb(40,40,40); 
      dynamicbutton.ForeColor = Color.White; 
      dynamicbutton.Font = new Font("Lucida Console", 16); 
      dynamicbutton.Show(); 
      menuPanel.Controls.Add(dynamicbutton); 
      repetition++; 
     } 
+0

Nope。少数の誤りを訂正した後でさえ、不運。 – YoshieMaster

3

ダイナミックコントロールで同じ名前が生成されるたびに、それが最後のものだけを示している理由です。これは、単に前のコントロールを上書きします。

+0

はい、これは正しいです。最後のボタンを除くすべてが同じ空の名前を持っているためアクセスできません。各ボタンの名前に増分接尾辞を必ず付け加えてください。 – peterincumbria

0

PanelとFlowLayoutPanel以外の同様のコントロールの問題は、コントロールを作成して2番目のコントロールを作成したときに、2番目のコントロールが動的に位置を変更しない場合や、追加されたコントロール。あなたのコントロールはそこにあります、それは最初のコントロールの後ろにあります。

flowLayoutPanelは、コントロールを配置する際にコントロールを追加しながら、隣り合ったコントロールを追加するので、より優れています。

-1

私もパネルで同様の問題があります。ラベルやパネルを使用するのではなく、リストボックスに文字列を追加するだけで便利です。それはもっと簡単になるはずです。

1
int x = 4; 
int y = 4; 
foreach(PhysicianData pd in listPhysicians) 
{ 
    x = 4; 
    y = panPhysicians.Controls.Count * 30; 
    RadioButton rb = new RadioButton(); 
    rb.CheckedChanged += new System.EventHandler(rbPhysician_CheckedChanged); 
    rb.Text = pd.name; 
    rb.Visible = true; 
    rb.Location = new Point(x, y); 
    rb.Height = 40; 
    rb.Width = 200; 
    rb.BackColor = SystemColors.Control; 
    rb.ForeColor = Color.Black; 
    rb.Font = new Font("Microsoft Sans Serif", 10); 
    rb.Show(); 
    rb.Name = "rb" + panPhysicians.Controls.Count; 
    panPhysicians.Controls.Add(rb); 
} 
+0

これは完全に機能します。私はそれを修正し、医師のラジオボタンのパネルを作るためにそれを使用しました。コントロールのインデックスとしてパネル上のコントロールの数を使用して、名前を追加して一意にしました –

関連する問題