TreeView静态生成时,用下面的代码就可以实现点击TreeView的一个节点,GridView就可以显示相应的检索数据。
前台页面代码:
   <asp:TreeView ID="tvGType" runat="server" NodeIndent="10" ShowExpandCollapse="False" ShowLines="True" OnSelectedNodeChanged="tvGType_SelectedNodeChanged" >
        <Nodes>
        <asp:TreeNode Text="文艺" Value="文艺">
            <asp:TreeNode Text="小说" Value="小说">
            </asp:TreeNode>
                    </asp:TreeNode>
        <asp:TreeNode Text="科技" Value="科技">
            <asp:TreeNode Text="计算机" Value="计算机"></asp:TreeNode>
                    </asp:TreeNode>
            </Nodes>
             <asp:GridView 
                     <Columns>
                    <asp:BoundField DataField="book_Name" HeaderText="书名" SortExpression="book_Name" />
                    <asp:BoundField DataField="bT_Name" HeaderText="类别" SortExpression="bT_Name" />
                    <asp:BoundField DataField="book_ID" HeaderText="书编号" ReadOnly="True" SortExpression="book_ID" />
                    <asp:BoundField DataField="book_Desc" HeaderText="所属" />
                    <asp:HyperLinkField DataNavigateUrlFormatString="BookDetail.aspx?book_ID={0}" NavigateUrl="~/前台/BookDetail.aspx"
                        Text="详细信息" DataNavigateUrlFields="book_ID" HeaderText="详细信息" />
                </Columns>
                             </asp:GridView>
       实现代码:
    protected void Page_Load(object sender, EventArgs e)
    {
        book book = new book();
        DataSet ds = book.GetType();
        gvGoodsInfo.DataSource = ds;
        gvGoodsInfo.DataBind();
    }    protected void gvGoodsInfo_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        this.gvGoodsInfo.PageIndex = e.NewPageIndex;
        book book = new book();
        DataSet ds = book.GetType();
        gvGoodsInfo.DataSource = ds;
        gvGoodsInfo.DataBind();
    }
    protected void tvGType_SelectedNodeChanged(object sender, EventArgs e)
    {
        string sSeleNodeText = tvGType.SelectedValue.ToString();
        string sqlstr = "select * from bookInfo where bT_Name='" + sSeleNodeText + "' or bookType='" + sSeleNodeText + "'";
        this.DataBind(gvGoodsInfo, sqlstr);
    }
    public void DataBind(GridView gv, string sqlstr)
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConn"].ConnectionString);
        conn.Open();
        SqlDataAdapter da = new SqlDataAdapter(sqlstr, conn);
        DataSet ds = new DataSet();
        da.Fill(ds);
        gv.DataSource = ds;
        gv.DataBind();
        conn.Close();
    }
}
但是我把TreeView用代码动态生成就不行了,代码如下:
前台页面代码:
     <asp:TreeView OnTreeNodePopulate="TreeView1_TreeNodePopulate" ShowLines="True" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged"/></td>
    <asp:GridView ID="gvGoodsInfo" runat="server"  AutoGenerateColumns="False" AllowPaging="True" PageSize="3" Width="411px" BorderStyle="Outset" OnPageIndexChanging="gvGoodsInfo_PageIndexChanging"  ">
                     <Columns>
                    <asp:BoundField DataField="book_Name" HeaderText="书名" SortExpression="book_Name" />
                    <asp:BoundField DataField="bT_Name" HeaderText="类别" SortExpression="bT_Name" />
                    <asp:BoundField DataField="book_ID" HeaderText="书编号" ReadOnly="True" SortExpression="book_ID" />
                    <asp:BoundField DataField="book_Desc" HeaderText="所属" />
                    <asp:HyperLinkField DataNavigateUrlFormatString="BookDetail.aspx?book_ID={0}" NavigateUrl="~/前台/BookDetail.aspx"
                        Text="详细信息" DataNavigateUrlFields="book_ID" HeaderText="详细信息" />
                </Columns>
                 <PagerSettings FirstPageText="首页" LastPageText="末页" Mode="NextPrevious" NextPageText="下一页"
                     PreviousPageText="前一页" />
            </asp:GridView>
        </td></tr></table>
       
        
    
    </div>
    </form>
