【问题标题】:Can I disable a button next to the button I press?我可以禁用我按下的按钮旁边的按钮吗?
【发布时间】:2021-05-10 07:05:47
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您必须定义“旁边”的确切含义。完成后,解决方案对您来说将变得显而易见。
  • 按钮名称是否遵循某种模式?您如何实际计算/知道“旁边”是什么按钮,如果您单击按钮 3,它就是按钮 4?如果您能澄清这一点,我们可以提供进一步帮助。
  • 如果我点击“Button1”,“旁边”就会出现“Button2”。所以实际上是的,他们有一个模式。总是从另一个按钮“+1”。

标签: c# .net winforms


【解决方案1】:

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

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&lt;Button&gt;().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;

【讨论】:

    【解决方案2】:
    1. 创建对的集合,其中对:(name_of_btn_1, name_of_btn_2)。
      这可以是IDictionary&lt;string, string&gt;

    2. 在单击事件处理程序中,使用字典获取关联的按钮名称。然后,您可以通过this.Controls.Find() 按名称获取关联的按钮并将其禁用。

    【讨论】:

    • 在两个按钮上保留两个引用而不是字典不是更简单吗...?
    • 这是~150个按钮,伙计。除此之外,这只是一种替代解决方案。 Amit 的答案更好(假设索引顺序正确,但可以修复)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    相关资源
    最近更新 更多