0

こんにちは、私はいくつかのボタンを動的に作成しています。ユーザーがボタンをクリックすると、選択したボタンの BackColor を強調表示された色に設定する必要があります。コードに従って、その代わりにすべてのボタンに色を適用していますユーザーがクリックしたボタンに色を適用する必要があります

ボタンを作成するための私のコードは次のとおりです

for(int i=0;i<5;i++)
{
    Button btyDynamic = new Button();
    btyDynamic .Click += new EventHandler(btyDynamic _Click);
    btyDynamic .AutoSizeMode = AutoSizeMode.GrowAndShrink;
    btyDynamic .AutoSize = true;
    btyDynamic .Text = i.ToString();
    btyDynamic .Tag = i.ToString();;
}

protected void btyDynamic(object sender, EventArgs e)
{
   Button btn= sender as Button;
   string strTag= btn.Tag.ToString();
   switch(strTag)
   {
      case "0":
         btn.BackColor=Color.LightSteelBlue;
       break;
     // Like this I am writing, now when in Case2 I need to remove the color of the first button and to show the backcolor of second button
   }
}
4

6 に答える 6

0

設定したいコントロールの背景色のみを設定していることを確認してください。変更したいことを伝えるために、タグに固有のものを付けます。

private Color offColor = Color.Red;
private Color onColor = Color.Blue;
private String btyPrefix = "bty";

private void btyDynamic_click(object sender, EventArgs e)
{
    Control control = (Control)sender;
    // enumerate this.Controls, but if they go into a different container, enumerate over that
    this.Controls.OfType<Control>()
        .Where(c => ((String)c.Tag).Contains(btyPrefix))
        .ToList<Control>()
        .ForEach(c =>
            {
                if (control == c)
                    c.BackColor = onColor;
                else
                    c.BackColor = offColor;
            }
    );
}

private void Form1_Load(object sender, EventArgs e)
{
    Button btyDontChange = new Button();
    btyDontChange.AutoSize = true;
    btyDontChange.AutoSizeMode = AutoSizeMode.GrowAndShrink;
    btyDontChange.Text = "x";
    btyDontChange.Tag = "something";
    btyDontChange.Location = new Point(0, 0);
    this.Controls.Add(btyDontChange);
    for (int i = 0; i < 5; i++)
    {
        Button btyDynamic = new Button();
        btyDynamic.Click += new EventHandler(btyDynamic_click);
        btyDynamic.AutoSizeMode = AutoSizeMode.GrowAndShrink;
        btyDynamic.AutoSize = true;
        btyDynamic.Text = i.ToString();
        btyDynamic.Tag = btyPrefix + i.ToString();
        btyDynamic.Location = new Point((i+1) * 50, 0);
        btyDynamic.BackColor = offColor;
        this.Controls.Add(btyDynamic);
    }
}
于 2013-07-10T16:03:39.750 に答える
0

考えられるアルゴリズムは次のとおりです。

  • すでに行っているようにボタンを1回作成し、クリックイベントを1つのハンドラーにバインドします
  • クリックハンドラーで、最初にすべてのボタンを標準の背景色にリセットします
  • クリックハンドラーで、すでに行っているようにスイッチを使用して現在クリックされているボタンを見つけ、このボタンの色を設定します

サンプルコード:

Action resetButtonColor = () => 
{
    button1.BackColor = Colors.Red;
    button2.BackColor = Colors.Red
    button3.BackColor = Colors.Red;
};

resetButtonColor();

var selected = Colors.Green;
switch(strTag)
{
    case "1": button1.BackColor = selected;
    case "2": button2.BackColor = selected;
    case "3": button3.BackColor = selected;
}
于 2013-07-10T15:18:26.350 に答える