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とコントロールをサポートしますが、割り当てられている があるかどうかを確認し、それを取得してデータ バインディングを実行します。方法で実践可能です。次に、ビューのメソッドを呼び出してルート コレクションを取得します。HierarchialDataSourceDataSourceDataSourceViewGetDataSelect

その後、 type のオブジェクトであるルート コレクションを反復処理する必要がありますIHierarchialEnumerableGetHierarchyDataコレクションのアイテムであるオブジェクトを提供し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 に答える