2

我想使用从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,所以请具体一点。

4

4 回答 4

2

我建议分几个步骤来做,以获得更好的可重用性

步骤1

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"));
       }
    }
}

第2步

修改后的 Olivier Jacot-Descombe 版本

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++;
}
于 2013-03-15T10:14:02.227 回答
0

如果您想扩展您的问题以便使用循环,那么您需要一个List或一个Array包含要为其设置属性值的对象。在您的特定情况下,将您Orders放入 aList<Order>然后您可以使用以下内容:

int count = 0;
foreach (System.Data.DataRow row in dt.Rows)
{
     if(count<orders.Count)
         orders[count++].Text = row["customerid"].ToString();
}
于 2013-03-12T15:19:02.057 回答
0

您需要遍历您的项目以设置相应的值。正如 DJ Kraze 建议的那样,您只是在覆盖相同的控件。并且它将具有最后访问的值(因为一旦循环结束它就不会被覆盖)。

您只需要以某种方式引用您的目标控件,或者如果您正在动态创建控件,那么您每次访问数据库中的一行时都可以简单地传递新创建的控件的引用。

于 2013-03-12T15:22:37.493 回答
0

您可以使用此处找到的方法通过控件名称而不是成员变量来访问控件FindChildWPF 查找控件的方法

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) 循环遍历它们。

于 2013-03-12T15:31:24.743 回答