web-dev-qa-db-ja.com

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();

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

8
YoshieMaster

コードは正常に見えますが、以下の状況が考えられます。

1.ファイルにエントリが1つしかない場合があるため、パネルに追加されたボタンは1つだけです。

2。パネルの幅は、すべての動的ボタンの幅の合計よりも小さくなっています。

問題を引き起こしている主な理由は2つではないと思います。

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

9
crypted

動的コントロールに同じ名前を生成するたびに。それが最後のものだけを示している理由です。毎回以前のコントロールを上書きするだけです。

3
AspMyLife
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);
}
2
Daniel Howard

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

        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
Peyman

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

FlowLayoutPanelは、配置時にコントロールをより細かく妥協しながらコントロールを追加するときに、コントロールを隣に追加するため、優れています。

0
driverobject