2017-10-17 10 views
-1

SQL Serverからの読み取り中にこのコードを使用しています。問題は、SQL Serverの結果が何回でもループを実行することです。SQL Serverからの読み取り中に動的ボタンを作成

SqlCommand sqlCmd = new SqlCommand("Select Name from TablesDesigner", con); 

SqlDataReader sqlReader = sqlCmd.ExecuteReader(); 

while (sqlReader.Read()) 
{ 
    for (int row = 0; row < NUM_ROWS; row++) 
    { 
     TableRow tablerow = new TableRow(this); 

     TableLayout.LayoutParams linearLayoutParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.MatchParent, TableLayout.LayoutParams.MatchParent, 1.0f); 
     tablerow.LayoutParameters = linearLayoutParams; 
     table.AddView(tablerow); 

     for (int col = 0; col < NUM_COLS; col++) 
     { 
      int FINAL_COL = col; 
      int FINAL_ROW = row; 

      Button btn = new Button(this); 
      TableRow.LayoutParams linearLayoutParams2 = new TableRow.LayoutParams(TableRow.LayoutParams.MatchParent, TableRow.LayoutParams.MatchParent, 1.0f); 
      btn.LayoutParameters = linearLayoutParams2; 
      btn.Text = sqlReader["Name"].ToString(); 
      tablerow.AddView(btn); 
     } 
    } 
} 

私の結果は以下の通りです:

enter image description here

そして、私の望ましい結果は次のとおりです。私は望ましい結果を得るために、私のループを配置する必要があり

enter image description here

?私は何とかそれを壊すべきですか?

ありがとうございました。

また、2つの行を使用する場合はどうすればよいですか?

+0

。ここでは1つのループしか使用できません。 – shahsani

答えて

1

難しい問題に直面した場合、それを管理可能なビットに分解してください(これはとにかく優れたコーディング方法です)。

まず、必要なデータを1つのリストにまとめます。 Dispose your DataReaderを忘れないでください。

public List<string> GetButtonNames() 
{ 
    var buttonNames = new List<string>(); 
    SqlCommand sqlCmd = new SqlCommand("Select Name from TablesDesigner", con); 
    using (var sqlReader = sqlCmd.ExecuteReader()) 
    { 
     while (sqlReader.Read()) 
     { 
      buttonNames.Add(sqlReader["Name"].ToString()); 
     } 
    } 
    return buttonNames; 
} 

次に、2Dリストに整理する関数を作成します。私はthis questionからこれに関するロジックを盗んだ。

public static List<List<string>> Make2DList(List<string> input, int width=4) 
{   
    var output = new List<List<string>>(); 

    for (int i=0; i < input.Count; i+= width) 
    { 
     output.Add(input.GetRange(i, Math.Min(width, input.Count - i))); 
    } 

    return output; 
} 

リストのリストがあります。 「外側」リストは各テーブル行に対応しています。内側のリストは、その行内の列値のリストです。

ここで必要なのは、テーブルにするためのコードだけです。データをグリッドに整理してあるので、通常のforeach構文を使用すると非常に簡単になります。

public void RenderButtonTable(List<List<string>> names) 
{ 
    var layout = new TableLayout.LayoutParams 
     (
      TableLayout.LayoutParams.MatchParent, 
      TableLayout.LayoutParams.MatchParent, 
      1.0f 
     ); 
    tablerow.LayoutParameters = layout; 

    foreach (var row in names) 
    { 
     TableRow tablerow = new TableRow(this); 
     tablerow.LayoutParameters = layout; 
     table.AddView(tablerow); 
     foreach (var col in row) 
     { 
      Button btn = new Button(this); 
      btn.Text = col; 
      tablerow.AddView(btn); 
     } 
    } 
} 

一緒にそれをすべて入れ:col`変数 `有する内側ループがrow`変数`の反復ごとに点で最大 `NUM_COLS`を実行している

void CreateDynamicButtonsWhileReadingFromSQLServer() 
{ 
    var buttonNames = GetButtonNames(); 
    var gridData = Make2DList(buttonNames, NUM_COLS); 
    RenderButtonTable(gridData); 
} 
+0

ありがとうexellent!しかし、どこにbtn.Click + =(送信者、電子)=> { Toast.MakeText(this、btn.Text、ToastLength.Short);配置する必要があります。 };ボタンクリック名は? – dSaos

+0

ボタンのクリックイベントをどのように処理できますか? – dSaos

+0

[リンク](https://stackoverflow.com/questions/6187944/how-can-i-create-a-dynamic-button-click-event-on-a-dynamic-button) –

関連する問題