【问题标题】:How to refer to each button when u dynamically create an uknown amount of them?当您动态创建未知数量的按钮时,如何引用每个按钮?
【发布时间】:2021-08-02 03:22:57
【问题描述】:
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# button dynamic


【解决方案1】:

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();

或在this 中搜索整个ControlCollection,而不创建“按钮”变量。使用SingleOrDefault() 方法返回一个具有特定名称的按钮:

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

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

b0.Text = "New Text";

要了解有关 LINQ 的更多信息,请访问 this page。所有 LINQ 方法都可用here

如果您不想使用 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";
}

【讨论】:

  • 什么是 LINQ?所以它本质上是搜索按钮?
  • LINQ 是一种用于检索/排序/选择/修改等项目的查询语法,它本质上是一组可用于对象列表的方法。在这种情况下,我们使用OfType&lt;Button&gt;() 方法在表单控件中搜索并选择所有具有匹配类型的项目(在本例中为按钮,您可以将其替换为其他类型以获得不同的控件),以及@987654343 @ 方法在列表中搜索并选择匹配条件的所有项目。您可以将其视为一组复杂的foreach 循环,只需调用一个短方法即可快速使用。
  • @Ethereallie 至于语法本身,有方法(如Where()Select())和关键字(如from person in peopleList select person.FirstName)。您可以阅读有关 LINQ here 的更多信息,因为它非常强大,您将来可能会使用它。您还拥有 LINQ here 使用的所有方法的完整列表。
  • 没有其他方法可以引用动态控件吗?这是针对我的 duolingo 外观相似的项目,其中一个功能就像您单击的单词块(按钮),它们会移动以形成一个句子。所以我要做的就是从我的 sql 表中获取一个句子,从中分离单词并随机打乱它们,然后获取该数组并从每个单词中制作按钮。 Idk 如何使它们移动,然后如果再次单击它们,它们应该返回(我想过添加类似 spawnlocation 属性,但 idk 如何做到这一点。所以我需要参考按钮以获取它们的文本值。
  • 顺便说一句,我们在学校没有学到很多东西,但我们必须自学。我最大的问题是这个程序没有用“一个教你语言的程序”,这对我没有任何意义,我不知道应该如何教授语言,所以我只是试图复制 duolingo。我的第一个问题是保存这些做法,比如它们只是一堆静态表单还是从某个数据库中提取的,所以我决定使用数据库。现在有很多错误可能是因为我没有计划我只是在我去的时候添加的东西。
猜你喜欢
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 2014-11-08
  • 1970-01-01
相关资源
最近更新 更多