首页 > 解决方案 > 当您动态创建未知数量的按钮时,如何引用每个按钮?

问题描述

Char[] mychars = { ' ' };
            string myText = "Hello how are you";
            string[] names = myText.Split(mychars);
            int idef=0;
            foreach(string x in names)
            {
                Button b = new Button
                {
                    Width = 100,
                    Name = "b" + idef,
                    Text = x,
                    Location = new Point(centerLine.Location.X + idef * 100, centerLine.Location.Y),
                };
                b.Click += (sender1, e1) =>
                {
                    textBox1.Text += ((Button)sender1).Text;
                };
                this.Controls.Add(b);
                idef++;
            }

            b0.Text = "change";

b0 是我创建的按钮,但它在当前上下文中不存在,我如何将其引用到自身?我在 Visual Studio 工作,它是一个 Forms 应用程序。

标签: c#buttondynamic

解决方案


this.Controls.Add(b);

如果您将按钮添加到this.Controls,您应该能够使用 LINQ 访问所有这些按钮。要添加其功能,请使用:

using System.Linq;

然后,您可以获取控件中的所有按钮:

var buttons = this.Controls.OfType<Button>();

或者所有名称以字母“b”开头的按钮:

var buttons = this.Controls.OfType<Button>().Where(x => x.Name.StartsWith("b"));

之后,您可以使用 LINQ 在按钮列表中进行搜索:

var b0 = buttons.Where(x => x.Name == "b0").SingleOrDefault();

ControlCollection或者在this不创建“按钮”变量的情况下搜索整个内容。使用该SingleOrDefault()方法返回一个具有特定名称的按钮:

var b0 = this.Controls.OfType<Button>().Where(x => x.Name == "b0").SingleOrDefault();

当您想要更改按钮的 Text 或任何其他属性时,只需使用:

b0.Text = "New Text";

要了解有关 LINQ 的更多信息,请访问此页面此处提供了所有 LINQ 方法。

如果您不想使用 LINQ 来检索按钮,您可以简单地使用foreach循环和is关键字来选择所有按钮来检查类型:

var buttons = new List<Button>();

foreach (var control in this.Controls)
{
     if (control is Button button)
     {
          buttons.Add(button);
     }
}

或者选择名称以字母“b”开头的所有按钮:

var buttons = new List<Button>();

foreach (var control in this.Controls)
{
     if (control is Button button && button.Name.StartsWith("b"))
     {
          buttons.Add(button);
     }
}

您还可以通过以下方式选择具有特定名称的按钮:

Button b0 = null;

foreach (var control in this.Controls)
{
     if (control is Button button && button.Name == "b0")
     {
          b0 = button;
          break;  // break keyword to stop the loop if the button is found
     }
}

然后,您可以编辑按钮“b0”的属性,尽管您必须确保按钮不为空:

if (b0 is not null)  // checks if button exists
{
     b0.Text = "New Text";
}

推荐阅读