C#将控件添加到循环中的面板

时间:2011-06-20 04:40:10

标签: c# dynamic controls add

我希望为文件中的每一行添加一个按钮。 到目前为止我的代码是:

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

问题是只创建了第一个控件。

6 个答案:

答案 0 :(得分:9)

代码看起来很好但可能存在以下情况。

1.您的文件中可能只有一个条目,因此您只能在面板中添加一个按钮。

2.您的面板宽度小于所有动态按钮宽度的总和。

我怀疑没有2是导致问题的主要原因。

因此,我建议您使用FlowLayoutPanel。添加动态内容,因为它会自动布局所有子控件。

答案 1 :(得分:3)

每次为动态控件生成相同的名称。这就是为什么它只显示最后一个的原因。它只是每次都覆盖以前的控件。

答案 2 :(得分:2)

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

答案 3 :(得分: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++;
        }

答案 4 :(得分:0)

除FlowLayoutPanel之外的Panel和类似控件的问题是当你创建一个控件和第二个控件时,如果你没有动态更改它的位置或者根据已添加的另一个设置它,则在同一位置创建第二个控件控制。你的控制在那里,它在第一个控件的后面。

一个flowLayoutPanel更好,因为它会在你添加它们时将控件添加到彼此旁边,同时在它们的定位上损害更精细的控制。

答案 5 :(得分:-1)

我的面板也有类似的问题。对于您正在做的事情,仅将字符串添加到列表框而不是使用标签和面板可能很有用。这应该更简单。