谁能帮我吗 ?我的foreach循环表单中的所有按钮都不起作用。有一些错误c#

时间:2017-09-23 14:27:43

标签: c# winforms

我想将tableno列的值与表单中的Button.Text进行比较。表格上有50个按钮。想法是如果tableno = button.text那么按钮颜色必须改变。所以我写了这个函数,我正在调用表单加载。但它不起作用。没有错误或异常。从逻辑上讲,这段代码似乎没问题。       我的代码无法识别表单上的按钮。它只是无法进入每个循环。它离开了loop.button颜色没有改变。 任何人都可以帮忙吗?

 public void checktablenoandchangebtncolor()   
 {
           //  List<Button> buttons = new List<Button>();

            SqlCommand command = new SqlCommand("SELECT tableno FROM kottemp ", con);
            con.Open();
            SqlDataReader reader ;
            reader = command.ExecuteReader();
           // string value = command.ExecuteScalar() as string;

             while (reader.Read())
             {
             foreach (Control ctrl in this.Controls)
              {
             if (ctrl is Button)

              {
               if (ctrl.Text == reader["tableno"].ToString())
                {
                ctrl.BackColor = Color.Red;
                  }
              else
                 {
                 ctrl.BackColor = Color.Gray;
                  }
                   }
             }
       }
             reader.Close();
            con.Close()
 }

1 个答案:

答案 0 :(得分:0)

让我们为您提供一种扩展方法:

public static class MyExtensions {
  public static IEnumerable<Control> GetAllControls(this Control control)
  {
    foreach (Control c in control.Controls)
    {
      yield return c;
      foreach (Control c1 in c.GetAllControls())
        yield return c1;
      }
    }
  }
  public static IEnumerable<T> GetList(this SqlConnection con, string query)
  {
    con.Open();
    using(var cmd=new SqlCommand(query,con))
    using(var dr=cmd.ExecuteReader())
    {
      while(dr.Read())
      {
        yield return (T)dr[0];
      }
    }
    con.Close();
  }
}

如果按钮文本保证是唯一的(或者表单上只有几百个控件),这将会容易得多,但由于我不能假设,我使用查找而不是像字典一样这样:

public void checktablenoandchangebtncolor()   
{

  var btns = this.GetAllControls()
    .OfType<Button>()
    .ToLookup(x=>x.Text, x=>x);

  /* Turn all buttons grey */
  foreach(var btn in btns.SelectMany(x=>x))
  {
    btn.BackColor = Color.Grey;
  }

  using(var con = new SqlConnection(...))
  {
    var query = "SELECT tableno FROM kottemp";
    foreach(var key in con.GetList<string>(query));
    {
      foreach(var btn in btns[key])
      {
        btn.BackColor = Color.Red;
      }
    }
  }
}

如果您的表格中没有多条记录,并且您不介意在项目中加Dapper,那么您可以将其简化为:

public void checktablenoandchangebtncolor()   
{
  var btns = this.GetAllControls()
    .OfType<Button>();

  using(var con = new SqlConnection(...))
  {
    var query = "SELECT tableno FROM kottemp";
    var list = con.Query<string>(query);

    foreach(var btn in btns)
    {
      btn.BackColor = list.Contains(btn.Text)
        ? Color.Red
        : Color.Grey;
    }
  }
}