【问题标题】:C# Add Controls To Panel In a LoopC# 在循环中将控件添加到面板
【发布时间】: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 个按钮,您是否检查过调试?

标签: c# dynamic controls add


【解决方案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);
        }
        

        【讨论】:

        • 这非常有效。我对其进行了修改并用它来制作一组医生单选按钮。我使用面板上控件的计数作为控件的索引来添加名称以使其唯一
        猜你喜欢
        • 2012-02-25
        • 2016-08-15
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多