○○○急!关于动态添加控件问题,详情进!○○○
目前动态添加已完成了,
只是动态添加的TextBox控件名称无法在程序中使用如何办?
如,我动态添加的TextBox控件ID是txt_1,由于是动态添加的
当程序运行时并没有ID是txt_1的TextBox就会报错, 在程序中怎么使用?
源码如下:
static int iCount;//定义的静态变量
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
iCount=0;
}
else
{
CreatedControls(iCount);
}
}
#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)
{
iCount=iCount+1;
}
void CreatedControls(int count)
{
TextBox txt;
Button btn;
Label lbl;
TextBox txt1;
Button btn1;
Label lbl1;
for(int i=0;i<count;i++)
{
lbl=new Label();
txt=new TextBox();
btn=new Button();
lbl.ID ="lbl_"+(i+1).ToString();
lbl.Text="新增附件";
txt.ID = "txt_"+(i+1).ToString();
txt.Text=txt.ID;
btn.ID = "btn_"+(i+1).ToString();
btn.Text="浏览文件";
this.Panel1.Controls.Add(lbl);
this.Panel1.Controls.Add(txt);
this.Panel1.Controls.Add(btn);
btn.Click += new System.EventHandler(btn_Click);
lbl1=new Label();
txt1=new TextBox();
btn1=new Button();
lbl1.ID ="lbl1_"+(i+1).ToString();
lbl1.Text="附件标题";
txt1.ID = "txt1_"+(i+1).ToString();
btn1.ID = "btn1_"+(i+1).ToString();
btn1.Text="删除本条";
this.Panel1.Controls.Add(lbl1);
this.Panel1.Controls.Add(txt1);
this.Panel1.Controls.Add(btn1);
btn1.Click += new System.EventHandler(btn1_Click);
}
}
private void btn_Click(object sender, System.EventArgs e)
{
}
private void btn1_Click(object sender, System.EventArgs e)
{
}
问题点数:60、回复次数:15Top
1 楼KevinCao(我老婆很小(猥琐是一种境界)(散会中...)(不是散会,是散分中...))回复于 2004-08-02 09:01:25 得分 2
楼主拜托你重新上一下语文科
还有你贴这么多代码谁去看啊,你把关键的语句写出来就可以了Top
2 楼SuperW(精品烂人)回复于 2004-08-02 09:16:37 得分 0
To:KevinCao ,训的好!
如,我动态添加的TextBox控件ID是txt_1,由于是动态添加的
当程序运行时并没有ID是txt_1的TextBox就会报错, 在程序中怎么引用?
使用txt_1.Text="XXX"会报错.Top
3 楼wnlovezxm(大垃圾人)回复于 2004-08-02 09:33:05 得分 2
if (this.Page.Controls.FindControl("txt_1")!=null)
{
txt_1.Text = "asdfasdf";
}
Top
4 楼loveerror(马烁焱)回复于 2004-08-02 09:36:20 得分 4
遍历this.Panel1.Controls中的所有控件,查找ID为txt_1的控件就是了.Top
5 楼SuperW(精品烂人)回复于 2004-08-02 09:54:30 得分 0
to:wnlovezxm(大垃圾人)
txt_1.text="xxx"
刚载页面时还没有txt_1呀,会出错的。Top
6 楼brightheroes(在地狱中仰望天堂)回复于 2004-08-02 09:59:27 得分 2
你要用FindControl
Top
7 楼brightheroes(在地狱中仰望天堂)回复于 2004-08-02 10:00:52 得分 0
TextBox tb = (TextBox)........FindControl("txt_1");
if(tb != null)
{
tb.Text = "找到了!";
}Top
8 楼SuperW(精品烂人)回复于 2004-08-02 12:04:19 得分 0
谢谢各位回应,以上方法都试了。问题还没解决?Top
9 楼goody9807(http://goody9807.cnblogs.com)回复于 2004-08-02 12:11:35 得分 20
这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在
if (!IsPostBack)
{
//动态产生或装载控件
//也许需要连接控件事件处理函数
//加到父控件的Controls
}
里生成或装载了动态控件。当控件在客户端触发,postback到服务器端时,IsPostBack==true,这些控件没有被重新生成,怎么能触发事件?所以答案是,当你需要动态生成或装载控件时,应该在if (!IsPostBack)之外做。我问为什么想在if (!IsPostBack)之内做呢?回答是想只生成一次,跟在ASPX页面里一样
<form id="form1" runat=server>
<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>
#%&%#&%^#&,你怎么会认为这个控件只生成一次呢?这些玩意也不是魔术,想生成一个Button对象,你需要用
Button btn = new Button();
需要触发它的Click事件,你需要用
btn.Click += new EventHandler(YourHandler);
即使象包含
<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>
的页面,它也是被转化成C#或VB文件,编译成assembly,然后再被执行的啊
不信?加一个页面,TestControls.aspx:
<%@ Page Debug="true" %>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient"%>
<form id="form1" runat=server>
<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="false" GridLines="Both">
<Columns>
<asp:TemplateColumn HeaderText="Name">
<ItemTemplate><%# DataBinder.Eval(Container.DataItem,"Name")%></ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
</form>
<script language="C#" runat="server">
void Button_Click(Object sender, EventArgs e)
{
Button btn = (Button)sender;
Response.Write(btn.Text + " is clicked<BR>");
}
void Page_Load(Object sender, EventArgs e)
{
Button btn = new Button();
btn.ID = "Button2";
btn.Text = "Button2";
btn.Click += new EventHandler(Button_Click);
form1.Controls.Add(btn);
if (!IsPostBack)
{
SqlDataAdapter da = new SqlDataAdapter("select Name=au_fname + ' ' + au_lname from authors", "server=localhost;database=pubs;uid=sa;pwd=;");
DataTable dt = new DataTable();
da.Fill(dt);
DataGrid1.DataSource = dt.DefaultView;
DataGrid1.DataBind();
}
//}//这是故意的
</script>
把最后一个“}”注释掉,然后在浏览器里向你的服务器调用TestControls.aspx
Top
10 楼SuperW(精品烂人)回复于 2004-08-02 12:38:07 得分 0
goody9807():
现在是解决不了点击button先执行点击过程,再Page_LoadTop
11 楼SuperW(精品烂人)回复于 2004-08-02 12:40:32 得分 0
希望goody9807()
看看我写的代码再回答,谢谢!Top
12 楼wnlovezxm(大垃圾人)回复于 2004-08-02 13:22:16 得分 10
to:wnlovezxm(大垃圾人)
txt_1.text="xxx"
刚载页面时还没有txt_1呀,会出错的。
------------------------------------------------------------
if (this.Page.Controls.FindControl("txt_1")!=null)
{
(TextBox)txt_1.Text = "asdfasdf";
}
刚载页面时还没有txt_1,也不会出错的。有判断了,要是有“txt_1”就用,没有就不执行了你试验一下就知道了,还有不要直接粘贴我的代码,我随手写的,单词拼写可能有错,你自己在ide里写!
Top
13 楼wnlovezxm(大垃圾人)回复于 2004-08-02 13:22:52 得分 0
if (this.Page.Controls.FindControl("txt_1")!=null)
{
((TextBox)txt_1.Text) = "asdfasdf";
}
Top
14 楼ZeroGong(希光)回复于 2004-08-06 14:03:51 得分 20
这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在
if (!IsPostBack)
{
//动态产生或装载控件
//也许需要连接控件事件处理函数
//加到父控件的Controls
}
里生成或装载了动态控件。当控件在客户端触发,postback到服务器端时,IsPostBack==true,这些控件没有被重新生成,怎么能触发事件?所以答案是,当你需要动态生成或装载控件时,应该在if (!IsPostBack)之外做。我问为什么想在if (!IsPostBack)之内做呢?回答是想只生成一次,跟在ASPX页面里一样
<form id="form1" runat=server>
<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>
#%&%#&%^#&,你怎么会认为这个控件只生成一次呢?这些玩意也不是魔术,想生成一个Button对象,你需要用
Button btn = new Button();
需要触发它的Click事件,你需要用
btn.Click += new EventHandler(YourHandler);
即使象包含
<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>
的页面,它也是被转化成C#或VB文件,编译成assembly,然后再被执行的啊
不信?加一个页面,TestControls.aspx:
<%@ Page Debug="true" %>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient"%>
<form id="form1" runat=server>
<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="false" GridLines="Both">
<Columns>
<asp:TemplateColumn HeaderText="Name">
<ItemTemplate><%# DataBinder.Eval(Container.DataItem,"Name")%></ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
</form>
<script language="C#" runat="server">
void Button_Click(Object sender, EventArgs e)
{
Button btn = (Button)sender;
Response.Write(btn.Text + " is clicked<BR>");
}
void Page_Load(Object sender, EventArgs e)
{
Button btn = new Button();
btn.ID = "Button2";
btn.Text = "Button2";
btn.Click += new EventHandler(Button_Click);
form1.Controls.Add(btn);
if (!IsPostBack)
{
SqlDataAdapter da = new SqlDataAdapter("select Name=au_fname + ' ' + au_lname from authors", "server=localhost;database=pubs;uid=sa;pwd=;");
DataTable dt = new DataTable();
da.Fill(dt);
DataGrid1.DataSource = dt.DefaultView;
DataGrid1.DataBind();
}
//}//这是故意的
</script>
把最后一个“}”注释掉,然后在浏览器里向你的服务器调用TestControls.aspx
Top
15 楼SuperW(精品烂人)回复于 2004-08-06 14:05:00 得分 0
好了,结帐!Top




