我想将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()
}
答案 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;
}
}
}