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は正しいですが、本当にタグを利用したい場合は、次に使用できます

    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 に答える