2008-10-07 11 views
10

ich bin ein Repeater eine Reihe von Kontrollkästchen erzeugen zu wollen, z.B .:ASP.NET: Wie auf Repeater generierte Formulareingabeelemente zugreifen?

<tr><td><input type="checkbox" name="t" value="11cbf4deb87" /> <input type="checkbox" name="a" value="33cbf4deb87" />stackoverflow.com</td></tr> 
<tr><td><input type="checkbox" name="t" value="11cbf4deb88" /> <input type="checkbox" name="a" value="33cbf4deb87" />microsoft.com</td></tr> 
<tr><td><input type="checkbox" name="t" value="11cd3f33a89" /> <input type="checkbox" name="a" value="33cbf4deb87" />gmail.com</td></tr> 
<tr><td><input type="checkbox" name="t" value="1138fecd337" /> <input type="checkbox" name="a" value="33cbf4deb87" />youporn.com</td></tr> 
<tr><td><input type="checkbox" name="t" value="11009efdacc" /> <input type="checkbox" name="a" value="33bf4deb87" />fantasti.cc</td></tr> 

Frage 1: Wie einzeln i jedes Kontrollkästchen Referenz, wenn der Repeater läuft, so kann ich den einzigartigen Wert eingestellt?

Do i Daten-bind es mit so etwas wie:

<itemtemplate> 
    <tr> 
     <td> 
     <input type="checkbox" name="t" 
      value="<%# ((Item)Container.DataItem).TangoUniquifier %>" /> 
     <input type="checkbox" name="a" 
      value="<%# ((Item)Container.DataItem).AlphaUniquifier %>" /> 
     <%# ((Item)Container.DataItem).SiteName %> 
     </td> 
    </tr> 
</itemtemplate> 

Oder soll ich es in der OnItemDataBound irgendwie einstellen?

<asp:repeater id="ItemsRepeater" 
     OnItemDataBound="ItemsRepeater_OnItemDataBound" runat="server"> 
    ... 
    <itemtemplate> 
     <tr> 
     <td> 
      <input id="chkTango" type="checkbox" name="t" runat="server" /> 
      <input id="chkAlpha" type="checkbox" name="a" runat="server" /> 
      <%# ((Item)Container.DataItem).SiteName %> 
     </td> 
     </tr> 
    </itemtemplate> 
    ... 
</asp:repeater> 


protected void ItemsRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    // if the data bound item is an item or alternating item (not the header etc) 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     // get the associated item 
     Item item = (Item)e.Item.DataItem; 

     //??? 
     this.chkTango.Value = item.TangoUniquifier; 
     this.chkAlpha.Value = item.AlphaUniquifier; 
    } 
} 

Aber wenn ich soll es in den Code-behind verweisen, wie verweisen ich es im Code-behind? Soll ich es mit der (serverseitigen) ID-Eigenschaft eines <INPUT>-Steuerelements referenzieren? Ich stelle fest, dass die ID eines Steuerelements auf der Serverseite nicht mit der ID identisch ist, die auf dem Client vorhanden sein wird.

Oder muss ich etwas tun, wo ich ein INPUT-Steuerelement mit dem Namen "t" und ein anderes mit dem Namen "a" finden muss? Und welche Art von Kontrolle ist eine CheckBox, mit der ich den Eingabewert einstellen kann?

protected void ItemsRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    // if the data bound item is an item or alternating item (not the header etc) 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     // get the associated item 
     Item item = (Item)e.Item.DataItem; 

     CheckBox chkTango = (CheckBox)e.Item.FindControl("chkTango"); 
     chkTango.Value = item.TangoUniquifier; 

     CheckBox chkAlpha = (CheckBox)e.Item.FindControl("chkAlpha"); 
     chkAlpha.Value = item.AlphaUniquifier; 
    } 
} 

Frage 2: Wenn der Benutzer später Klicks Zustellen, wie kann ich alle überprüft Kontrollkästchen zu finden, oder genauer gesagt ihre Werte?

Muss ich FindControl?

Sind die Repeaterelemente DataItem immer noch auf einem Klickereignishandler vorhanden?

Antwort

13

die Serversteuerung Verwenden Sie stattdessen eine Eingangssteuer Runat machen = Server

<asp:CheckBox id="whatever" runat="Server" /> 

Wenn Sie den Wert in Ihrem ItemDataBound festzulegen, verwenden Sie Findcontrol

CheckBox checkBox = (CheckBox)e.Item.FindControl("whatever"); 
checkBox.Checked = true; 

Wenn Sie die Einzelteile erhalten, Sie Verwenden Sie auch FindControl aus dem Element in einem foreach-Konstrukt. Abhängig davon, wie Sie es daten, ist das DataItem möglicherweise nach einem Postback nicht mehr vorhanden.

foreach (RepeaterItem item in myRepeater.Items) 
{ 
    if (item.ItemType == ListItemType.Item 
     || item.ItemType == ListItemType.AlternatingItem) 
    { 
     CheckBox checkBox = (CheckBox)item.FindControl("whatever"); 
     if (checkBox.Checked) 
     { /* do something */ } 
    } 
} 
  • Viele Menschen sind zu einem sicheren cast 'versuchen, den as Operator mit FindControl() verwenden. Das gefällt mir nicht, denn wenn Sie den Namen des Steuerelements im Formular ändern, können Sie einen Entwicklungsfehler ignorieren und das Aufspüren erschweren. Ich versuche, den Operator as nur zu verwenden, wenn die Kontrolle nicht garantiert ist.

