在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呢?
{
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呢?
解决方案 »
- 这个外国游戏网站有个象QQ,那样的实时对话系统,向大家请教一下它的开发思路。
- 一個按鈕的問題!!!!!!!!!!
- 请教关于自定义控件属性的问题
- xml文件在修改时,如果当时有人访问,就会出错!
- 各位帮忙看看下面的html文件如何解密??
- 问题还是没有解决,我再次提问!
- asp.net excel导出本地没问题,部署之后偶尔会出现404
- win2000 WEB服务器安装什么东东才支持asp.net?不需要装全套VS吧?
- 如何在服务器端拿取<select runat="server">的值?
- 初学者的困惑,麻烦帮我看看?
- 拜托了 线程里执行的方法 为什么网页上无法显示呢
- 有没有办法后台设置控件的位置?
Panel panel1=null;
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有点问题。
Label的数值不一定,由数据库里的记录数得到。
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>前台是这样的
一直提示:索引超出范围。必须为非负值并小于集合大小。
是没有错误的,当然你用e.row.cells[index].findcontrol("biaoqian")这种方式更好。速度快点
需要指定到单元格的 e.Row.Cells[x].FindControl
{
//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);
这行没有被赋值
现在用这么一行,放哪里都报错,提示
未将对象引用设置到对象的实例做完这个项目不再写程序了~~
头都折磨大了。
例如你可以参考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
实际上,中下等的开发员倾向于手工编写大量代码。这样做确实可以用来搞清楚许多底层机制,但是编写代码越多,并不代表开发水平越高。中上等的开发员就会越来越倾向于不去手工编写代码。
功能描述上是没有错的。对于“速度”的结论,并不是正确的,实际上从Cell开始执行findControl不但不会快,而且逻辑上容易胡写一个index而把自己搞懵。可以参考我在帖子《e.item.cells[] 怎么用》中对FincControl机制的解释。
他查找的内容也是有限制的,它只会查找直接隶属于当前控件的控件,而不会去查找此控件中实现了INamingContainer的其他控件中的控件。
此例子中e.row.cells[index] 是TableCell类型的,此时调用FindControl方法时,因为TableControl没有实现INamingContainer,所以他会找到包含TableCell的父控件。e.Row GridViewRow 它是实现了INamingContainer的,所以就在此控件中查找要查找的内容。
注意:在使用FindControl的时候一定要保证,此控件下的控件编号要唯一,不然就会找出多个控件的。出现异常。
还有查找的时候要在具体的e.Row.RowType中查找,避免找不到要查找的控件。