从SQL Server读取时创建动态按钮

时间:2017-10-17 00:19:59

标签: c# xamarin

我在从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

我应该在哪里放置循环以获得所需的结果?或者我应该以某种方式打破它?

感谢。

如果我想使用两行呢?

1 个答案:

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

现在您有一个列表列表。 &#34;外部&#34; list对应于每个表行。内部列表是该行中列值的列表。

现在您只需要将代码放入表中即可。因为我们已经将数据组织到网格中,所以我们可以使用普通的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);
}