c# - 我可以禁用我按下的按钮旁边的按钮吗?
问题描述
我想一键禁用 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)
解决方案
考虑到按钮应该按特定顺序添加到控件中,这样当您根据需要获取所有按钮时,您可以禁用当前按钮的立即下一个按钮,请参考以下代码:
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;
推荐阅读
- ansible - Ansible 剧本替换模块未按预期运行
- c# - 使用资源字符串进行枚举序列化
- javascript - 在 REACT.js 中,如何将状态从子组件传递到父组件作为道具
- flutter - FadeTransition 和 AnimatedOpacity 彼此不同步
- node.js - DynamoDB 永远不会返回我在 Node.js 中使用 AWS Lambda 寻找的项目
- windows - 调度程序如何中断 CPU?
- amazon-web-services - 如何在无服务器中引用 API 网关端点?
- flutter - 如何根据文本行数扩展容器(其子项是 textformfield)?(扑)
- java - 检查三角形是不等腰、等腰、等边还是不是三角形的JAVA程序
- android - gradle 如何两次解析不同版本的同一个库,并在运行时同时使用?