2

我在基于数据库条目的表单上创建了许多按钮,它们工作得很好。这是创建它们的代码。如您所见,我给了他们一个标签:

for (int i = 0; i <= count && i < 3; i++)
{
    btnAdd.Text = dataTable.Rows[i]["deviceDescription"].ToString();
    btnAdd.Location = new Point(x, y);
    btnAdd.Tag = i;

    this.Controls.Add(btnAdd);
}

我使用这些按钮来可视化投票系统。例如,我希望按钮在一切正常时为绿色,而在出现问题时为红色。

所以我遇到的问题是稍后引用按钮,以便我可以更改它们的属性。我已经尝试过以下内容:

this.Invoke((MethodInvoker)delegate
{
    // txtOutput1.Text = (result[4] == 0x00 ? "HIGH" : "LOW"); // runs on UI thread
    Button foundButton = (Button)Controls.Find(buttonNumber.ToString(), true)[0];
    if (result[4] == 0x00)
    {
        foundButton.BackColor = Color.Green;
    }
    else
    {
        foundButton.BackColor = Color.Red;
    }
});

但无济于事......我试过改变语法,Controls.Find()但仍然没有运气。有没有人遇到过这个问题或知道该怎么做?

4

4 回答 4

2

将这些按钮放在一个集合中,并设置控件的名称而不是使用它的标签。

var myButtons = new List<Button>();
var btnAdd = new Button();
btnAdd.Text = dataTable.Rows[i]["deviceDescription"].ToString();
btnAdd.Location = new Point(x, y);
btnAdd.Name = i;
myButtons.Add(btnAdd);

要找到按钮,请使用它。

Button foundButton = myButtons.Where(s => s.Name == buttonNumber.ToString());

或者简单地说

Button foundButton = myButtons[buttonNumber];
于 2012-05-22T15:34:00.727 回答
2

如果在创建按钮时命名按钮,则可以从 this.controls(...

像这样

for (int i = 0; i <= count && i < 3; i++)
    {
        Button btnAdd = new Button();
        btnAdd.Name="btn"+i;

        btnAdd.Text = dataTable.Rows[i]["deviceDescription"].ToString();
        btnAdd.Location = new Point(x, y);
        btnAdd.Tag = i;

        this.Controls.Add(btnAdd);
    }

然后你可以像这样找到它

this.Controls["btn1"].Text="New Text";

或者

 for (int i = 0; i <= count && i < 3; i++)
{
//**EDIT**  I added some exception catching here
    if (this.Controls.ContainsKey("btn"+buttonNumber))
        MessageBox.Show("btn"+buttonNumber + " Does not exist");
    else
        this.Controls["btn"+i].Text="I am Button "+i;
}
于 2012-05-22T15:41:35.830 回答
0

在您的情况下,我会使用一个简单的字典来存储和检索按钮。

宣言:

IDictionary<int, Button> kpiButtons = new Dictionary<int, Button>();

用法:

Button btnFound = kpiButtons[i];
于 2012-05-22T15:41:53.883 回答
0

@Asif 是对的,但如果你真的想使用标签,你可以使用 next

    var button = (from c in Controls.OfType<Button>()
               where (c.Tag is int) && (int)c.Tag == buttonNumber
               select c).FirstOrDefault();

我宁愿创建带有数字、按钮引用和逻辑的小型助手类,并将其收集在表单上。

于 2012-05-22T15:43:00.420 回答