小弟最近在做GridView嵌套,当执行到嵌套的GridView的时候老是报错 “GridView”并不包含“DataSource”的定义
以下是我的代码,请高手指教一下GridView.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="GridView.aspx.cs" Inherits="GridView" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound">
            <FooterStyle BackColor="#FFFFCC" ForeColor="#330099" />
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:GridView ID="GridView2" runat="server"></asp:GridView>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </form>
</body>
</html>GridView.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;public partial class GridView : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataBindToGridView();
        }
    }
    //显示数据
    private void DataBindToGridView()
    {
        OleDbConnection con = DB.createConnection();
        OleDbDataAdapter da = new OleDbDataAdapter("select * from person order by pid", con);
        DataSet ds = new DataSet();
        da.Fill(ds, "person");
        this.GridView1.DataSource = ds.Tables[0].DefaultView;
        this.GridView1.DataBind();
        con.Close();
    }
    //执行数据绑定
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            GridView gv=(GridView)(e.Row.FindControl("GridView2"));
            OleDbConnection con = DB.createConnection();
            OleDbDataAdapter da = new OleDbDataAdapter("select * from person'", con);
            DataSet ds = new DataSet();
            da.Fill(ds, "person");
            gv.DataSource = ds.Tables[0].DefaultView;
            gv.DataBind();
            con.Close();
        }
    }
}

解决方案 »

  1.   

    放到这个事件里试试GridView2_DataBound
        protected void GridView2_DataBound(object sender, EventArgs e)
        {
            foreach (GridViewRow gv in HappyGridView2.Rows)
            {
                GridView  dataList = (GridView)gv.FindControl("GridView2");
                OleDbConnection   con   =   DB.createConnection(); 
                OleDbDataAdapter   da   =   new   OleDbDataAdapter( "select   *   from   person ' ",   con); 
                DataSet   ds   =   new   DataSet(); 
                da.Fill(ds,"person"); 
                gv.DataSource   =   ds.Tables["person"].DefaultView; 
                gv.DataBind(); 
                con.Close(); 
            }    }
      

  2.   

    你嵌套的gridview缺少<Columns> </Columns> 元素
      

  3.   

    没写过gridview嵌套,不过写过Datalist的嵌套 不过应该差不多,其中的关键就是FindControl找到第二Datalist,好像和命名有关系,应为我就是错在那里。不过已经解决了。
    <asp:DataList id="DataListOne" runat="server" RepeatColumns="2" class="tblsort">
    <ItemTemplate>
    <TABLE>
    <TR>
    <TD class="H"><A href="#"><%#DataBinder.Eval(Container.DataItem,"name")%></A></TD>
    </TR>
    </TABLE>
    <asp:DataList id="DataListTwo" runat="server" RepeatColumns="5">
    <ItemTemplate>
    <A href="#"><%# DataBinder.Eval(Container.DataItem,"name") %></A>
    </ItemTemplate>
    </asp:DataList>
    </ItemTemplate>
    </asp:DataList>private void DataListOne_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
    {
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)  
    {
    DataList DataListTwo = (DataList)e.Item.FindControl("DataListTwo");
    DataRowView rowv = (DataRowView)e.Item.DataItem; 
    string name =rowv["name"].ToString();
    DataSet ds = dAOWeb_Subject.GetSubjectByName(name);
    if(ds.Tables[0].Rows.Count>0)
    {
    DataListTwo.DataSource=ds;
    DataListTwo.DataBind();
    }
    }
    }
      

  4.   

    通过FindControl查找指定ID的gridview
      且事件要写在rowdatabound里面
    if(e.Row.RowType=DataControlRowType.DataRow&&e.Row.RowState!=DataControlRowState.Edit)
    {
        GridView g=e.Row.FindControl("GridViewID") as GridView;
        if(g!=null)
         {
             //doing something....
         }
    }
      

  5.   

    通过FindControl查找指定ID的gridview 
        且事件要写在rowdatabound里面 
    if(e.Row.RowType=DataControlRowType.DataRow&&e.Row.RowState!=DataControlRowState.Edit) 

            GridView   g=e.Row.FindControl( "GridViewID ")   as   GridView; 
            if(g!=null) 
              { 
                      //doing   something.... 
              } 
    }
      

  6.   

    不行啊,照着上面几楼的做法还是下面的错误提示?
    GridView”并不包含“DataSource”的定义 
      

  7.   

    看你写的后台代码绑定GRIDVIEW 为什么不能写一个法方传一个SQL语用,和你的指定的GRIDVIEW对象,这样你以后写代码不是很方便嘛,就算你是复制高手,那也得改好多地方。
    你的前台代码里,没看到你对GRIDVIEW1,和GRIDVIEW2指定DATANAMES,先加上,然后再试试,应该没有别的什么错了
      

  8.   

    多谢各位,现在我这个问题已经解决,现将代码贴出来,希望能给有同样困惑的朋友有所帮住。
    GridView.aspx
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="GridView.aspx.cs" Inherits="GridView" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" ShowHeader="False" BackColor="Black" CellPadding="1" CellSpacing="5" GridLines="None">
                <Columns>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:GridView ID="GridView2" runat="server" ShowHeader="False" DataSource='<%#BindGridView2(Eval("pid").ToString())%>'>
                            </asp:GridView>
                        </ItemTemplate>
                        <ItemStyle BackColor="White" />
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
        </form>
    </body>
    </html>GridView.aspx.cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.OleDb;public partial class GridView : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DataBindToGridView();
            }
        }
        //显示数据
        private void DataBindToGridView()
        {
            OleDbConnection con = DB.createConnection();
            OleDbDataAdapter da = new OleDbDataAdapter("select * from person order by pid", con);
            DataSet ds = new DataSet();
            da.Fill(ds, "person");
            this.GridView1.DataSource = ds.Tables[0].DefaultView;
            this.GridView1.DataBind();
            con.Close();
        }
        //执行数据绑定
        protected DataView BindGridView2(string pid)
        {
            OleDbConnection con = DB.createConnection();
            OleDbDataAdapter da = new OleDbDataAdapter("select * from person where pid='"+pid+"'", con);
            DataSet ds = new DataSet();
            da.Fill(ds, "person");
            return ds.Tables[0].DefaultView;
        }
    }