</body>
</html>
后台代码:
protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack == false)
        {       
            PopulateRootLevel();//调用方法动态生成树
        }               //给GridView动态绑定数据源
        book book = new book();   
        DataSet ds = book.GetType();
        gvGoodsInfo.DataSource = ds;
        gvGoodsInfo.DataBind();
        }
    protected void gvGoodsInfo_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        //支持GridView分页
        this.gvGoodsInfo.PageIndex = e.NewPageIndex; 
        book book = new book();
        DataSet ds = book.GetType();
        gvGoodsInfo.DataSource = ds;
        gvGoodsInfo.DataBind();
    }
   
    //获取并绑定数据源
    private void PopulateRootLevel()
    {        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConn"].ConnectionString);
        SqlCommand cmd = new SqlCommand(@"select Type.bT_ID,Type.bT_Name,count(distinct Left(book.book_ID,4)) 细类数目 from Type,Book where Left(book.book_ID,2)=Type.bT_ID group by Type.bT_ID ,Type.bT_Name", conn);
        SqlDataAdapter ada = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        ada.Fill(dt);
        PopulateNodes(dt,TreeView1.Nodes);
    }
    //动态生成TreeView节点
    private void PopulateNodes(DataTable dt, TreeNodeCollection nodes)
    {
        foreach(DataRow dr in dt.Rows)
        {
            TreeNode tn=new TreeNode();
            tn.Text = dr["bT_Name"].ToString();
            tn.Value = dr["bT_ID"].ToString();
            nodes.Add(tn);
            tn.PopulateOnDemand = ((int)(dr["细类数目"]) > 0);
        }
    }
    //生成子节点方法
    private void PopulateSubLevel(int parentid, TreeNode parentNode)
    {
      
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConn"].ConnectionString);
        SqlCommand cmd = new SqlCommand("BTID ", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter parameterBTID = new SqlParameter("@BTID",SqlDbType.Int);
        parameterBTID.Value = parentid;
        cmd.Parameters.Add(parameterBTID);
        SqlDataAdapter ada = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        ada.Fill(dt);
        PopulateNodes(dt,parentNode.ChildNodes);    }
    //触发生成子节点事件
    protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
    {
        PopulateSubLevel(Int32.Parse(e.Node.Value), e.Node);
       
    }
    //选择子节点则GridView显示响应的信息
    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
    {
        string sSeleNodeText = TreeView1.SelectedValue.ToString();
        string sqlstr = "select * from bookInfo where bT_Name='" + sSeleNodeText + "' or bookType='" + sSeleNodeText + "'";
        this.DataBind(gvGoodsInfo, sqlstr);
    }
 //给GridView绑定不同的数据源而动态变化
    public void DataBind(GridView gv, string sqlstr)
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConn"].ConnectionString);
        conn.Open();
        SqlDataAdapter da = new SqlDataAdapter(sqlstr, conn);
        DataSet ds = new DataSet();
        da.Fill(ds);
        gv.DataSource = ds;
        gv.DataBind();
        conn.Close();
    }
}
好心的朋友们帮我指点下迷津把!谢谢!

解决方案 »

  1.   

       gv.DataSource = ds.table[0]; 
       gv.DataBind(); 
       试试。
      

  2.   

    好复杂啊!
    呵呵
    是不是gridview绑定的问题,
    我今天也做了gridview的绑定,数据源要绑定,还要将datamember绑定表
      

  3.   

    好复杂哦!
    是不是绑定数据源的问题啊!
    我今天也做了datagrid的动态绑定,麻烦的是:要绑定datasource还有datamember
      

  4.   

    ds.table[0]和ds好像是一样啊!
    Gridview的动态绑定不需要纳闷麻烦吧!
      

  5.   

    真郁闷啊,有没有那位朋友用过TreeView啊?
      

  6.   


    foreach(DataRow dr in dt.Rows)
            {
                TreeNode tn=new TreeNode();
                tn.Text = dr["bT_Name"].ToString();
                tn.Value = dr["bT_ID"].ToString();
                nodes.Add(tn);
                tn.PopulateOnDemand = ((int)(dr["细类数目"]) > 0);
            } 
    注意:你节点绑定的时候,text和Value绑定的是不一样的。text是名称 value是Id
    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
        {
            string sSeleNodeText = TreeView1.SelectedValue.ToString();
            string sqlstr = "select * from bookInfo where bT_Name='" + sSeleNodeText + "' or bookType='" + sSeleNodeText + "'";
            this.DataBind(gvGoodsInfo, sqlstr);
        } 
    而你在改变的时候使用的是TreeView1.SelectedValue,而这个得到的是节点的ID而不是名称这个可能是问题的原因,
      

  7.   

     sSeleNodeText  这是什么呀,帮忙再解释一下吧。从哪出来的