首页 > 解决方案 > 有没有办法自动检查按钮

问题描述

我已经将所有按钮命名为 Button1、Button2 ... 我有 9 个这样命名的按钮。我希望我的程序更改它附近按钮的文本。例如:当Button3被点击时,应将Button4到Button 9的文字改为空。

标签: c#winforms

解决方案


我们可以动态分配按钮的点击事件,例如使用:

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 XButton2hasX+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 = "");
}

如果我们需要以所有形式或从具有内部层次结构的容器中递归搜索控件:

如何在 Windows 窗体 C# 中切换可见性

如何在我的表单中更改所有面板的背景色

要使用不同的模式,我们还可以使用@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,我们还可以使用Tagfor 条件源,甚至是列表顺序本身。


推荐阅读