2017-10-17 56 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

我应该在哪里把我的环路获得期望的结果?或者我应该以某种方式破坏它?

谢谢。

另外如果我想使用两行?

+0

用'col'可变内环正在执行高达'NUM_COLS'为row'可变的'每次迭代。你可以在这里只使用一个循环。 – shahsani

回答

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

把它放在一起:

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

非常感谢你的作品优秀!但是我应该在哪里放置一个btn.Click + =(sender,e)=> 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) –