Я хочу реализовать иерархический контроль привязки данных для ASP.NET.
Я использовал Внедрение поддержки IHierarchy в вашу пользовательскую коллекцию в качестве основы для создания моей иерархической коллекции. Я также создал HierarchicalDataSourceControl для коллекции. Все работает: я могу привязать его к ASP.NET TreeView и правильно отобразить данные.
Однако я застрял в HierarchicalDataBoundControl. Я нашел примеры, но я все еще слишком новичок в С#/.Net, чтобы понять их. Я не совсем понимаю, как реализовать примеры:
Отображение меню UL с привязкой к файлам
ни
HierarchicalDataBoundControl Class
Есть ли у кого-нибудь подсказки или лучшие примеры реализации такого элемента управления?
В качестве других элементов управления DataBound
вы должны переопределить метод PerformDataBinding
следующим образом.
protected override void PerformDataBinding()
{
base.PerformDataBinding();
if (!IsBoundUsingDataSourceID && this.DataSource == null) return;
HierarchicalDataSourceView view = this.GetData(string.Empty);
if (view != null)
{
IHierarchicalEnumerable root = view.Select();
}
}
В то время как ваш контроль поддерживает управление DataSource
и HierarchialDataSource
в этом случае, должен проверить, есть ли назначенный DataSource
, получить его DataSourceView
для выполнения привязки данных. Это возможно с помощью метода GetData
. Затем вызовите метод Select
для получения корневой коллекции.
Впоследствии вы должны выполнить итерацию через корневую коллекцию, которая является объектом типа IHierarchialEnumerable
. Он имеет простой метод под названием GetHierarchyData
, который предоставляет объект, являющийся элементом коллекции, и возвращает связанный IHierarchyData
, который описывает node. Эти методы существуют, поэтому в большинстве случаев вы не знаете фактического типа элемента. IHierarchyData
представляет некоторую информацию о node и его дочерних элементах.
Наконец, вам не нужно писать новый элемент управления DataSource
. Если после создания настраиваемого элемента управления навигации лучше написать нового поставщика для SiteMapDataSource
.
Я столкнулся с аналогичной проблемой и создал свой собственный raw html.
private void LoadCategory()
{
String s = "";
//Подготовьте свой набор данных DataSet ds // Примечание. У меня есть таблица категорий с C_NAME и PC_NAME coloums, измените ее в соответствии с вашим столбцом anme ds.Relations.Add( "rsParentChild", ds.Tables [0].Columns [ "C_NAME" ], ds.Tables [0].Columns [ "PC_NAME" ]);
s = s + "\n <table>";
s = s + "\n <tr>";
s = s + "\n <td class='br4'> ";
s = s + "\n <table>";
s = s + "\n <tr>";
s = s + "\n <td>";
s = s + "\n <ul id='qm0' class='qmmc'>";
foreach (DataRow dr in ds.Tables[0].Rows)
{
if (dr["PC_NAME"] == DBNull.Value)
{
s = s + "\n <li><a class='qmparent' href='#'>" + dr["C_NAME"].ToString() + "</a>";
s = s + "\n <ul>" + PopulateTree(dr) + "</ul>";
}
}
s = s + "\n <li class='qmclear'> </li></ul>";
s = s + "\n <script type='text/javascript'>qm_create(0,true,0,500,'all',false,false,false,false);</script>";
s = s + "\n </td>";
s = s + "\n </tr>";
s = s + "\n </table>";
s = s + "\n </td>";
s = s + "\n </tr>";
s = s + "\n </table>";
Literal1.Text = s;
}
private String PopulateTree(DataRow dr)
{
String s = "";
String ss;
foreach (DataRow row in dr.GetChildRows("rsParentChild"))
{
s = s + " <li><a href=\"javascript:FetchProducts(1,'" + row["C_NAME"].ToString() + "')\">" + row["C_NAME"].ToString() + "</a>\n";
ss = PopulateTree(row);
if (ss != "")
s = s + " <ul>" + ss + "</ul></li>\n\n";
}
return s;
}