首页 > 解决方案 > 我可以禁用我按下的按钮旁边的按钮吗?

问题描述

我想一键禁用 2 个按钮,而不指定这些按钮。我的表单上有大约 150 个按钮,我不想为所有这些按钮编写一个函数。

我有一个类似这样的功能,可以禁用我点击的按钮。

public void disableButton(object sender, EventArgs e)
{
    if (((Button)sender).Enabled == true)
    {
        ((Button)sender).Enabled = false;
        ((Button)sender).BackColor = Color.Red;
    }
}

所以基本上,当我调用这个函数时,我想禁用这个按钮,以及它旁边的一个按钮。(例如按钮 1 和按钮 2)

标签: c#.netwinforms

解决方案


考虑到按钮应该按特定顺序添加到控件中,这样当您根据需要获取所有按钮时,您可以禁用当前按钮的立即下一个按钮,请参考以下代码:

public void disableButton(object sender, EventArgs e)
{
           var selectedButton = ((Button)sender);
           var allButtons = Controls.OfType<Button>().ToList();
           var currentButtonIndex = allButtons.Select((s, i) => new { button = s, index = i }).Single(si => si.button.Name == selectedButton.Name).index;
           if (allButtons[currentButtonIndex + 1].Enabled == true)
           {
               allButtons[currentButtonIndex + 1].Enabled = false;
               allButtons[currentButtonIndex + 1].BackColor = Color.Red;
           }
}

要获取表单中所有按钮的列表Controls.OfType<Button>().ToList(),下一步是获取当前按钮的索引。一旦获得索引,将其递增 1,您将获得下一个按钮的引用,
以便更安全地实现,只需检查它是否不是最后一个按钮,在这种情况下选择第一个按钮,请参阅以下代码:

currentButtonIndex = currentButtonIndex + 1 >= allButtons.Count() ? 0 : currentButtonIndex;  

假设您无法弄清楚按钮的顺序,但下一个按钮应该基于TabStop,基于TabStop您可以更好地找到下一个按钮,参考下面的代码

var allButtons = Controls.OfType<Button>().OrderBy(o => o.TabStop).ToList();
var currentButtonIndex =  allButtons.Select((s, i) => new { button = s, index = i }).Single(si => si.button.Name == selectedButton.Name).index;
var toDisableButton = allButtons[currentButtonIndex + 1];
Controls.OfType<Button>().Single(si => si.Name == toDisableButton.Name).Enabled = false;

推荐阅读