我希望为文件中的每一行添加一个按钮。 到目前为止我的代码是:
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 :(得分: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)
我的面板也有类似的问题。对于您正在做的事情,仅将字符串添加到列表框而不是使用标签和面板可能很有用。这应该更简单。