2010-10-20 27 views
1

Je suis en train de créer dynamiquement une table avec des boutons radio, des zones de texte et des boutons sur chaque ligne uniquement en fonction de la question à gauche du TableRow avec deux TableCells.Comment ajouter dynamiquement des boutons radio, des texboxes et des boutons dans une table par code?

Jusqu'ici, j'ai pu ajouter les questions à la gauche du TableRow. Maintenant, j'ai du mal à remplir le bon côté.

Quelqu'un peut-il m'aider?

J'ai le code ci-dessous:

private void DesignQuestionnaire(string[] questionList, Label question, RadioButtonList answerChoices, RadioButton choices, TextBox textAnswer, Button save, Button cancel) 
    { 
     Table formTable = new Table(); 
     TableRow formRow; 
     TableCell formCell; 

     for (int row = 0; row < questionList.Length; row++) 
     { 
      formRow = new TableRow(); 
      formTable.Rows.Add(formRow); 

      for (int col = 0; col < 2; col++) 
      { 
       formCell = new TableCell(); 
       //formCell.Attributes.CssStyle.Add("border", "solid"); 
       if (col == 1) 
       { 
        formCell.ID = "A" + row.ToString(); 
        formCell.Controls.Add(choices); 
       } 
       else 
       { 
        formCell.ID = "Q" + row.ToString(); 
        formCell.Text = questionList.GetValue(row).ToString(); 
       } 
       formRow.Cells.Add(formCell); 
      } 
     } 
     Controls.Add(formTable); 
    } 
+0

S'agit-il d'ASP.NET WebForms ou de Winforms? – tsimbalar

+0

Je pense que c'est un formulaire ASP.Net, car il y a une ligne "formCell.Attributes.CssStyle.Add (" border "," solid ");" – Kay

+0

@Kay: oh oui, c'était une question stupide :-) – tsimbalar

Répondre

0

Je poignée habituellement ce genre de situation à l'aide d'un contrôle Repeater.

Dans le ASPX, vous auriez quelque chose comme ça:

<asp:Repeater ID="myRepeater" runat="server" OnItemDataBound="R1_ItemDataBound"> 
<HeaderTemplate> 
<table> 
</HeaderTemplate> 

<ItemTemplate> 
<tr> 
    <td> 
     <asp:Literal id="litQuestion" runat="server"> 
    </td> 
    <td> 
     <asp:PlaceHolder id="phRow" runat=server"/> 
    </td> 
<td> 
</ItemTemplate> 

<FooterTemplate> 
</table> 
</FooterTemplate> 
</asp:Repeater> 

Dans le code-behind, vous auriez:

la charge de la page, que si elle n'est pas un postback

myRepeater.DataSource = myQuestions; // myQuestions would be a list of questions, for instance 
myRepeater.DataBind(); 

Et plus tard

void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) { 

      // This event is raised for the header, the footer, separators, and items. 

      // Execute the following logic for Items and Alternating Items. 
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { 
      string question = (string)e.Item.DataItem; 
      Literal litQuestion = (Literal) e.Item.FindControl("litQuestion"); 
      litQuestion.Text = question; 

      PlaceHolder phRow = (PlaceHolder) e.Item.FindControl("phRow"); 

      if (question.StartsWith("something")){ 
       phRow.Controls.Add(new RadioButton("blabla")); 
      } 

      if (((Evaluation)e.Item.DataItem).Rating == "Good") { 
       ((Label)e.Item.FindControl("RatingLabel")).Text= "<b>***Good***</b>"; 
      } 
      } 
     } 

Notez le OnItemDataBound dans l'aspx: cela signifie que R1_ItemDataBound sera appelé pour chaque élément de votre liste de questions.

+0

Salut tsimbalar, je viens de lire votre réponse. Je ne semble pas comprendre comment je pourrais créer Repeater dans le code. Merci pour la réponse si. – janejanejane

+0

mon erreur, j'aurais dû taper 'asp: Repeater' au lieu de simplement' Repeater' ... – tsimbalar