从同一列中检索多个值的有效方法

时间:2013-03-12 15:12:20

标签: c# mysql wpf

我想设置一些按钮文本(内容),其中包含我从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 个答案:

答案 0 :(得分: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 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)

如果要扩展问题以便使用循环,则需要使用包含要为其设置属性值的对象的ListArray。在您的特定情况下,将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)循环遍历它们。