ASP.NET динамически изменяет идентификатор раскрывающегося списка внутри элемента повторителя

StackOverflow https://stackoverflow.com/questions/932186

  •  06-09-2019
  •  | 
  •  

Вопрос

Может кто-нибудь сказать мне, как я могу заставить это работать.Я хочу выделить раскрывающиеся элементы управления внутри элемента управления повторителем.Теперь я понимаю жизненный цикл и то, как буфер уже записан, но каковы мои альтернативы?Вот что происходит

Файл кода

    Dim repeatTimes((TotalAdInsured - 1)) As Integer

    myRepeater.DataSource = repeatTimes
    myRepeater.DataBind()

Aspфайл

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

Возвращает эту ошибку

Сообщение об ошибке парсера:«AdTitle<%# Container.ItemIndex %>» не является допустимым идентификатором.

Это было полезно?

Решение

Я хочу различить выпадающие управления в управлении ретранслятором.

Вам это не нужно.Вот пример кода, который может вам помочь:

Разметка:

<%@ 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>

Код программной части:

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);
    }
}

Другие советы

Вы не можете создать уникальный идентификатор внутри ретранслятора с помощью такой разметки.Однако вы можете получить раскрывающийся список в коде, используя FindControl на репитере.

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

Хорошо...Короче говоря, вы не можете делать то, что пытаетесь сделать, так, как вы это делаете сейчас.

Свойство ID элемента управления можно установить только с помощью атрибута ID в теге и простого значения.Пример: <asp:Button runat="server" id="Button1" />

Я понимаю, что ты пытаешься сделать, но не совсем понимаю, почему...

Элемент управления повторителем будет содержать 1 элемент на каждый элемент в вашем источнике данных, поэтому вполне нормально просто вызвать DropDownList. ID="AdTitle" так как это будет другое 'AdTitle' от того, что в следующем ряду.

Чтобы вернуть их на серверную сторону, вам нужно просто перебирать элементы в вашем повторителе и FindControl("AdTitle") чтобы получить конкретный DropDownList для этого элемента.

Если увеличение идентификаторов абсолютно необходимо, вам придется сделать это программно (вероятно, на ItemDataBound событие, чтобы создать DropDownList и добавить его в свой ItemTemplate.

Расширение ответа BC:Недавно у меня возникла та же проблема, хотя и с флажком: мне нужно было установить идентификатор, поскольку я использовал его при сохранении выбора.Немного неуклюже, но я сделал это, когда был привязан к данным элемента.

Вот разметка:

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

Я создал и связал коллекцию этого класса

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

Делаем необходимое в Page_Load

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

Далее я установил идентификатор:

    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();
        }
    }

Поэтому, когда нажата кнопка отправки, я могу пройти через цикл, получить идентификатор проверенных и сохранить:

  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
            }
        }
    }

Вы можете добавить обработчик событий в Repeater.ItemDataBound и создать элемент управления внутри обработчика, используя ссылку на контейнер элемента.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top