C# 在循环中将控件添加到面板
Posted
技术标签:
【中文标题】C# 在循环中将控件添加到面板【英文标题】:C# Add Controls To Panel In a Loop 【发布时间】:2011-09-18 09:50:35 【问题描述】:我希望在面板中为文件中的每一行添加一个按钮。 到目前为止我的代码是:
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();
问题是只创建了第一个控件。
【问题讨论】:
如果循环重复多次并且menuPanel.Controls
真的只包含 1 个按钮,您是否检查过调试?
【参考方案1】:
试试这个代码
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++;
【讨论】:
【参考方案2】:代码看起来不错,但可能存在以下情况。
1.您可能在文件中只有一个条目,因此您遇到的只是一个按钮添加到面板中。
2.您的面板宽度小于所有动态按钮宽度之和。
我怀疑没有 2 是导致问题的主要原因。
所以,我建议您使用FlowLayoutPanel。添加动态内容,因为它会自动布局所有子控件。
【讨论】:
我是个白痴!!!!我到底在想什么!?你先生是个天才。这些按钮是为了显示在一个列中!!!!我在那里失败了。【参考方案3】:每次它为动态控件生成相同的名称。这就是为什么它只显示最后一个的原因。它只是每次都覆盖以前的控件。
【讨论】:
是的,这是正确的,除了最后一个按钮将无法访问,因为它们都有相同的空名称,请确保为每个按钮的名称添加增量后缀。rb.Name = "rb" + panPhysicians.Controls.Count;
这段代码表明每次迭代都会更改名称。【参考方案4】:
除了 FlowLayoutPanel 之外,Panel 和类似控件的问题是,当您创建一个控件和第二个控件时,如果您没有动态更改它的位置或根据已添加的另一个控件进行设置,则第二个控件会在同一位置创建控制。你的控件在那里,它在第一个控件的后面。
flowLayoutPanel 更好,因为它会在您添加控件时将控件彼此相邻添加,同时在它们的位置上妥协更精细的控制。
【讨论】:
【参考方案5】:我也有类似的面板问题。对于您正在做的事情,将字符串添加到列表框而不是使用标签和面板可能会很有用。那应该更简单。
【讨论】:
【参考方案6】: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);
【讨论】:
这非常有效。我对其进行了修改并用它来制作一组医生单选按钮。我使用面板上控件的计数作为控件的索引来添加名称以使其唯一以上是关于C# 在循环中将控件添加到面板的主要内容,如果未能解决你的问题,请参考以下文章