为什么FindControl找不到new出来的控件

hacker1219 2006-07-07 01:10:58
Button btnAdd = new Button();
btnAdd.Text = "111111111111111";
this.tableTwo.Rows[0].Cells[0].Controls.Add(btnAdd);


Button btnAdd = (Button)this.FindControl("btnAdd");
Response.Write(btnAdd.Text);

为什么这样在cs文件里new的控件,用FindControl找不到?


异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

源错误:


行 108: Button btnAdd = (Button)this.FindControl("btnAdd");
行 109:
行 110: Response.Write(btnAdd.Text);
行 111: }
行 112: }
...全文
519 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
hacker1219 2006-07-07
  • 打赏
  • 举报
回复
在Page_Load函数的执行期间里??不太明白,烦请详解。
哪位大虾能帮我分析一下,在cs代码里new出来的控件是在什么时候实例化的,他的生命周期是否和在aspx页面里面创建的控件一样。
lljianmao 2006-07-07
  • 打赏
  • 举报
回复
不过,一定要在Page_Load函数的执行期间里才能找到
lljianmao 2006-07-07
  • 打赏
  • 举报
回复
不好意思
Button btnAdd = new Button();
btnAdd.ID = "btnAdd1";
btnAdd.Text = "111111111111111";

this.tableTwo.Rows[0].Cells[0].Controls.Add(btnAdd);


Button btnAdd = (Button)this.tableTwo.Rows[0].Cells[0].FindControl("btnAdd1");
Response.Write(btnAdd.Text);
hacker1219 2006-07-07
  • 打赏
  • 举报
回复
问题不在这里,下面我设了ID也不行:
Button btnAdd1 = new Button();
btnAdd1.ID = "btnAdd2";
btnAdd1.Text = "11111111111";

this.tableTwo.Rows[0].Cells[0].Controls.Add(btnAdd1);

Button btnAdd = (Button)this.tableTwo.Rows[0].Cells[0].FindControl("btnAdd2");
Response.Write(btnAdd.Text);
lljianmao 2006-07-07
  • 打赏
  • 举报
回复
Button btnAdd = new Button();
btnAdd.Text = "111111111111111";
this.tableTwo.Rows[0].Cells[0].Controls.Add(btnAdd);


Button btnAdd = (Button)this.tableTwo.Rows[0].Cells[0].FindControl("btnAdd");
Response.Write(btnAdd.Text);
jimu8130 2006-07-07
  • 打赏
  • 举报
回复
http://www.itcomputer.com.cn/Network/ASPNET/200512/44157.html
Ivony 2006-07-07
  • 打赏
  • 举报
回复
FindControl是按控件的ID来找的,你那个控件的ID是什么?
coley 2006-07-07
  • 打赏
  • 举报
回复
Button btnAdd = new Button();
btnAdd.Text = "111111111111111";
btnAdd.id = "btnAdd1";
this.tableTwo.Rows[0].Cells[0].Controls.Add(btnAdd);


Button btnAdd2 = (Button)this.FindControl("btnAdd1");
Response.Write(btnAdd2 .Text);

id都没有怎么找啊,况且你的命名重复了
hacker1219 2006-07-07
  • 打赏
  • 举报
回复
我这是个测试程序,实际我是找到了datalist1。items【i】然后去FindControl也找不到,现在就是说把问题简化了:Button btnAdd = new Button();
btnAdd.Text = "111111111111111";
this.tableTwo.Rows[0].Cells[0].Controls.Add(btnAdd);


Button btnAdd = (Button)this.FindControl("btnAdd");
Response.Write(btnAdd.Text);
这样都找不到。

Button btnAdd = new Button();
btnAdd.Text = "11111111111";
this.tableTwo.Rows[0].Cells[0].Controls.AddAt(2,btnAdd);

Button btnAdd = (Button)this.tableTwo.Rows[0].Cells[0].Controls[2];
Response.Write(btnAdd.Text);

这样也找不到
jimu8130 2006-07-07
  • 打赏
  • 举报
回复
上面有个说法错误“你看你的这段代码是每个datalist1的项目里添加一个datalist2”应该改变为“你看你的这段代码是每个datalist1的每个item里添加一个datalist2”
jimu8130 2006-07-07
  • 打赏
  • 举报
回复
public void DataList1_ItemCreated(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem )
{
//new一个DataList
DataList dl = new DataList();
dl.ID = "test";
dl.ItemTemplate = new myTemp1();
dl.DataSource = CreateDataSource2(e.Item.ItemIndex );
dl.DataBind();
e.Item.Controls.Add (dl);
}
}
你看你的这段代码是每个datalist1的项目里添加一个datalist2,而且每个datalist2的id都是同一个名字,你用一个(DataList)this.DataList1.FindControl("test")怎么可能定位到datalist1包含的datalist2了?要么你得遍历datalist1然后每个item去findcontrol一下才行
zeng_c_h 2006-07-07
  • 打赏
  • 举报
回复
Button btnAdd = (Button)this.tableTwo.Rows[0].Cells[0].Controls[i];
其中,i等于表格中的控件索引值,若只有一個為0;
hacker1219 2006-07-07
  • 打赏
  • 举报
