在GridView1_RowDataBound的时候,向当前行的一个Panel动态添加控件。其他代码都对了,就是找不到当前行的这个控件。protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            int result = Convert.ToInt32(GridView1.DataKeys[e.Row.RowIndex].Value);
            Panel Panel11 = new Panel();//(Panel)e.Row.FindControl("biaoqian");
            Panel11 = (Panel)e.Row.FindControl("biaoqian");
            Database db = DatabaseFactory.CreateDatabase();
            DbCommand dbCommand = db.GetStoredProcCommand("smart_blogtag");
            db.AddInParameter(dbCommand, "bid", DbType.Int32, result);
            DataTable dt = db.ExecuteDataSet(dbCommand).Tables[0];
            for (int x = 0; x < dt.Rows.Count; x++)
            {
                DataRow dr2 = dt.Rows[x];
                Label lb1 = new Label();
                if (x != dt.Rows.Count - 1)
                {
                    lb1.Text = dr2["tagName"].ToString() + ",";
                }
                else
                {
                    lb1.Text = dr2["tagName"].ToString();
                }
                lb1.ID = "Label" + (x).ToString();
                Panel11.Controls.Add(lb1);
            }
        }
    }
Panel Panel11 = new Panel();
Panel11 = (Panel)e.Row.FindControl("biaoqian");
如果创建了一个新的Panel11的话(注释掉第二句)页面上看不到新添加的label,如果不注释的话提示(Panel11.Controls.Add(lb1);)未将对象引用设置到对象的实例。如何能正常添加这些Label呢?

解决方案 »

  1.   

    Panel11 = (Panel)e.Row.Cells["列名"].FindControl("biaoqian");
      

  2.   

    Panel1在if语句外面定义:
    Panel panel1=null;
      

  3.   


    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                int result = Convert.ToInt32(GridView1.DataKeys[e.Row.RowIndex].Value);
                DropDownList ddl = (DropDownList)e.Row.FindControl("DropDownList1");
                Database db = DatabaseFactory.CreateDatabase();
                DbCommand dbCommand = db.GetStoredProcCommand("smart_blogtag");
                db.AddInParameter(dbCommand, "bid", DbType.Int32, result);
                DataSet ds = db.ExecuteDataSet(dbCommand);
                ddl.DataSource = ds;
                ddl.DataTextField = "tagName";
                ddl.DataValueField = "tagid";
                ddl.DataBind();
            }
        }用楼上另一个贴里贴的代码,添加DropDownList是可以的~~
    现在就是添加Label有点问题。
      

  4.   

    你添加了多少个Label?每个Label的ID不能相同!
      

  5.   

    不是ID的问题。
    Label的数值不一定,由数据库里的记录数得到。
      

  6.   

    Panel11 = (Panel)GridView1.Rows[e.RowIndex].Cells["列名"].FindControl("biaoqian"); 
      

  7.   

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                ShowHeader="False" Width="650px" OnRowDataBound="GridView1_RowDataBound" 
         GridLines="none" AllowPaging="True" BorderWidth="0px" CellPadding="0" DataKeyNames="id"
                EmptyDataText="暂时没有文章">
    <PagerSettings Mode="NumericFirstLast" />
    <Columns>
    <asp:TemplateField>
    <ItemTemplate>
    <h3>
                            <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("id", "/blog/{0}") %>'
                                Text='<%# Eval("title") %>' Target="_blank"></asp:HyperLink></h3>
                        <div class="right_time">
                            <asp:Label ID="time" runat="server" Text='<%# Bind("blogtime", "{0:yy-MM-dd}") %>'></asp:Label> 
                            标签:<asp:Panel ID="Panel1" runat="server">
                            </asp:Panel>
                        </div>
                        <div class="right_text">
                            <asp:Label ID="jjie" runat="server" Text='<%# Eval("context") %>'></asp:Label>
                        </div>
    </ItemTemplate>
    </asp:TemplateField>
    </Columns>
    </asp:GridView>前台是这样的
    一直提示:索引超出范围。必须为非负值并小于集合大小。
      

  8.   

    我可以肯定的告诉你Panel11 = (Panel)e.Row.FindControl("biaoqian");
    是没有错误的,当然你用e.row.cells[index].findcontrol("biaoqian")这种方式更好。速度快点
      

  9.   

    你把panel放在第几列了  不能e.Row.FindControl
    需要指定到单元格的  e.Row.Cells[x].FindControl
      

  10.   

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            //Panel panel1 = null;
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                int result = Convert.ToInt32(GridView1.DataKeys[e.Row.RowIndex].Value);
                Panel iPanel = (Panel)e.Row.FindControl("biaoqian");
                Database db = DatabaseFactory.CreateDatabase();
                DbCommand dbCommand = db.GetStoredProcCommand("smart_blogtag");
                db.AddInParameter(dbCommand, "bid", DbType.Int32, result);
                DataTable dt = db.ExecuteDataSet(dbCommand).Tables[0];
                for (int x = 0; x < dt.Rows.Count; x++)
                {
                    DataRow dr2 = dt.Rows[x];
                    Label lb1 = new Label();
                    if (x != dt.Rows.Count - 1)
                    {
                        lb1.Text = dr2["tagName"].ToString() + ",";
                    }
                    else
                    {
                        lb1.Text = dr2["tagName"].ToString();
                    }
                    lb1.ID = "Label" + (x).ToString();
                    iPanel.Controls.Add(lb1);
                }
            }
        }取到值以后提示的是
    iPanel.Controls.Add(lb1);
    这行没有被赋值
      

  11.   

    e.Row.FindControl("biaoqian").Visible = true;
    现在用这么一行,放哪里都报错,提示
    未将对象引用设置到对象的实例做完这个项目不再写程序了~~
    头都折磨大了。
      

  12.   

    按说,你这种问题甚至根本不用写一行代码,在页面设计时就可以了,它就是模板列中嵌套放置一个DataList然后让主从列表相互关联。
    例如你可以参考Scott Mitchell的asp.net2.0数据库编程入门教程:http://lidong.cnblogs.com/archive/2006/07/05/443207.html
    http://blog.csdn.net/fly_bird2008/archive/2007/09/14/1785140.aspx
    实际上,中下等的开发员倾向于手工编写大量代码。这样做确实可以用来搞清楚许多底层机制,但是编写代码越多,并不代表开发水平越高。中上等的开发员就会越来越倾向于不去手工编写代码。
      

  13.   


    功能描述上是没有错的。对于“速度”的结论,并不是正确的,实际上从Cell开始执行findControl不但不会快,而且逻辑上容易胡写一个index而把自己搞懵。可以参考我在帖子《e.item.cells[] 怎么用》中对FincControl机制的解释。
      

  14.   

    如果当前的Control不是实现了 INamingContainer,那么它会找到此控件的父控件,如果父控件是实现了INamingContainer的控件,就会从此控件开始找(在此控件内部查找),如果父控件还不是实现INamingContainer的控件,那就接着向上找,直到找到为止。
    他查找的内容也是有限制的,它只会查找直接隶属于当前控件的控件,而不会去查找此控件中实现了INamingContainer的其他控件中的控件。
    此例子中e.row.cells[index] 是TableCell类型的,此时调用FindControl方法时,因为TableControl没有实现INamingContainer,所以他会找到包含TableCell的父控件。e.Row GridViewRow  它是实现了INamingContainer的,所以就在此控件中查找要查找的内容。
    注意:在使用FindControl的时候一定要保证,此控件下的控件编号要唯一,不然就会找出多个控件的。出现异常。
    还有查找的时候要在具体的e.Row.RowType中查找,避免找不到要查找的控件。