我想实现用添加模板列来实现datagrid中嵌套datageid,它们显示的字段是一样的,要分页和排序
最重要的是要动态生成多层嵌套,可能有两层,有可能有三层;完全根据数据的父节点字段决定,如何实现?

解决方案 »

  1.   

    动态生成多层嵌套?你是不是要做类似Tree的DataGrid?应该换一种思路
      

  2.   

    参考
    1、嵌套的DataGrid如何为子DataGrid动态增加模板列 
    http://www.cnblogs.com/lovecherry/archive/2005/04/26/145633.html
    2、Ben大哥的,利用XMLHTTP做的TreeGrid
    http://e65.sogot.com/TreeGrid/default.aspx
      

  3.   

    DataGrid1_ItemDataBound
    {
    TextBox lbltau_id =new TextBox();//在模板列中的textbox
    id=(TextBox)e.Item.FindControl("id");
    if (id != null)
    {
    strColumn = id.Text;
    string SqlStr="select * from youtabel where id='"+id+"'";
    SqlDataAdapter cmd=new SqlDataAdapter(SqlStr,conn.dbconn);
    DataSet myds=new DataSet();
    cmd.Fill(myds,"mytable");
    DataGrid2.DataSource=myds.Table[0].DefaultView;
    DataGrid2.DataBind();    
    }
    }
    <asp:datagrid id="DataGrid1" runat="server" AutoGenerateColumns="False" PageSize="2" AllowPaging="True"> 
                    <Columns> 
                        <asp:TemplateColumn HeaderText="表头"> 
                            <ItemTemplate> 
                                <%# DataBinder.Eval(Container.DataItem, "id") %> 
                                <asp:DataGrid id="DataGrid2" runat="server" AutoGenerateColumns="false"></asp:DataGrid> 
                            </ItemTemplate> 
                        </asp:TemplateColumn> 
                    </Columns> 
                </asp:datagrid>
      

  4.   

    兄弟那么做,要什么级别的服务器才能跑起来呀。datagrid是很郝资源的,我反正是不怎么用,最多用到datalist。
      

  5.   

    嵌套datagrid会严重影响性能的
      

  6.   

    那可以介绍一些好的实现方法吗?效果就是类似Tree的DataGrid,可否推荐一些好的例子那,谢谢!
    to:LoveCherry:Ben大哥的利用XMLHTTP做的TreeGrid,我要的就是这个效果!不知可否提供一下源码?
      

  7.   

    兄弟帮你顶http://community.csdn.net/Expert/topic/3977/3977986.xml?temp=.3970148
      

  8.   

    to:cx12cn() 你最终是用什么方法实现的?
      

  9.   

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Configuration;
    namespace CSharpDemoHierGrid
    {
    /// <summary>
    /// Summary description for WebForm1.
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    { DataTable t;
    String conStr;
    DataSet ds = new DataSet();
    DataSet DsMain = new DataSet();
    String Space; protected System.Web.UI.WebControls.DataGrid DataGrid1;

    private void Page_Load(object sender, System.EventArgs e)
    {
    if(! IsPostBack)
    {

    conStr = ConfigurationSettings.AppSettings["connectionstring"];
    t = new DataTable("Total_List");
    DsMain.Tables.Add(t);
    DataColumn c1 = new DataColumn("任务编号", Type.GetType("System.String"),"");

    DataColumn c2 = new DataColumn("任务名称", Type.GetType("System.String"),"");

    DataColumn c3 = new DataColumn("计划开始时间", Type.GetType("System.String"),"");

    DataColumn c4 = new DataColumn("计划结束时间", Type.GetType("System.String"),""); DataColumn c5 = new DataColumn("实际开始时间", Type.GetType("System.String"),""); DataColumn c6 = new DataColumn("实际结束时间", Type.GetType("System.String"),"");                DataColumn c7 = new DataColumn("前置任务", Type.GetType("System.String"),"");
    t.Columns.Add(c1);
    t.Columns.Add(c2);
    t.Columns.Add(c3);
    t.Columns.Add(c4);
    t.Columns.Add(c5);
    t.Columns.Add(c6);
                    t.Columns.Add(c7);

    LoadResults(0);
    DataGrid1.DataSource = DsMain.Tables[0];
    DataGrid1.DataBind();
    DataGrid1.Columns[1].Visible = false;
    for(int i = 1 ; i <DsMain.Tables[0].Rows.Count; i++)
    DataGrid1.Items[i].Visible = false;

    }
    }
    int ParentID = 0;
    private void LoadResults(int inParentID)
    {
    SqlConnection con = new SqlConnection(conStr); if (inParentID == 0) 
    {

    SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM timeplan Where ParentID is null", con);
    con.Open();
    da.Fill(ds, "Search_List" + inParentID);

    con.Close();
    }
    else
    {

    SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM timeplan Where ParentID = " + inParentID, con);
    con.Open();
    da.Fill(ds, "Search_List" + inParentID);
     
    con.Close();
    }

    DataTable ParentTable; 
    ParentTable = ds.Tables["Search_List" + inParentID];
    foreach(DataRow parentrow in ParentTable.Rows)
    {


    DataRow newRow;
    newRow=t.NewRow(); String ID = Convert.ToString( parentrow.ItemArray[0] );
    newRow["任务编号"]= ID;

    String Name = String.Concat(Space , Convert.ToString( parentrow.ItemArray[1] ));
    newRow["任务名称"]=(string)Name;
    string Pstarttime= (Convert.ToDateTime(parentrow.ItemArray[2])).ToString( "yy年MM月dd日");
                    newRow["计划开始时间"]= Pstarttime; String Pendtime = (Convert.ToDateTime( parentrow.ItemArray[3] )).ToString( "yy年MM月dd日");
    newRow["计划结束时间"]= Pendtime; if(Convert.ToString( parentrow.ItemArray[4] )=="")
    {
    newRow["实际开始时间"]="";
    }
    else
    {      
    String Astarttime =( Convert.ToDateTime( parentrow.ItemArray[4] )).ToString( "yy年MM月dd日");
    newRow["实际开始时间"]= Astarttime;
    } if(Convert.ToString( parentrow.ItemArray[5] )=="")
    {
    newRow["实际结束时间"]="";
    }
    else
    { String Aendttime = (Convert.ToDateTime( parentrow.ItemArray[5] )).ToString( "yy年MM月dd日");
    newRow["实际结束时间"]= Aendttime;
    } if (inParentID == 0) 
    {
    newRow["前置任务"]= (string)ParentID.ToString();
    }
    else
    {
    ParentID = Convert.ToInt32( parentrow.ItemArray[6] );
    newRow["前置任务"]= (string)ParentID.ToString();
    } t.Rows.Add(newRow); Space = Space + "&nbsp;&nbsp;&nbsp;";
    LoadResults( Convert.ToInt32( parentrow.ItemArray[0]));
    if (Space.Length - 18 >= 18) 
    Space = Space.Remove(Space.Length - 18, 18);
     
    } } #region Web Form Designer generated code
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: This call is required by the ASP.NET Web Form Designer.
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {    
    this.DataGrid1.ItemCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_ItemCommand);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {

    if( ((Button)(e.Item.Cells[0].Controls[0])).Text == "+")
    {

    int Root = Convert.ToInt32(DataGrid1.Items[e.Item.ItemIndex].Cells[1].Text);
    for( int i = 1 ;i< DataGrid1.Items.Count - 1;i++)
    {

    if (DataGrid1.Items[i].Cells[7].Text == Root.ToString()) 
    DataGrid1.Items[i].Visible = true;
    }
    ((Button)(e.Item.Cells[0].Controls[0])).Text = "-";
    }
    else
    {

    int Root = Convert.ToInt32(DataGrid1.Items[e.Item.ItemIndex].Cells[1].Text);
    ArrayList ArrC = new ArrayList();
    ArrC.Add(Root);
    do
    {
    for(int i = 1 ;i< DataGrid1.Items.Count - 1;i++)
    {
    if (DataGrid1.Items[i].Cells[7].Text == ArrC[0].ToString())
    {
    ArrC.Add(DataGrid1.Items[i].Cells[1].Text);
    DataGrid1.Items[i].Visible = false;
    ((Button)(DataGrid1.Items[i].Cells[0].Controls[0])).Text = "+";
    }
    }
    ArrC.Remove(ArrC[0]);
    }while (ArrC.Count > 0);
    ((Button)(e.Item.Cells[0].Controls[0])).Text = "+";
    }
    }
    }
    }
      

  10.   

    http://www.microsoft.com/china/MSDN/library/data/default.mspx