Установка свойств на пользовательском элементе управления в цикле foreach

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

Читать findimagedupes страницу, которую я любил, я вижу, что существует реализация C++ того же алгоритма . По-видимому, это будет легче понять.

И кажется, что можно также использовать gqview.

5
задан Brandon 29 October 2009 в 18:15
поделиться

2 ответа

Хотя ответ Джастина Гранта , скорее всего, сработал бы нормально, мы решили просто загрузить пользовательский элемент управления и вызвать метод DisplayResults.

<% ((UserControlType)LoadControl("~/pathToUserControl.ascx"))
       .DisplayResults(ItemName, ItemList)); %>

Это не тот результат. полный код, но это то, что нужно для решения проблемы, которую я затронул в вопросе. Загрузив пользовательский элемент управления таким образом, мы могли бы установить необходимые свойства и отобразить элемент управления uesr с правильной информацией.

0
ответ дан 13 December 2019 в 05:37
поделиться

На странице WebForms это обычно обрабатывается с помощью DataBinding. Вместо цикла foreach вы можете использовать элемент управления Repeater , установить для его свойства DataSource значение <% # Categories%> , а затем использовать синтаксис привязки данных в последнем примере выше. , за исключением того, что вместо c вам необходимо привести Container.DataItem к нужному типу в вашем элементе управления. Примерно так:

<%@ Page Language="C#" %>
<script runat="server">
protected void  Page_Load(object sender, EventArgs e)
{
    CategoriesList.DataBind();
}
class Category
{
    public string CategoryName { get; set; }
    public string GetProperty() { return CategoryName; }
    public string[] Items { get { return new string[] {CategoryName + " 1", CategoryName + " 2"}; } }
}
Category[] Categories = new Category[]
{
    new Category { CategoryName = "Shorts" },
    new Category { CategoryName = "Socks" },
    new Category { CategoryName = "Shirts" },
};
</script>
<html>
<body>
<asp:Repeater runat="server" ID="CategoriesList" DataSource="<%# Categories %>">
  <ItemTemplate>
    <uc:ItemsControl 
       Items="<%# ((Category)(Container.DataItem)).Items %>" 
       OtherProperty="<%# ((Category)(Container.DataItem)).GetProperty() %>" 
       runat="server"/>
  </ItemTemplate>       
</asp:Repeater>
</body>
</html>

Единственное предостережение - вам нужно будет вызвать метод DataBind () Repeater где-нибудь, обычно в методе Page_Load .

Лично я всегда обнаруживал привязку данных быть болью - и приведение, и необходимость вызвать привязку данных кажутся мне гораздо менее естественными, чем метод foreach, который вы пробовали выше. Это, наверное, то, что мне больше всего нравится в ASP. NET MVC - ваши представления MVC могут намного проще использовать модель итерации foreach, которая намного проще, IMHO. Тем не менее, если вам нужно придерживаться WebForms, привязка данных с приведением типов - это путь наименьшего сопротивления.

Кстати, описанные выше подходы не сработали, потому что:

  1. runat = server Свойства элемента управления ASP.NET не могут быть заполнен с использованием <% =%> синтаксис - это только полезно для вывода обычного текста, а не для заполнение свойств объекта.

  2. с использованием синтаксиса привязки данных ( <% #%> ) определенно может использоваться для заполнения в свойствах элемента управления, но вам нужно обернуть элемент управления в привязку данных контейнер (как повторитель) и вызовите DataBind (), чтобы получить произойдет замена.

10
ответ дан 13 December 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: