Реализуйте HierarchicalDataBoundControl для ASP.NET

2

Я хочу реализовать иерархический контроль привязки данных для ASP.NET.

Я использовал Внедрение поддержки IHierarchy в вашу пользовательскую коллекцию в качестве основы для создания моей иерархической коллекции. Я также создал HierarchicalDataSourceControl для коллекции. Все работает: я могу привязать его к ASP.NET TreeView и правильно отобразить данные.

Однако я застрял в HierarchicalDataBoundControl. Я нашел примеры, но я все еще слишком новичок в С#/.Net, чтобы понять их. Я не совсем понимаю, как реализовать примеры:

Отображение меню UL с привязкой к файлам

ни

HierarchicalDataBoundControl Class

Есть ли у кого-нибудь подсказки или лучшие примеры реализации такого элемента управления?

  • 0
    Никто на этом форуме не имеет представления об этой теме?
  • 0
    Это не форум. Это сайт вопросов и ответов. Прочитайте FAQ: stackoverflow.com/faq . Это вверху каждой страницы.
Показать ещё 6 комментариев
Теги:
custom-server-controls

2 ответа

0

В качестве других элементов управления 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.

-1

Я столкнулся с аналогичной проблемой и создал свой собственный 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'>&nbsp;</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;
}
  • 0
    Спасибо, это то, что я на самом деле сделал сам на основе некоторых других сообщений, которые я нашел. Я реализовал это в пользовательском контроле. Это действительно не отвечает на вопрос, хотя. Я все еще хочу работать правильно в HierarchicalDataBoundControl

Ещё вопросы

Сообщество Overcoder
Наверх
Меню