Update für: Welche CheckBox ist welche? In der gerenderten HTML Sie werden zu müssen all diese Checkbox Name

ctl00_cph0_ParentContainer_MyRepeater_ctl01_MyCheckbox 
ctl00_cph0_ParentContainer_MyRepeater_ctl02_MyCheckbox 
ctl00_cph0_ParentContainer_MyRepeater_ctl03_MyCheckbox 

Sie mich nicht, was die Namen sind, weil die foreach item.FindControl() bekommt sie für Sie wie

beenden, und Sie sollten nicht nehmen Sie etwas von ihnen an. Wenn Sie jedoch über foreach iterieren, benötigen Sie normalerweise eine Möglichkeit, auf etwas zurück zu verweisen. Meistens geschieht dies, indem ein asp: HiddenField-Steuerelement neben jedem CheckBox-Steuerelement einen Bezeichner enthält, damit es mit der richtigen Entität übereinstimmt.

Sicherheitshinweis: Es gibt ein Sicherheitsproblem bei der Verwendung von ausgeblendeten Feldern, weil ein verstecktes Feld in Javascript geändert werden kann; Beachten Sie immer, dass dieser Wert vom Benutzer vor der Übermittlung des Formulars geändert werden konnte.

+0

Was ist der bevorzugte Weg zu wissen, welche Checkbox das ist? Es wird Dutzende von "was auch immer" -Kontrollkästchen geben. Es ist richtig, Checkbox.Attributes ["Wert"] zu verwenden? –

+0

Ich habe die Antwort mit einer Möglichkeit aktualisiert, das Kontrollkästchen (oder ein beliebiges Steuerelement) in einem Repeater mit einem versteckten Feld abzugleichen. –

+0

Nicht vergessen: if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem) {... –

4

Sie könnten es einfacher finden, ein CheckBoxList-Steuerelement zu verwenden.

Im einfachen Fall würden Sie DataTextVield und DataValueField auf den Namen und den Wert setzen, den Sie aus Ihrer Datenquelle gezogen haben (vorausgesetzt, dass Sie aus einer Datenquelle auffüllen) und dann binden, um die Elemente zu erstellen.

Wahrscheinlich weniger Arbeit auf Ihrer Seite als das Erstellen der Kontrollkästchen in einem Repeater.

+1

ich speziell zwei Kontrollkästchen hinzugefügt, um eine Antwort auf diese konzeptionelle Frage zu erzwingen; sonst versuchen die Leute Abkürzungen zu finden. –

+0

Ich brauche zur Zeit einige zusätzliche Details zu meiner Checkbox-Liste - ein drittes Datenelement - und kann daher kein CheckBoxList-Steuerelement, sondern einen Repeater verwenden. –

2

Hier sind einige spezifische Code für wie das versteckte Feld zu handhaben:

MARKUP:

<asp:HiddenField ID="repeaterhidden" Value='<%# DataBinder.Eval(Container.DataItem, "value")%>' runat="server" > 

C#:

{

HiddenField hiddenField = (HiddenField)item.FindControl(repeaterStringhidden); 

{ /* do something with hiddenField.Value */ 

}

1

I glaube das KB gab mir die beste Antwort:

http://msdn.microsoft.com/en-us/library/1d04y8ss.aspx

meinen eigenen Mangel an Glück, das scheint nur für die .net 4.0-Version verfügbar zu sein (und ich bin immer noch bei 3.5 SP1 stecken).

zitierte (fett ist mir):

Wenn eine Sonde in einem datengebundenen Steuerung ist, die wiederholt Instanzen der Steuerung erzeugt, ASP.NET erzeugt UniqueID und ClientID Werte für jede Instanz des Steuerung. Der UniqueID-Wert wird generiert, indem der UniqueID-Wert des Namenscontainers, der ID-Wert des Steuerelements und eine fortlaufende Nummer kombiniert werden. Dies ist der Fall in Steuerelementen wie der DataList, Repeater, GridView und ListView-Steuerelemente.

ASP.NET generiert ClientID-Werte in ähnlicher Weise, wenn die ClientIDMode-Eigenschaft auf AutoID festgelegt ist. Dies kann den Verweis auf das Steuerelement im Clientskript erschweren, da Sie die Werte der verwendeten sequenziellen Nummern normalerweise nicht vorhersagen können. Wenn Sie auf datengebundene Steuerelemente aus dem Clientskript zugreifen möchten, können Sie die ClientIDMode-Eigenschaft auf Predictable festlegen. Dies macht es einfacher vorauszusagen, was die ClientID-Werte sein werden.

Wenn Sie die ClientIDMode auf berechenbare, können Sie auch die ClientIDRowSuffixDataKeys Eigenschaft auf den Namen eines Datenfeldes gesetzt, die, wie der Primärschlüssel in einer Datenbanktabelle eindeutig ist. Dies führt dazu, dass ASP.NET eine Client-ID generiert, die im Clientskript einfacher vorhersagbar ist und darauf verweist, wenn Sie Datenschlüsselwerte vorhersagen können.

Also in Version 3.5, mache ich es mit versteckten Feldern:

Verwandte Themen