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

FindChildここにあるメソッドを使用して、メンバー変数の代わりに名前でコントロールにアクセスできます:コントロールを見つけるための WPF の方法

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 に答える
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();
}
于 2013-03-12T15:19:02.057 に答える
0

それぞれの値を設定するには、アイテムをトラバースする必要があります。DJ Kraze が示唆したように、同じコントロールを上書きしているだけです。そして、最後にアクセスされた値を持ちます (ループが終了すると上書きされないため)。

データベースから行にアクセスするたびに、新しく作成されたコントロールの参照を渡すだけでなく、ターゲットコントロールへの何らかの参照が必要です。または、オンザフライでコントロールを作成している場合。

于 2013-03-12T15:22:37.493 に答える