Frage

ich bin möchte ein Repeater haben eine Reihe von Kontrollkästchen erzeugen, z.

<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

Haben 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 einrichten irgendwie im OnItemDataBound?

<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 der referenzieren Code-behind, wie ich es tue Referenz in dem Code-Behind? mit der (serverseitigen) id-Eigenschaft einer <INPUT> Kontrolle soll ich es verweisen? Ich weiß, dass die ID eines Steuer auf der Server-Seite nicht die gleiche wie die ID ist, die auf dem Client vorhanden sein wird.

oder muss ich etwas zu tun haben, wo ich muss eine INPUT-Regler mit dem Namen „t“ und ein anderer mit dem Namen „a“ finden? Und welche Art von Kontrolle ist ein Kontrollkästchen, das ich ist es Eingabewert festlegen 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 finde ich die alle geprüft Kontrollkästchen, oder genauer gesagt ihre Werte?

Muss ich zu Findcontrol?

protected void DoStuffWithLinks_Click(object sender, EventArgs e)
{
   // loop through the repeater items
   foreach (RepeaterItem repeaterItem in actionItemRepeater.Items)
   {
      Item item = repeaterItem.DataItem as Item;

      // grab the checkboxes
      CheckBox chkAlpha = (CheckBox)repeaterItem.FindControl("chkAlpha");
      CheckBox chkTango = (CheckBox)repeaterItem.FindControl("chkTango");

      if (chkAlpha.Checked)
      {          
         item.DoAlphaStuff(chkAlpha.Name);
      }

      if (chkTango.Checked)
      {
         item.DoTangoStuff(chkTango.Name);
      }
   }
}

Ist der Repeater Artikel DataItem noch dort auf ein Click-Ereignishandler?

War es hilfreich?

Lösung

Mit der Server-Steuerung statt sie ein Eingangssteuer runat = server

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

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

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

Wenn Sie die Einzelteile erhalten, können Sie auch Findcontrol aus dem Elemente in einem foreach-Konstrukt verwenden. Auch je nachdem wie man es datengebundene, die DataItem kann nicht mehr da sein, nach einer Postbacks.

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. Ich mag es nicht, weil, wenn Sie die Steuer Namen auf dem Formular ändern, können Sie geräuschlos einen Entwicklungsfehler ignorieren und machen es schwieriger aufzuspüren. Ich versuche nur den as Operator zu verwenden, wenn die Steuerung nicht dort sein garantiert.

Update für: Welches CheckBox ist die In der gerenderten html Sie werden zu müssen all diese Checkbox Namen wie

Ende
ctl00_cph0_ParentContainer_MyRepeater_ctl01_MyCheckbox
ctl00_cph0_ParentContainer_MyRepeater_ctl02_MyCheckbox
ctl00_cph0_ParentContainer_MyRepeater_ctl03_MyCheckbox

Sie ist egal, was die Namen sind, weil die foreach item.FindControl (), um sie für Sie bekommt, und Sie sollten nichts über sie übernehmen. Wenn Sie jedoch über foreach iterieren, müssen Sie in der Regel eine Möglichkeit, dass auf etwas zurück zu verweisen. Die meiste Zeit dies auch eine asp mit getan wird: Hiddensteuer neben jedem CheckBox eine Kennung halten es zurück zum Spiel bis auf die richtige Einheit.

Sicherheitshinweis : Es gibt ein Sicherheitsproblem bei der Verwendung von versteckten Feldern, weil ein verstecktes Feld kann in JavaScript geändert werden; immer bewusst sein, dass dieser Wert durch den Benutzer geändert worden sein könnte, bevor das Formular abgeschickt wurde.

Andere Tipps

Sie könnte es einfacher finden, eine CheckBoxList Kontrolle zu verwenden.

Im einfachen Fall würden Sie die DataTextVield und die Datavaluefield auf den Namen und den Wert eingestellt, wie aus Ihrer Datenquelle gezogen (vorausgesetzt, Sie aus einer Datenquelle bevöl) und dann binden sie die Elemente erstellen.

Wahrscheinlich weniger Arbeit an Ihrer Seite als die Kontrollkästchen in einem Repeater zu schaffen.

Hier finden Sie einige spezifische Code für wie das versteckte Feld behandeln:

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 */

}

Ich glaube, das KB gab mir die beste Antwort:

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

Zu meinem 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).

zitieren (fett ist von mir):

  

Wenn eine Sonde in einer datengebundenen Steuerung ist, das wiederholt Instanzen der Steuerung erzeugt, erzeugt ASP.NET UniqueID und ClientID Werte für jede Instanz der Steuerung. Der UniqueID Wert wird durch die Kombination der Benennungscontainer des UniqueID Wertes erzeugt wird, die ID-Wert der Kontrolle, und eine laufende Nummer. Dies ist der Fall bei den Kontrollen wie die Datalist, Repeater , Gridview und Listview-Steuerelemente.

     

ASP.NET erzeugt ClientID Werte in einer ähnlichen Weise, wenn die Eigenschaft auf ClientIDMode AutoID gesetzt ist. Dies kann es schwierig machen, die Steuerung im Client-Skript zu verweisen, weil Sie in der Regel nicht die Werte der aufeinanderfolgenden Zahlen vorhersagen können, die verwendet werden. Wenn Sie datengebundene Steuerelemente von Client-Skript zugreifen möchten, können Sie setzen Sie die ClientIDMode Eigenschaft auf vorhersagbar. Dies macht es einfacher vorherzusagen, was die ClientID Werte sein wird.

     

Wenn Sie die ClientIDMode Vorhersehbare, können Sie auch setzen die ClientIDRowSuffixDataKeys Eigenschaft auf den Namen eines Datenfeldes, das einzigartig ist , wie der Primärschlüssel in einer Datenbanktabelle. Dies bewirkt, dass ASP.NET eine Client-ID zu erzeugen, die leichter zu im Client-Skript vorherzusagen und Referenz, wenn Sie Daten Schlüsselwerte vorhersagen können.

Also, in der Version 3.5, ich tue es versteckte Felder mit:

    foreach (RepeaterItem item in rptClientes.Items)
    {
        Panel pnl = (Panel)item.FindControl("divCliente");
        Control c = pnl.FindControl("hdnID");
        if (c is HiddenField)
        {
            if (((HiddenField)c).Value == hdnClienteNome.Value)
                pnl.BackColor = System.Drawing.Color.Beige;
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top