Привязка данных к списку для пользовательского элемента управления в шаблоне элемента в коде позади

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

Вопрос

У меня есть DataList, как показано ниже:

<asp:DataList runat="server" ID="myDataList">
   <ItemTemplate>
     <uc:MyControl ID="id1" runat="server" PublicProperty='<%# Container.DataItem %>' />
   </ItemTemplate>
</asp:DataList>

Шаблон элемента - это просто зарегистрированный пользовательский контроль MyControl. Источником данных для DataList является List<List<T>>, и передается PublicProperty MyControl List<T>, который затем формирует свою собственную привязку данных. Это прекрасно работает, но у меня есть общее отвращение к привязке данных на странице aspx / c. Какой самый эффективный способ установить значение PublicProperty в коде позади?

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

Решение

Если в строке синтаксис привязки данных недостаточно хорош для вас - вы всегда можете подключиться к событию ItemDatabound DataList.

<asp:DataList runat="server" ID="myDataList" 
                OnItemDataBound="DataList_ItemDataBound">
    <ItemTemplate>
        <uc:MyControl ID="id1" runat="server" />
    </ItemTemplate>
</asp:DataList>

Затем в коде вашей страницы / содержащего элемент управления вы можете добавить событие ItemDataBound.

    protected void DataList_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item
            || e.Item.ItemType == ListItemType.AlternatingItem)
        { 
            DataListItem item = e.Item;
            //List<string> or whatever your data source really is...
            List<string> dataItem = item.DataItem as List<string>;
            MyControl lit = (MyControl)item.FindControl("id1");
            lit.PropertyName = dataItem;
        }
    }

Для получения дополнительной информации о событии DataList.ItemDataBound - Читать здесь

Если вы не хотите объявлять свой делегат ItemDataBound встроенным в ASPX, вы также можете сделать это в коде позади - возможно, в вашем событии загрузки страницы:

myDataList.ItemDataBound += DataList_ItemDataBound;

Надеюсь, это поможет

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