我想设置一些按钮文本(内容),其中包含我从mysql
检索的值。
if (rdr.Read())
{
Item1.Visibility = Visibility.Visible;
Item1txt.Text = rdr.GetString("item_name");
}
if (rdr.Read())
{
Item2.Visibility = Visibility.Visible;
Item2txt.Text = rdr.GetString("item_name");
}
if (rdr.Read())
{
Item3.Visibility = Visibility.Visible;
Item3txt.Text = rdr.GetString("item_name");
}
这种方式工作正常,因为我在每个按钮中检索正确的值,但它使可读性变得可怕..
当我开始这个项目时,我对C#一无所知,所以我尝试了一些类似的东西:
while (rdr.Read())
{
Item4.Visibility = Visibility.Visible;
Item4txt.Text = rdr.GetString("item_name");
Item5.Visibility = Visibility.Visible;
Item5txt.Text = rdr.GetString("item_name");
}
但这给了我在我的按钮中从我的数据库中检索到的相同值。
示例:
button 1: test1 | button 2: test1 | button 3: test1.. etc..
我需要的是什么:
button 1: test1 | button2: test2 | button 3: test3.. etc..
现在我对C#的了解每天都在好转,所以我想学习一些新东西。
现在我正在尝试使用foreach循环,但我有一种感觉我错过了一些东西:
using (MySqlConnection conn = new MySqlConnection(_CS))
{
conn.Open();
string cmd = "SELECT * FROM ordertopos LIMIT 10";
MySqlCommand custid = new MySqlCommand(cmd, conn);
using (MySqlDataReader rdr = custid.ExecuteReader())
{
System.Data.DataTable dt = new System.Data.DataTable();
dt.Load(rdr);
foreach (System.Data.DataRow row in dt.Rows)
{
Orderl1.Text = row["customerid"].ToString();
}
}
}
基本上我想知道如何设置我的按钮内容,从mysql中检索,更高效,更容易维护代码..
我对foreach
相当新,所以请具体说明。
答案 0 :(得分:2)
我建议在几个步骤中进行以获得更好的可重用性
List<string> myItems;
using (MySqlConnection conn = new MySqlConnection(_CS))
{
conn.Open();
string cmd = "SELECT * FROM ordertopos LIMIT 10";
MySqlCommand custid = new MySqlCommand(cmd, conn);
using (MySqlDataReader rdr = custid.ExecuteReader())
{
myItems= new List<string>();
while (rdr.Read())
{
myItems.Add(rdr.GetString("item_name"));
}
}
}
已修改Olivier Jacot-Descombe version
for(int i =0; i< myItems.count; i++) {
Button btn = FindChild<Button>(this, "Item" + i); //"this" will be the control which contains your button's
TextBlock tb = FindChild<TextBlock>(btn, "Item" + i + "txt");
btn.Visibility = Visibility.Visible;
tb.Text =myItems[i];
i++;
}
答案 1 :(得分:0)
如果要扩展问题以便使用循环,则需要使用包含要为其设置属性值的对象的List
或Array
。在您的特定情况下,将Orders
放在List<Order>
中然后您可以使用以下内容:
int count = 0;
foreach (System.Data.DataRow row in dt.Rows)
{
if(count<orders.Count)
orders[count++].Text = row["customerid"].ToString();
}
答案 2 :(得分:0)
您需要遍历您的项目以设置相应的值。正如DJ Kraze建议的那样,你只是覆盖了相同的控件。并且它将具有最后访问的值(因为它一旦循环结束就不会被覆盖)。
您只需要以某种方式引用目标控件,或者如果您正在动态创建控件,那么每次从数据库访问行时都可以简单地传递新创建的控件的引用。
答案 3 :(得分:0)
您可以使用此处的FindChild
方法,通过名称而不是其成员变量来访问控件:WPF ways to find controls。
int i = 1;
while (rdr.Read()) {
Button btn = FindChild<Button>(this, "Item" + i);
TextBlock tb = FindChild<TextBlock>(btn, "Item" + i + "txt");
btn.Visibility = Visibility.Visible;
tb.Text = rdr.GetString("item_name");
i++;
}
这使您可以使用计数器(i
)循环遍历它们。