【问题标题】:Efficient way to retrieve multiple values from the same column从同一列中检索多个值的有效方法
【发布时间】:2013-02-28 04:29:45
【问题描述】:

我想使用从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 的新手,所以请具体说明。

【问题讨论】:

  • Orderl1.Text = row["customerid"].ToString(); 将始终覆盖现有文本。您可能需要做类似Orderl1.Text += (string)row["customerid"]; 的事情,您实际上在哪里声明或最初使用Orderl1.Text? `将 SQL 代码包装在 try{}catch{} 周围,并逐步执行代码并确保您也获得了值
  • 行本身是否包含一个值(例如客户 ID),可以让您导出您想要设置文本的按钮的名称?例如,如果客户 ID 为 2,您希望将文本设置为 Button2
  • 对我来说,你的代码很好。您可以对其进行重构以使其看起来更好,但核心思想是正确的。尤其是使用 if(rdr.Read()) 的第一种方法 - 可能是最有效的方法(不考虑通过索引而不是列名访问 reader 的值)。
  • 按钮的默认值为空,从我的数据库中检索的值将填充按钮的文本。 customerid 与这个问题无关
  • 不客气。另外,由于您是 StackOverflow 的新手,我想通知您,您可以通过勾选答案旁边的勾号来为好的答案投票并接受对您帮助最大的答案。在本网站上,点赞或接受的答案都算作“感谢”。

标签: c# mysql wpf


【解决方案1】:

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

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

第二步

修改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++;
}

【讨论】:

    【解决方案2】:

    您可以通过使用位于此处的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) 循环遍历它们。

    【讨论】:

    • 我使用的是普通的buttons,但是出于文本换行的原因,我在按钮中放置了一个textblock,当然普通按钮是.Content,而文本块是.Text
    • 我假设是 WinForms,但显然您使用的是 WPF。 (我添加了相应的标签。)
    • 是的,确实,我使用 wpf,我认为它与这个问题无关......谢谢!
    • 我将答案更改为使用 WPF。我希望它会起作用(我自己没有使用 WPF)。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      如果你想扩展你的问题以便使用循环而不是你需要有一个 List 或一个 Array 包含你想要设置属性值的对象。在您的特定情况下,将您的 Orders 放在 List&lt;Order&gt; 中,然后您可以使用以下内容:

      int count = 0;
      foreach (System.Data.DataRow row in dt.Rows)
      {
           if(count<orders.Count)
               orders[count++].Text = row["customerid"].ToString();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 2014-12-31
        • 1970-01-01
        • 1970-01-01
        • 2012-05-28
        相关资源
        最近更新 更多