2011-01-12 12 views
0

Ich habe folgende Client-Seite Code in ASPX-Seite innerhalb einer Datalist itemtemplate, die Fragen aus der Datenbank, wie dies geschieht:Konvertieren von clientseitigen HTML-Optionsfeldern in ASP.net-Websteuerelemente mit dynamischen IDs. (ASP.net) (VB)

<Itemtemplate> 
<b> <%=GetQuestionNum()%>) 
      <%#Server.HtmlEncode(Eval("Text").ToString())%></b> 
      <br /> 
      <asp:Panel ID="A" runat="server" Visible='<%#GetVisible(Eval("OptionA").Tostring())%>'> 
       <input name="Q<%#Eval("ID")%>" type="radio" value="A"> 
       <%#Server.HtmlEncode(Eval("OptionA").ToString())%> 
       </option><br /> 
      </asp:Panel> 
      <asp:Panel ID="B" runat="server" Visible='<%#GetVisible(Eval("OptionB").Tostring())%>'> 
       <input name="Q<%#Eval("ID")%>" type="radio" value="B"> 
       <%#Server.HtmlEncode(Eval("OptionB").ToString())%> 
       </option><br /> 
      </asp:Panel> 
      <asp:Panel ID="C" runat="server" Visible='<%#GetVisible(Eval("OptionC").Tostring())%>'> 
       <input name="Q<%#Eval("ID")%>" type="radio" value="C"> 
       <%#Server.HtmlEncode(Eval("OptionC").ToString())%> 
       </option><br /> 
      </asp:Panel> 
      <asp:Panel ID="D" runat="server" Visible='<%#GetVisible(Eval("OptionD").Tostring())%>'> 
       <input name="Q<%#Eval("ID")%>" type="radio" value="D"> 
       <%#Server.HtmlEncode(Eval("OptionD").ToString())%> 
       </option><br /> 
      </asp:Panel></itemtemplate> 

Der Ausgang ist wie:

1) Was ist Ihre Altersgruppe?
- Option 1
- Option 2
- Option 3
- Option 4

die IDs der Optionsfelder sind dynamisch ("Q" & QuestionID). Wenn auf eine Frage keine Antwort vorliegt, gibt die GetVisible-Funktion false zurück und das enthaltende Bedienfeld ist ausgeblendet.

Ich habe versucht, das HTML loszuwerden und diese durch asp: radiobuttons zu ersetzen, aber es ist nicht möglich IDs von Databinding zu setzen .. nur einfach. Ich habe versucht, so etwas wie:

<asp:RadioButton ID="Q<%#Eval("ID")%>" runat="server" Visible='<%#GetVisible(Eval("OptionA").Tostring())%>' 
       Text='<%#Server.HtmlEncode(Eval("OptionA").ToString())%>' /> 

Hier ist die Funktion, die Daten zur Verfügung stellt:

Public Shared Function GetQuestionsForSurvey(ByVal id As Integer) As DataSet 
    Dim dsQuestions As DataSet = New DataSet() 
    Try 
     Using mConnection As New SqlConnection(Config.ConnectionString) 
      Dim mCommand As SqlCommand = New SqlCommand("sprocQuestionSelectList", mConnection) 
      mCommand.CommandType = CommandType.StoredProcedure 
      Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter() 
      myDataAdapter.SelectCommand = mCommand 
      mCommand.CommandType = CommandType.StoredProcedure 
      mCommand.Parameters.AddWithValue("@id", id) 
      myDataAdapter.Fill(dsQuestions) 
      mConnection.Close() 
      Return dsQuestions 
     End Using 
    Catch ex As Exception 
     Throw 
    End Try 
End Function 

aber ich finde es unmöglich, die Arbeit mit den HTML-Kontrollen, dh erhält ihren .text Wert von Code-Behind oder Ereignisse hinzufügen!

Bitte schlagen Sie einen Experten eine bessere Möglichkeit vor, den HTML-Code durch geeignete ASP.net-Websteuerelemente oder aus dem Codebehind zu ersetzen und auszugeben. Oder weisen Sie mich in die richtige Richtung?

Danke: 0)

Antwort

1

hatte ich einige Erfahrung mit ASP steuert und Datenbindung. Das Problem, mit dem Sie konfrontiert sind, ist wahrscheinlich die Tatsache, dass sobald Sie ein Steuerelement über Markup deklarieren Sie nicht aus Datenbindung zugreifen können. Außerdem sollten Sie die serverseitige ID nicht mit der clientseitigen ID verwechseln.

Die serverseitige ID, die der Eigenschaft Id der Steuerelemente zugeordnet ist, wird zum programmgesteuerten Zugriff auf das Steuerelement über den Code dahinter verwendet. Clientseitige ID ist die ID, die in das Attribut id des Tags eingefügt wird und der Eigenschaft ClientId zugeordnet ist.

