c# - 当您动态创建未知数量的按钮时,如何引用每个按钮?
问题描述
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 应用程序。
解决方案
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";
}
推荐阅读
- php - 自动捆绑资产流程,wordpress 主题插件?
- ios - Xamarin Forms 中的 VNDocumentCameraViewController 冻结
- javascript - iOS 14 WKWebView 正文滚动问题
- php - 为什么我的 PHP 电子邮件表单发送的是空白电子邮件
- arrays - 使用 Object.keys 方法将获取的异步数据添加到数组的问题?
- javascript - 带 2 位小数的输入值
- azure - Azure VM:权限被拒绝
- llvm - 在 Ubuntu 18.04 上安装 numba 时 LLVM 版本不匹配
- javascript - 如何使垫选择列表自动选择一个选项
- python - LSTM 时间序列预测 - 验证损失和测试损失低于训练损失