我在为GUI编写代码时经常遇到这种情况,并且想知道这将是解决这个问题的最佳实践方法。情况是这样的:
我的GUI上有许多相同的项目,它们有不同的变量名称,即我有10个“相同”的按钮,分别命名为Button1,Button2,Button3等......
按钮的显示文本在代码中更新,如果满足特定条件,我想检查它们何时更新,然后根据该条件更改文本颜色。所以对于button1我会写:
if (Button1.text == "true"){
Button1.textcolor = blue}
else if (Button1.text == "false"){
Button1.textcolor = red}
现在,为10个按钮中的每个按钮再次编写此代码似乎是多余的,用Button2替换Button1的变量名,依此类推,直到Button10。有没有办法在循环中更改代码的“Button1”部分并保持其他所有内容相同?所以我正在寻找的伪代码示例是:
for (all buttons in (button1-button10)){
if (thisbutton.text == "true"){
thisbutton.textcolor = blue}
else if (thisbutton.text == "false"){
thisbutton.textcolor = red}}
我不知道如何最好地处理这种情况,并希望得到关于此的输入和指导。
由于
答案 0 :(得分:1)
每当你有一组类似的对象时,不要为这些对象的每个实例创建一个变量,而是将它们放在一个单独的集合中。然后,您可以轻松地循环此列表并操纵其中的对象:
var buttons = new List<Button>();
// put the buttons into the list using buttons.Add
for (var b in buttons)
{
if (b.text == "true")
{
b.textcolor = blue
}
else
{
b.textcolor = red
}
}
您还可以使用GridView
将所有这些按钮放入一个拉格网格中。
答案 1 :(得分:0)
创建自己的按钮。
using System.Windows.Forms;
using System.Drawing;
namespace TestApp
{
public class TheButton : Button
{
public void ChangeColor()
{
ForeColor = (Text == "true") ? Color.Blue : Color.Red ;
}
}
}
重建您的解决方案,您应该在工具箱中看到TheButton,在表单中,添加容器类,如面板,并添加TheButton类的实例。
然后您可以编写一个方法,例如:
private void ChangeAllButtons()
{
foreach (var control in panel1.Controls.Cast<object>().Where(control => (control as TheButton) != null))
{
(control as TheButton).ChangeColor();
}
}
您必须决定调用ChangeAllButtons()的最佳位置。
答案 2 :(得分:0)
有很多方法可以解决这个问题。
由于按钮是由设计师创建的窗口/面板的字段,要列出它们,您必须分析 WPF 树(或在主窗口面板上使用反射,它是&#39;不是很优雅。)
要获得所有class SomeHandler(SomeMoreGenericHandler):
def prepare(self):
super().prepare()
if not self.current_user:
self.redirect('/login')
raise tornado.web.Finish
个孩子,您可以使用此方法:
Button
然后调用它:
public static IEnumerable<T> EnumVisualOfType<T>(Visual visual) where T : Visual
{
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
{
var visualChild = (Visual)VisualTreeHelper.GetChild(visual, i);
foreach (var child in EnumVisualOfType<T>(visualChild))
yield return child;
var childVisual = visualChild as T;
if (childVisual != null)
yield return childVisual;
}
}
你有所有按钮的列表(当然,你可以根据需要过滤特定属性),你可以编写一次代码并在foreach循环中使用它。
您还可以在创建面板时将所有按钮显式添加到列表中,但是每次创建新面板时都必须记住手动添加它们。