Вы могли бы посмотреть на код для инструмента с открытым исходным кодом findimagedupes, хотя это, кажется, было записано в жемчуге, таким образом, я не могу сказать, как легкий это должно будет проанализировать...
Читать findimagedupes страницу, которую я любил, я вижу, что существует реализация C++ того же алгоритма . По-видимому, это будет легче понять.
И кажется, что можно также использовать gqview.
Хотя ответ Джастина Гранта , скорее всего, сработал бы нормально, мы решили просто загрузить пользовательский элемент управления и вызвать метод DisplayResults.
<% ((UserControlType)LoadControl("~/pathToUserControl.ascx"))
.DisplayResults(ItemName, ItemList)); %>
Это не тот результат. полный код, но это то, что нужно для решения проблемы, которую я затронул в вопросе. Загрузив пользовательский элемент управления таким образом, мы могли бы установить необходимые свойства и отобразить элемент управления uesr с правильной информацией.
На странице 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, привязка данных с приведением типов - это путь наименьшего сопротивления.
Кстати, описанные выше подходы не сработали, потому что:
runat = server Свойства элемента управления ASP.NET не могут быть заполнен с использованием
<% =%>
синтаксис - это только полезно
для вывода обычного текста, а не для
заполнение свойств объекта.
с использованием синтаксиса привязки данных ( <% #%>
) определенно может использоваться для заполнения
в свойствах элемента управления, но вам нужно
обернуть элемент управления в привязку данных
контейнер (как повторитель) и вызовите
DataBind (), чтобы получить
произойдет замена.