2017-10-17 2 views
-1

J'utilise ce code lors de la lecture à partir de SQL Server. Le problème est qu'il exécute la boucle autant de fois mes résultats SQL Server.Création de boutons dynamiques lors de la lecture à partir de 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); 
     } 
    } 
} 

Mon résultat est ci-dessous:

enter image description here

Et mon résultat souhaité est:

enter image description here

Où dois-je placer ma boucle pour obtenir le résultat désiré? Ou devrais-je le casser d'une manière ou d'une autre?

Merci.

Egalement si je veux utiliser deux lignes ??

+0

La boucle interne avec 'la variable col' exécute jusqu'à' NUM_COLS' pour chaque itération de la variable 'row'. Vous pouvez utiliser une seule boucle ici. – shahsani

Répondre

1

Lorsque vous êtes confronté à un problème difficile, divisez-le en morceaux gérables (c'est une bonne pratique de codage de toute façon).

Tout d'abord, obtenez les données dont vous avez besoin dans une seule liste. Ne pas oublier de 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; 
} 

Ensuite, écrivez une fonction pour l'organiser en une liste 2D. J'ai volé la logique pour cela de 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; 
} 

Maintenant vous avez une liste de listes. La liste "externe" correspond à chaque ligne du tableau. La liste interne est une liste de valeurs de colonne dans cette ligne.

Maintenant tout ce dont vous avez besoin est de code pour en faire une table. Parce que nous avons déjà organisé les données dans une grille, nous pouvons utiliser la syntaxe normale foreach qui le rend très facile.

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

Mettre tous ensemble:

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

Merci beaucoup ça fonctionne exellent !!! Mais où dois-je placer un btn.Click + = (expéditeur, e) => { Toast.MakeText (this, btn.Text, ToastLength.Short); }; Pour prendre Button cliquez sur le nom? – dSaos

+0

Comment puis-je gérer un événement de clic sur un bouton pour chacun de mes boutons? – dSaos

+0

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