数据表结构:
大类 小类
A    A1
A    A2
B    B1
B    B2
B    B3
C    C1
C    C2
D    D1
要实现效果:
A
A1  A2
B
B1  B2  B3
C
C1  C2
D
D1
大类和小类都是变化的,查了类似帖子没有解决,用DataGrid或DataList,Repeater怎么实现呢?

解决方案 »

  1.   

    楼主 这个表 几层能 层数固定吗

                A
          A1              A2
      A11 A12 A13       A21 A22 A23  
            ........
                B
     ................
    ....
      

  2.   

    http://support.microsoft.com/kb/326338/EN-US/
      

  3.   

    <%@ Control Language="c#" AutoEventWireup="false" Codebehind="WebUserControl1.ascx.cs" Inherits="bsTest2005_8_16.CSDN.WebUserControl1" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
    <asp:Label id="Label1" runat="server">Label</asp:Label>
    <asp:DataList id="DataList1" runat="server" RepeatDirection="Horizontal">
    <ItemTemplate>
    <%# DataBinder.Eval(Container.DataItem, "小类")%>
    </ItemTemplate>
    </asp:DataList>
    *****************************************
    public class WebUserControl1 : System.Web.UI.UserControl
    {
            protected System.Web.UI.WebControls.Label Label1;
            protected System.Web.UI.WebControls.DataList DataList1; private void Page_Load(object sender, System.EventArgs e)
    {}        public void BindData(string parentType,DataRow[] childTypes)
            {
                this.Label1.Text = parentType;
                
                if(childTypes.Length>0)
                {
                    DataTable dt = childTypes[0].Table.Clone();
                    foreach(DataRow row in childTypes)
                    {
                        dt.Rows.Add(row.ItemArray);
                    }
                    this.DataList1.DataSource = dt;
                    this.DataList1.DataBind();
                }
            }
    ...
      

  4.   

    <asp:DataGrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 24px" runat="server"
    AutoGenerateColumns="False">
    <Columns>
    <asp:BoundColumn Visible="False" DataField="大类"></asp:BoundColumn>
    <asp:TemplateColumn>
    <ItemTemplate>
    <uc1:WebUserControl1 id="WebUserControl11" runat="server"></uc1:WebUserControl1>
    </ItemTemplate>
    </asp:TemplateColumn>
    </Columns>
    </asp:DataGrid>
    ***********************
    public class _8218347 : System.Web.UI.Page
    {
            protected System.Web.UI.WebControls.DataGrid DataGrid1;
                    DataSet ds = null;
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
                if(!IsPostBack)
                {
                    CreateTestData();
                    this.DataGrid1.DataSource = ds.Tables[0];
                    this.DataGrid1.DataBind();
                }
    }        private void CreateTestData()
            {
                ds = new DataSet();
                DataTable dt1 = new DataTable();
                dt1.Columns.Add("大类");
                dt1.Rows.Add(new object[]{"A"});
                dt1.Rows.Add(new object[]{"B"});
                dt1.Rows.Add(new object[]{"C"});
                dt1.Rows.Add(new object[]{"D"});
                
                DataTable dt2 = new DataTable();
                dt2.Columns.Add("大类");
                dt2.Columns.Add("小类");
                dt2.Rows.Add(new object[]{"A","A1"});
                dt2.Rows.Add(new object[]{"A","A2"});
                dt2.Rows.Add(new object[]{"B","B1"});
                dt2.Rows.Add(new object[]{"B","B2"});
                dt2.Rows.Add(new object[]{"B","B3"});
                dt2.Rows.Add(new object[]{"C","C1"});
                dt2.Rows.Add(new object[]{"C","C2"});
                dt2.Rows.Add(new object[]{"D","D1"});
                ds.Tables.Add(dt1);
                ds.Tables.Add(dt2);
                ds.AcceptChanges();
            }

            private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
            {
                if(e.Item.ItemIndex>-1)
                {
                    string parentType = e.Item.Cells[0].Text;
                    WebUserControl1 tmp = e.Item.Cells[1].Controls[1] as WebUserControl1;
                    tmp.BindData(parentType,ds.Tables[1].Select("[大类]='"+parentType+"'"));
                }
            }#region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
                this.DataGrid1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemDataBound);
                this.Load += new System.EventHandler(this.Page_Load);        }
    #endregion }
      

  5.   

    如果是固定2层的话做两个表关联(一个group by 大类,一个就是所有小类了),然后datagrid显示关联数据即可,网上很多牵套datagrid的例子
      

  6.   

    打了一段字Eddie005代码都出来了,快啊
      

  7.   

    我这量个加载信息栏目的例子到treeviw控件,你看一下.
      public void ColumnManageInit(ref Microsoft.Web.UI.WebControls.TreeView  TreeCtrl)
        {
            SystemColumn.SystemColumn mSystemColumnServices = new SystemColumn.SystemColumn();        StringBuilder strJavascript;
            Microsoft.Web.UI.WebControls.TreeNode NodeItem = null;        TreeCtrl.Nodes.Clear();
            TreeCtrl.Attributes.Add("onclick", "javascript: if(this.clickedNodeIndex != null && form1.EditState.value=='Browse') {this.selectedNodeIndex=this.clickedNodeIndex; NodeItem_Click();return true;}");        //创建根节点
            DataSet PRootDSet = new DataSet();
            mSystemColumnServices.System_Columen_Ex_FilterAll(ref PRootDSet);        PRootDSet.Tables[0].TableName = "Root";        DataTable PDataTable = PRootDSet.Tables[0].Copy();
            PDataTable.TableName = "Nodes";
            PRootDSet.Tables.Add(PDataTable);        //**设置权限模块主子关系
            DataColumn parentCol;
            DataColumn childCol;
            parentCol = PRootDSet.Tables[0].Columns["PNodeCode"];
            childCol = PRootDSet.Tables[1].Columns["PNodeCodeParentCode"];
            DataRelation relNum;        relNum = new DataRelation("SD", parentCol, childCol);
            PRootDSet.Relations.Add(relNum);
            foreach (DataRow PDRow in PRootDSet.Tables["Root"].Rows)
            {
                if (PDRow["PNodeCode"].ToString().Length == 2)
                {
                    strJavascript = new StringBuilder("");
                    for (int j = 0; j < PRootDSet.Tables["Root"].Columns.Count; j++) strJavascript.Append(PDRow[j].ToString() + "\t");                NodeItem = new Microsoft.Web.UI.WebControls.TreeNode();
                    NodeItem.Text = PDRow["PNodeName"].ToString();
                    NodeItem.ID = PDRow["PNodeCode"].ToString();
                    NodeItem.NodeData = strJavascript.ToString();
                    NodeItem.NavigateUrl = "#";
                    TreeCtrl.Nodes.Add(NodeItem);                foreach (DataRow CDRow in PDRow.GetChildRows(relNum))
                    {
                        //**搜寻主表相对行
                        DataRow[] TRootRow = PRootDSet.Tables["Root"].Select("PNODECODE='" + CDRow["PNodeCode"].ToString() + "'");                    DicAreaManageInitChild(ref NodeItem, PRootDSet, TRootRow[0], relNum);
                    }
                }
            }        PRootDSet.Dispose();    }    private void DicAreaManageInitChild(ref Microsoft.Web.UI.WebControls.TreeNode PNodeItem, DataSet PRootDSet, DataRow PDRow, DataRelation relNum)
        {
            Microsoft.Web.UI.WebControls.TreeNode NodeItem = null;        //DataRow NChildRow=null;        StringBuilder strJavascript = new StringBuilder("");
            for (int j = 0; j < PRootDSet.Tables["Root"].Columns.Count; j++) strJavascript.Append(PDRow[j].ToString() + "\t");        NodeItem = new Microsoft.Web.UI.WebControls.TreeNode();
            NodeItem.Text = PDRow["PNodeName"].ToString();
            NodeItem.ID = PDRow["PNodeCode"].ToString();
            NodeItem.NodeData = strJavascript.ToString();
            NodeItem.NavigateUrl = "#";        PNodeItem.Nodes.Add(NodeItem);        foreach (DataRow CDRow in PDRow.GetChildRows(relNum))
            {
                //**搜寻主表相对行
                DataRow[] TRootRow = PRootDSet.Tables["Root"].Select("PNODECODE='" + CDRow["PNodeCode"].ToString() + "'");            DicAreaManageInitChild(ref NodeItem, PRootDSet, TRootRow[0], relNum);
            }
        }
      

  8.   

    最简单的方法是我次查数据库,每循环一次查一下子类。还有就是用DataSet建立表关系。先绑父表,在每一项时,绑定子表
      

  9.   

    用DataGrid没实现,最后用Table了