Ich versuche eine dynamische Umfrage Seite zu erstellen. Die Idee scheint einfach, aber der Versuch, sie in ASP.NET zu implementieren, macht mich sehr frustriert ...Kann ich (2-Wege) dynamisch generierte RadioButtonLists databinden?
Jeder Benutzer ist mit einer individuellen Liste von (Multiple-Choice-) Fragen verknüpft. Ich habe folgende Datentabellen:
Surveys:
User | Question | Rank
-------+------------+-----
user-x | question-x | 1
user-x | question-y | 2
user-y | question-z | 1
user-y | question-x | 2
Fragen:
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
Antworten:
User | Question | Answer
-------+------------+-------
user-x | question-x | 0
user-x | question-y | 2
user-y | question-z | 5
So sind die Antwortmöglichkeiten sind Zeichen getrennte Zeichenfolgen, die zu benötigen Bei der Datenbindung werden sie verbraucht, und die Antworten werden als 0-basierter Index für die Antwort gespeichert. (So benutzer x "immer" auf Frage-y beantwortet.)
Hier ist meine erste Version des Codes:
<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"/>
und:
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)
{
}
Nun war das erste Problem dass, nachdem ich auf "Senden" geklickt habe, bekomme ich eine Seite zurück, die nur enthält die Fragen, nicht die Radiobuttons mit Antworten! Nach vielen Suchen, fixierte ich dies durch die Daten zwingen Bindung auf Seite Initialisierung auftritt:
public void Page_Init(Object sender, EventArgs e)
{
Repeater1.DataBind();
}
aber ich bin immer noch völlig im Dunkel, wenn es möglich ist, eine 2-Wege-Datenbindung an den RadioButtonLists zu tun? (Ich meine mit einem <% # Bind()%> Befehl.) Oder muss ich meine eigene Prozedur schreiben, um die Antworten zurück an die Datenbank zu senden? Um die Sache noch komplizierter zu machen, müssen die Antworten beim ersten Besuch in die Answers-Tabelle eingefügt werden, während bei wiederkehrenden Besuchen die vorhandenen Zeilen aktualisiert werden können.
Versuchen herauszufinden, wie dies zu konsumieren. Muss ich als DLL kompilieren und es meiner Toolbox hinzufügen? – paulwhit