Aus Ihrer Frage zu schließen, was Sie brauchen, ist eine Multi-Choice-Umfrage zu erstellen, und meiner Meinung nach ist es nicht wichtig, wie die IDs generiert werden, nur dass sie für jede Frage richtig gruppiert sind.

Ich werde den Teil der programmatischen Zugriff auf Steuerelemente in der Datenbindung, die ein Teil Ihrer Frage ist beantworten.

Hier ist ein Beispiel aus meinem Code. Angenommen, Sie haben eine sehr einfache Gridview wie diese

<asp:GridView ID="example" runat="server" OnRowDataBound="DataBound"> 
    <Columns> 
     <asp:TemplateField HeaderText="New"> 
      <ItemTemplate> 
       <asp:Image ID="imgExample" runat="server" /> 
      </ItemTemplate> 
    </Columns> 
</asp:GridView> 

Es einen Datensatz während der Daten nimmt verbindlich und setzt das Bild nach einer Eigenschaft. Es funktioniert genauso wie DataList, keine Sorge.

Jetzt, in Code hinter, behandeln Sie die RowDataBoundEvent.Sie können nicht direkt auf das Objekt imgExample zugreifen, da es ein untergeordnetes Element von ItemTemplate ist. Wenn die Zeile gebunden ist, haben Sie direkten Zugriff auf die Reihe und dann können Sie die FindControl Methode der Control Klasse

Hier verwenden ist C# Codebeispiel (leicht zu VB konvertieren)

protected void DataBound(object sender, GridViewRowEventArgs e) 
{ 
     if (e.Row.RowType == DataControlRowType.DataRow) //Required 
     { 
      GridViewRow row = e.Row; 

      [...] //get an email message 

      (row.Cells[0].FindControl("imgExample") as Image).ImageUrl = (email.AlreadyRead) 
                      ? "Mail_Small.png" 
                      : "Mail_New_Small.png"; 
     } 
} 

Anwendung auf Ihrem Fall

Um eine Multi-Choice-Umfrage zu erstellen, ist mein Rat, eine DataList zu erstellen, die Fragen (das äußere Steuerelement) hält und dann für jede Zeile eine RadioButtonList deklariert, die Antworten enthält (das innere Steuerelement). Binden Sie die äußere Datenliste an den Datensatz mit Fragen und Antworten. Behandeln Sie das RowDataBound-Ereignis oder wie immer es in der DataList-Welt aufgerufen wird. Wenn Sie mit diesem Ereignis arbeiten, binden Sie die innere Radiobuttonliste an die Antworten.

Es sollte für Sie

+0

Das war eine große Hilfe, Danke – Phil

1

arbeite ich an etwas ähnliches tatsächlich arbeiten bin im Moment. Ich benutze Javascript und jQuery, um dynamisch Steuerelemente zu meiner Seite hinzuzufügen. Nach der Zugabe von ihnen auf meiner Seite habe ich die neuen Kontrollen zu erhalten, deren Text, etc. Die Art und Weise habe ich es getan, ist so etwas wie dieses:

<table id='BuilderTable' class="BuilderTable"> 
    <tbody class='BuilderBody'> 
    </tbody> 
</table> 
<asp:Button runat="server" ID="saveButton" OnClick="SaveButton_Click" OnClientClick="SaveData()" 
    Text="Save Form" /> 
<asp:HiddenField runat="server" ID="controlsData" /> 

Diese Tabelle ist, wo ich alle meine neuen Kontrollen setzen.

dann, wenn der Client die Taste es erste Anrufe diese Javascript speichern klickt/jQuery-Funktion:

function SaveData() { 
     var controlRows = $('#BuilderTable tr.control'); 
     var controls= []; 
     controlRows.each(function (index) { 
      //process control information here ... 
      controlText = //use jQuery to get text, etc... 
      var control = { 
       Index: (index + 1), 
       Text: controlText 
      }; 
      controls.push(control); 
     }); 
     var str = JSON.stringify(questions); 
     $('#<%= controlsData.ClientID %>').val(str); 
    } 

Dann wird der Server-Seite Funktion für die Schaltfläche klicken aufgerufen wird (dies in C# in passen zu VB).

protected void SaveButton_Click(object sender, EventArgs e) 
{ 
     JavaScriptSerializer jss = new JavaScriptSerializer(); 
     string str = controlsData.Value; 
     List<Control> controls = jss.Deserialize<List<Control>>(str); 
} 

eine Control-Klasse wie folgt aus:

public class Control 
{ 
     public int Index { get; set; } 
     public string Text { get; set; } 
} 

Dieser Code verwendet JavaScript und jQuery Ihre Steuerelemente zu bekommen, JSON die Daten serialisiert und in einem asp Hidden dann die Daten server- greifen speichern Seite und Deserialisierung in Objekte, die Ihr Code verwenden kann. Dann nimm die Daten und mach was immer du brauchst.