回复
cs代码:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace HNAS.IMP.IMPVoteWebUI
{
/// <summary>
/// test 的摘要说明。
/// </summary>
public class test1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Table tableOne;
protected System.Web.UI.HtmlControls.HtmlTable tableTwo;
protected System.Web.UI.WebControls.DataList DataList2;
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.DataList DataList1;

ICollection CreateDataSource()
{
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
for (int i = 0; i < 2; i++)
{
dr = dt.NewRow();
dr[0] = "分项 " + i.ToString();
dt.Rows.Add(dr);
}
DataView dv = new DataView(dt);
return dv;
}

ICollection CreateDataSource2(int i)
{
DataTable dt = new DataTable();
DataRow dr;
if(i<0) i = 0;
dt.Columns.Add(new DataColumn("StringValue",typeof(string)));
for(int m=0;m<2;m++)
{
dr = dt.NewRow();
dr[0] = "选项 " + m.ToString();
dt.Rows.Add(dr);
}
DataView dv = new DataView(dt);
return dv;
}


public void Page_Load(Object sender, EventArgs e)
{
if (!IsPostBack)
{
DataList1.DataSource = CreateDataSource();
DataList1.DataBind();
}
}

public void DataList1_ItemCreated(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem )
{
//new一个DataList
DataList dl = new DataList();
dl.ID = "test";
dl.ItemTemplate = new myTemp1();
dl.DataSource = CreateDataSource2(e.Item.ItemIndex );
dl.DataBind();
e.Item.Controls.Add (dl);
}
}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void Button1_Click(object sender, System.EventArgs e)
{
//这种方法找不到该控件,在页面返回的html代码里这个datalist的id是DataList1__ctl1_test,DataList1__ctl2_test
DataList dList = (DataList)this.DataList1.FindControl("test");
//现在需要找到这个datalist,判断他的items.count,然后方能取到他里面的值
}
}

public class myTemp1 : ITemplate
{
static int itemcount;

public void InstantiateIn(System.Web.UI.Control container)
{
Literal lc = new Literal();
lc.DataBinding += new EventHandler(TemplateControl_DataBinding);
itemcount += 1;
container.Controls.Add(lc);
}
public void TemplateControl_DataBinding(object sender, System.EventArgs e)
{
Literal lc;
lc = (Literal) sender;
DataListItem container = (DataListItem )lc.NamingContainer;
lc.Text += DataBinder.Eval(container.DataItem, "StringValue");
lc.Text += "<table width='100%' id='tabletest'><tr><td>";
lc.Text += "</TD></TR>";
lc.Text += "<tr><td></td></tr></table>";
}
}
}
hacker1219 2006-07-07
  • 打赏
  • 举报
回复
页面代码:
<%@ Register TagPrefix="HNAS" Namespace="HNAS.IMP.WebComponents" Assembly="HNAS.IMP.WebComponents" %>
<%@ Page language="c#" Codebehind="test1.aspx.cs" AutoEventWireup="false" Inherits="HNAS.IMP.IMPVoteWebUI.test1" %>
<HTML>
<script language="C#" runat="server">

</script>
<body>
<form runat="server">
<asp:datalist id="DataList1" runat="server" RepeatDirection="Horizontal" Width="100%" OnItemCreated="DataList1_ItemCreated"
Font-Size="8pt" BorderWidth="1" GridLines="Both" RepeatColumns="1" RepeatLayout="Table" Font-Name="Verdana"
CellPadding="3" BorderColor="black">
<SelectedItemStyle Font-Bold="True" ForeColor="#F7F7F7" BackColor="#738A9C"></SelectedItemStyle>
<HeaderStyle BackColor="#aaaadd"></HeaderStyle>
<AlternatingItemStyle BackColor="Gainsboro"></AlternatingItemStyle>
<HeaderTemplate>
调查主题
</HeaderTemplate>
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "StringValue") %>
</ItemTemplate>
</asp:datalist><asp:table id="tableOne" runat="server">
<asp:TableRow ID="rowOne" Runat="server">
<asp:TableCell ID="cellOne" Runat="server"></asp:TableCell>
</asp:TableRow>
</asp:table>
<table id="tableTwo" runat="server" width="100%" border="5">
<tr bgcolor="#ff6600">
<td height="10"></td>
</tr>
<tr bgcolor="#99ff00">
<td height="10"></td>
</tr>
<tr bgcolor="#ff0099">
<td height="10" id="tdBtn">
<asp:Button id="Button1" runat="server" Width="288px" Text="Button"></asp:Button></td>
</tr>
</table>
</form>
</body>
</HTML>
hacker1219 2006-07-07
  • 打赏
  • 举报
回复
this.tableTwo.Rows[0].Cells[0].findcontrol?这样也不行,我看我还是把代码贴出来吧,希望大家能帮我解决啊
jimu8130 2006-07-07
  • 打赏
  • 举报
回复
this.tableTwo.Rows[0].Cells[0].findcontrol?
hacker1219 2006-07-07
  • 打赏
  • 举报
回复
guodawu() 老兄的说法肯定行,但是那样我实现不了现在要解决的问题啊。希望有哪位仁兄能给我指点迷津啊,不胜感谢!
hz890 2006-07-07
  • 打赏
  • 举报
回复
我的答案是错误的,不好意思。用guodawu() 的吧。
hacker1219 2006-07-07
  • 打赏
  • 举报
回复
老大们,我现在是需要找个这个控件,让我把FindControl删掉我还干吗啊。具体问题是这样的,我要做一个调查系统,要实现的是:调查主题——n个分项——n个问题——n个选项(单选,多选,单行文本,多行文本),这样呢,我就用两个DataList嵌套完成了显示,首先建一个DataLidst(用于显示分项),然后在DataList_ItemCreated事件里面再new一个DataList(用于显示问题和选项),这样的显示都已经完成了,现在就是在用户提交的时候我需要找到new出来的那个DataList,然后找到相应的问题编号进行数据录入。
guodawu 2006-07-07
  • 打赏
  • 举报
回复
你把Button btnAdd = (Button)this.FindControl("btnAdd"); 这句话去掉就好了。
加载更多回复(3)

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