Frage

Kann mir jemand sagen, wie kann ich dies funktioniert. Ich mag Drop-Down-Steuerelemente in einem Repeater-Steuerelement unterscheiden. Ich verstehe jetzt, über die lifecyle und wie der Puffer bereits writen ist, aber was sind meine Alternativen? Hier ist, was passiert,

Code-Datei

    Dim repeatTimes((TotalAdInsured - 1)) As Integer

    myRepeater.DataSource = repeatTimes
    myRepeater.DataBind()

Aspfile

<asp:Repeater ID="myRepeater" runat="server">
    <ItemTemplate>
         <asp:DropDownList ID="AdTitle<%# Container.ItemIndex %>" runat="server">
             <asp:ListItem Selected="True" Value="" Text=""/>
             <asp:ListItem Selected="False" Value="Miss" Text="Miss"/>
             <asp:ListItem Selected="False" Value="Ms" Text="Ms"/>
             <asp:ListItem Selected="False" Value="Mrs" Text="Mrs"/>
             <asp:ListItem Selected="False" Value="Mr" Text="Mr"/>
             <asp:ListItem Selected="False" Value="Other" Text="Other"/>
         </asp:DropDownList>
    </ItemTemplate>
</asp:Repeater>

gibt diesen Fehler zurück

  

Parser-Fehlermeldung:. 'AdTitle <% # Container.ItemIndex%>' ist kein gültiger Bezeichner

War es hilfreich?

Lösung

  

Ich möchte Drop-Down unterscheiden   Kontrollen in einem Repeater-Steuerelement.

Sie brauchen nicht zu. Hier einige Beispiel-Code, den Sie heraus helfen könnten:

Markup:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label runat="server" ID="lblMsg" Text="Click a button" />
        <hr />
        <asp:Repeater runat="server" ID="rptAwesome" onitemcommand="rptAwesome_ItemCommand"
            >
            <ItemTemplate>
                <asp:Button runat="server" ID="btnAwesome"
                    Text='<%# "Button #" + Container.ItemIndex %>'
                    CommandArgument='<%# Container.DataItem %>'/><br />
            </ItemTemplate>
        </asp:Repeater>
    </div>
    </form>
</body>
</html>

Codebehind:

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            var x = new int[] { 1, 2, 3, 4, 5 };
            rptAwesome.DataSource = x;
            rptAwesome.DataBind();
        }
    }
    protected void rptAwesome_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        Button btnAwesome = (Button)e.CommandSource;
        lblMsg.Text = string.Format("btnAwesome.ID = {0}, e.CommandArgument = {1}", btnAwesome.ID, e.CommandArgument);
    }
}

Andere Tipps

Sie können keine eindeutige ID in einem Repeater durch die Markup wie das erstellen. Sie können jedoch die Drop-down in dem Code-Behind abrufen, indem Sie Findcontrol auf dem Repeater.

Dim adTitle As DropDownList = MyRepeater.FindControl("AdTitle")
If (Not adTitle Is Nothing) Then
  ''Do something here
End If

Ok ... auf den Punkt gebracht kann man nicht tun, was Sie versuchen, in der Art und Weise zu tun Sie gerade tun es.

  

Die ID-Eigenschaft eines Steuerelements kann nur das ID-Attribut in dem Tag und einen einfachen Wert eingestellt werden. Beispiel: <asp:Button runat="server" id="Button1" />

Ich kann sehen, was Ihr zu tun versuchen, aber ich weiß nicht wirklich verstehen, warum ...

Eine Repeater Steuerung 1 Artikel enthält, pro Stück in Ihrer Datenquelle, also ist es völlig in Ordnung ist nur Ihre Dropdownlist ID="AdTitle" zu nennen als dass eine andere 'AdTitle' von dem in der nächsten Reihe sein wird.

Um sie zu erhalten Server-Seite zurück, würden Sie gerade durchlaufen die Artikel im Repeater & FindControl("AdTitle") die spezifischen Dropdownlist für das Element zu erhalten.

Wenn es unbedingt notwendig ist, die IDs zu haben, erhöht wird, werden Sie dies programmatisch tun müssen, um (wahrscheinlich auf dem ItemDataBound Ereignisse eine Dropdownlist erstellen und fügen Sie es zu Ihrem ItemTemplate.

Die Erweiterung auf BC Antwort: Ich habe das gleiche Problem hatte vor kurzem, wenn auch mit einer Checkbox, ich die ID einzustellen benötigen wie früher, dass, wenn anhaltenden Entscheidungen. Ein bisschen klobig, aber ich tat es, wenn auf Positionsdaten gebunden.

Hier ist das Markup:

<asp:Repeater ID="Repeater1" runat="server" >
<HeaderTemplate>Header<br /><br /></HeaderTemplate>
<ItemTemplate>
    <asp:CheckBox ID="cb" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>' />
     ...other controls removed for brevity
</ItemTemplate>
<FooterTemplate>
    <asp:Button ID="Button1" runat="server" OnClick="Submit" Text="Submit" />
</FooterTemplate>
</asp:Repeater>

richte ich und verpflichtet, eine Sammlung dieser Klasse

public class mst
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Number { get; set; }
    public bool NumberRequired { get; set; }
}

Die notwendigen in Page_Load

        Repeater1.ItemDataBound += new RepeaterItemEventHandler(Repeater1_ItemDataBound);
        Repeater1.DataSource = listOfMsts;
        Repeater1.DataBind();

Gefolgt von dieser, wo ich ID:

    void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            var mst = (mst)e.Item.DataItem;
            ((CheckBox)e.Item.FindControl("cb")).ID = mst.Id.ToString();
        }
    }

Also, wenn die Submit-Button getroffen wird kann ich Schleife durch und die Id die greifen geprüft und sparen:

  protected void Submit(object sender, EventArgs e)
    {
    foreach (var item in Repeater1.Items)
        {
            var checkboxes = ((RepeaterItem)item).Controls.OfType<CheckBox>().ToList();
            if (checkboxes[0].Checked)
            {
                Save(checkboxes[0].ID);
                ....other stuff
            }
        }
    }

Sie können einen Ereignishandler Repeater.ItemDataBound hinzufügen und die Kontrolle innerhalb der Handler an den Elementcontainer unter Verwendung des Referenz erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top