2

我想为 ASP.NET 实现分层数据绑定控件。

我使用在您的自定义集合中实现 IHierarchy 支持作为创建我的分层集合的基础。我还为该集合创建了一个 HierarchicalDataSourceControl。一切正常:我可以将它绑定到 ASP.NET TreeView 并正确呈现数据。

但是,我被困在 HierarchicalDataBoundControl 上。我找到了示例,但我对 c#/.Net 还是太陌生,无法理解它们。我不太明白如何实现这些示例:

呈现数据绑定的 UL 菜单

也不

HierarchicalDataBoundControl 类

有没有人有任何提示或更好的例子来实现这样的控件?

4

2 回答 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,应该检查是否有一个assigned DataSource,获取它DataSourceView来完成数据绑定。通过GetData方法是可行的。然后调用视图的Select方法来获取根集合。

之后,您必须遍历作为 type 对象的根集合IHierarchialEnumerable。它有一个名为的简单方法GetHierarchyData,该方法提供一个作为集合项的对象,并返回一个IHierarchyData描述节点的关联对象。这种方法是存在的,因此在大多数情况下您不知道项目的实际类型。IHierarchyData表示有关节点及其子节点的一些信息。

最后,您不需要编写新DataSource控件。如果您在创建自定义导航控件之后,最好为SiteMapDataSource.

于 2010-01-27T17:20:52.627 回答
-1

我遇到了类似的问题并创建了自己的原始 html。

    private void LoadCategory()
{
    String s = "";

// 准备您的数据集 DataSet ds // 请注意,我有具有 C_NAME 和 PC_NAME 列的类别表,请根据您的列 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;
}
于 2009-08-04T09:47:17.873 回答