用动态生成的TreevViee导航动态改变GridView中显示的数据,为什么一点TreeView的节点GridView就不见了?
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();
}
}
好心的朋友们帮我指点下迷津把!谢谢!