c# - 有没有办法自动检查按钮
问题描述
我已经将所有按钮命名为 Button1、Button2 ... 我有 9 个这样命名的按钮。我希望我的程序更改它附近按钮的文本。例如:当Button3被点击时,应将Button4到Button 9的文字改为空。
解决方案
我们可以动态分配按钮的点击事件,例如使用:
using System.Linq;
private void FormTest_Load(object sender, EventArgs e)
{
Controls.OfType<Button>()
.Where(b => b.Name.StartsWith("Button"))
.ToList()
.ForEach(b => b.Click += Button_Click);
}
我们将所有控件作为当前表单实例的根级别的按钮类型,通过与指定模式匹配的名称进行过滤,并且我们将 LINQ延迟查询的结果评估作为一个列表来分配事件处理程序方法。
例如,如果控件位于面板中:
MyPanel.Controls.OfType<Button>()...
Button1
现在我们可以使用根据预期结果( has X
、Button2
hasX+1
等)设置的选项卡索引来动态更改 text 属性:
private void Button_Click(object sender, EventArgs e)
{
var button = sender as Button;
if ( button == null ) return;
button.Parent.Controls.OfType<Button>()
.Where(b => b.TabIndex > button.TabIndex)
.ToList()
.ForEach(b => b.Text = "");
}
如果我们需要以所有形式或从具有内部层次结构的容器中递归搜索控件:
要使用不同的模式,我们还可以使用@JohnnyMopp 建议的按钮解决方案的预定义数组或列表:
private void FormTest_Load(object sender, EventArgs e)
{
Buttons.Add(Button1);
Buttons.Add(Button2);
Buttons.Add(Button3);
Buttons.Add(Button4);
Buttons.ForEach(b => b.Click += Button_Click);
}
private void Button_Click(object sender, EventArgs e)
{
var button = sender as Button;
if ( button == null ) return;
Buttons.Where(b => b.TabIndex > button.TabIndex)
.ToList()
.ForEach(b => b.Text = "");
}
除了使用TabIndex
,我们还可以使用Tag
for 条件源,甚至是列表顺序本身。
推荐阅读
- python - 我可以不使用 SQL 删除光标指向的记录吗?
- c - 如何调用函数并使用其结果?
- python - 如何测试矩阵是否为旋转矩阵?
- android - RecyclerView 未更新视图或未调用 onCreate 视图持有者
- java - 根据实例类型 Spring 搜索不同字段的规范/谓词
- python - 使用openCV python查找骨架和边界之间的距离
- mysql - 2013 查询期间丢失与 MySQLserver 的连接
- r - R包中的README和vignette之间的目的区别是什么?
- lisp - Clozure Common Lisp - file-exists-p 未定义
- java - 如何通过Xpath提取登录用户的文本