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# 在循环中将控件添加到面板的主要内容,如果未能解决你的问题,请参考以下文章

c#在tablelayout面板中使用不同的子控件会影响应用程序的速度吗

如何在 C# 中为我的控件添加移动效果?

C# WinForms 面板子定位非常不稳定?

在 Java 中将颜色选择器添加到面板

C#:锚定面板不会正确调整大小

在 C# 中的面板上拖放时移动控件