日期:2014-05-18  浏览次数:20809 次

100个按钮按下后改变颜色
现在我有这样一个需求,我的程序有100个按钮,代表100件货物,每个按钮按下后会改变自身颜色。

但对于每一个按钮,都要写一次类似的过程:
  private void btnDm001_Click(object sender, EventArgs e)
  {
  if (btnDm001.ForeColor == Color.LightGray)
  {
  btnDm001.ForeColor = Color.OrangeRed;
  }
  else
  {
  btnDm001.ForeColor = Color.LightGray;
  }
  }

那么100个按钮不就是要写100次?不知道C#有没有机制来精简这一需求。

------解决方案--------------------
C# code

private void btnDm_Click(object sender, EventArgs e)
  {
  Button btnDm = sender as Button;
if(btnDm==null)
    return;
if (btnDm.ForeColor == Color.LightGray)
  {
  btnDm.ForeColor = Color.OrangeRed;
  }
  else
  {
  btnDm.ForeColor = Color.LightGray;
  }
  }

btnDm001.Click+=new EventHandler(btnDm_Click);
btnDm002.Click+=new EventHandler(btnDm_Click);
btnDm003.Click+=new EventHandler(btnDm_Click);
...

------解决方案--------------------
不用呀,你继承个button,重写下按下事件,在这里换图片或颜色。
然后所有地方都用这个button。
这就是所谓的自定义控件的用法。
------解决方案--------------------
C# code
//事件方法可以简化下
private void btnDm001_Click(object sender, EventArgs e)
{
    var btn = (Button)sender;
    btn.ForeColor = btn.ForeColor != Color.LightGray ? Color.LightGray : Color.OrangeRed;
}

// 用这段代码给 btnDm001 - btnDm100 的按钮绑定事件
for (int i = 1; i <= 100; i++)
{
    this.Controls.Find("btnDm" + i.ToString("D3"), false)[0].Click += new EventHandler(btnDm001_Click);
}

------解决方案--------------------
只要写一个函数,每个按钮都绑定这个函数。
如果你的按钮命名是有规律的,或者是统一放在一个容器里。可以用循环绑定。
foreach (Control c in this.Controls)
{
 if (c is Button)
(c as Button).Click+=new EventHandler(btnDm_Click);
}
------解决方案--------------------
假设你的100个按钮的Name为buttonDm001-buttonDm100,这样写:
C# code
        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 1; i <= 100; i++)
                this.Controls["buttonDm" + i.ToString("D3")].Click += new EventHandler(Form1_Click);
        }

        void Form1_Click(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            if (btn.ForeColor == Color.LightGray)
                btn.ForeColor = Color.OrangeRed;
            else
                btn.ForeColor = Color.LightGray;
        }