2009-03-05 7 views
0

動的な調査ページを作成しようとしています。考え方は簡単ですが、ASP.NETで実装しようとすると、私は非常に不満を感じています...動的に生成されたRadioButtonListsをデータバインド(双方向)できますか?

各ユーザーは(複数の選択肢の)質問の個別リストにリンクしています。

調査:

User | Question | Rank 
-------+------------+----- 
user-x | question-x | 1 
user-x | question-y | 2 
user-y | question-z | 1 
user-y | question-x | 2 

質問:

ID   | Text | Choices 
-----------+------+----------------------- 
question-x | Foo? | yes|no 
question-y | Bar? | never|sometimes|always 
question-z | Baz? | 1|2|3|4|5|6|7|8|9|10 

回答:

User | Question | Answer 
-------+------------+------- 
user-x | question-x | 0 
user-x | question-y | 2 
user-y | question-z | 5 

ので、解答の選択肢がする必要がある文字で区切られた文字列である私は、次のデータテーブルを持っていますデータ結合時に消費され、回答は0ベースのインデックスとして回答に格納されます。 (したがって、ユーザー-xが質問-Yの "常に" と答えた。)ここで

はコードの私の最初のバージョンである:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:dbconn %>" 
    SelectCommand=" 
     SELECT Questions.Text AS Question, Questions.Choices, Answers.Answer 
     FROM Questions 
      INNER JOIN Surveys ON Surveys.Question = Questions.ID 
      LEFT OUTER JOIN Answers ON Questions.ID = Answers.Question 
       AND Users.ID = Answers.User 
     WHERE (Surveys.User = @User) 
     ORDER BY Surveys.Rank"> 
    <SelectParameters> 
     <asp:QueryStringParameter Name="User" QueryStringField="id" /> 
    </SelectParameters> 
</asp:SqlDataSource> 

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1" 
    onitemdatabound="Repeater1_ItemDataBound"> 
    <HeaderTemplate><table></HeaderTemplate> 
    <ItemTemplate> 
     <tr> 
      <td><%# Eval("Question") %></td> 
      <td><asp:Label runat="server" ID="ChoicesLabel"/></td> 
     </tr> 
    </ItemTemplate> 
    <FooterTemplate></table></FooterTemplate> 
</asp:Repeater> 

<asp:Button ID="Button1" runat="server" Text="Submit" onclick="Button1_Click"/> 

と:今すぐ

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) 
     return; 

    DataRowView row = (DataRowView)e.Item.DataItem; 
    RadioButtonList rbl = new RadioButtonList(); 
    rbl.RepeatDirection = RepeatDirection.Horizontal; 
    string[] Choices = row["Choices"].ToString().Split('|'); 
    for (int n = 0; n < Choices.Length; n++) 
    { 
     rbl.Items.Add(new ListItem(Choices[n], n.ToString())); 
    } 
    if (row["Answer"] != DBNull.Value) 
     rbl.SelectedIndex = (int)row["Answer"]; 
    ((Label)e.Item.FindControl("ChoicesLabel")).Controls.Add(rbl); 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
} 

、最初の問題はでした「Submit」をクリックすると、返信先のページが表示されます。には、質問のあるラジオボタンと答えが含まれています。検索の多くの後、私は、ページの初期化で発生するデータバインディングを強制することによって、これを固定:RadioButtonListsに2ウェイデータバインディングを行うことが可能である場合

public void Page_Init(Object sender, EventArgs e) 
{ 
    Repeater1.DataBind(); 
} 

はしかし、私は完全に暗闇の中ではまだですか? (私は<%#Bind()%>コマンドを使用しています)、または答えをデータベースに送り返すための独自の手順を記述する必要がありますか?物事をより複雑にするために、最初の訪問時に回答はAnswersテーブルにINSERTする必要があり、帰国訪問時には既存の行をUPDATEすることができます。

答えて

1

はい、私はDropDownListでバインドを使用する場合、同様の問題を発見しました。私がやっているのは、あなたの例からRadioButtonListから継承したカスタムコントロールを作成することです。私はValueという1つの追加のプロパティを与えます。これが設定されたら、選択した項目を値を使って設定するようにコーディングします。私は、getを呼び出すと本質的にあなたがRadioButtonListのを継承したカスタムクラスを必要とするので、私はそれを余分な財産を与える実際の選択した値を返す

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI.WebControls; 

/// <summary> 
/// Summary description for BindingRadioButtonList 
/// </summary> 
public class BindingRadioButtonList : RadioButtonList 
{ 
    public string Value 
    { 
     get 
     { 
      return this.SelectedValue; 
     } 
     set 
     { 
      if (this.Items.FindByValue(value) != null) 
      { 
       this.ClearSelection(); 
       this.Items.FindByValue(value).Selected = true; 
      } 
     } 
    } 

    public BindingRadioButtonList() 
    { 
     // 
     // TODO: Add constructor logic here 
     // 
    } 
} 

私は、簡単にこの使用することができます。

<cc1:BindingRadioButtonList ID="a1" runat="server" Value='<%#Bind("YourValue")%>'> 
</cc1:BindingRadioButtonList> 

アンドリュー

+0

これを消費する方法を理解しようとしています。 DLLとしてコンパイルしてツールボックスに追加する必要がありますか? – paulwhit