一个LoginContorl用户控件,界面上什么都没有,一切控件均由代码生成相关代码如下:protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 动态生成控件
CreateControl();
}
// 理论上我在CreateControl()方法中已经创建了按钮并给它绑定了事件,这里就不需要绑定了
// 但是当程序执行到这里的时候是找不到"btnLogin"这个控件的
// 也就是说当客户端点击生成的按钮触发事件时所有原来动态生成的控件都已经不存在了
// 应该如何保存这些动态生成的控件的状态呢?
// Button btnLogin=this.FindControl("btnLogin_UC");
// btnLogin.Click += new EventHandler(btnLogin_Click);
}void CreateControl()
{
Button btnLogin=new Button();
btnLogin.Text = "登录";
btnLogin.Id = "btnLoigin_UC";
btnLogin.Click += new EventHandler(btnLogin_Click);
}protected void btnLogin_Click(object sender, EventArgs e)
{
Response.WriteLine("<script type=\"text/javascript\">alert('登录成功')</script>");
}
{
if (!IsPostBack)
{
// 动态生成控件
CreateControl();
}
// 理论上我在CreateControl()方法中已经创建了按钮并给它绑定了事件,这里就不需要绑定了
// 但是当程序执行到这里的时候是找不到"btnLogin"这个控件的
// 也就是说当客户端点击生成的按钮触发事件时所有原来动态生成的控件都已经不存在了
// 应该如何保存这些动态生成的控件的状态呢?
// Button btnLogin=this.FindControl("btnLogin_UC");
// btnLogin.Click += new EventHandler(btnLogin_Click);
}void CreateControl()
{
Button btnLogin=new Button();
btnLogin.Text = "登录";
btnLogin.Id = "btnLoigin_UC";
btnLogin.Click += new EventHandler(btnLogin_Click);
}protected void btnLogin_Click(object sender, EventArgs e)
{
Response.WriteLine("<script type=\"text/javascript\">alert('登录成功')</script>");
}
只是刚刚写的时候忘记写上去了
生成的控件在客户端已经能够正常的查看了
你并没有把这个控件添加到页面
你要在页面加载的时候 把他添加到页面
这样你就可以找到了
inPutText.Size = new Size(432, 20);
inPutText.Location = new Point(10, 105);
inPutFrm.Controls.Add(inPutText);
inPutText.SelectAll();
inPutText.KeyDown += new KeyEventHandler(this.inPutTextKeyDown);最后一句就是使用委托实现动态生成的控件与事件关联!
inPutTextKeyDown就是为控件编写的方法。
{
// 动态生成控件
CreateControl();
// 理论上我在CreateControl()方法中已经创建了按钮并给它绑定了事件,这里就不需要绑定了
// 但是当程序执行到这里的时候是找不到"btnLogin"这个控件的
// 也就是说当客户端点击生成的按钮触发事件时所有原来动态生成的控件都已经不存在了
// 应该如何保存这些动态生成的控件的状态呢?
// Button btnLogin=this.FindControl("btnLogin_UC");
// btnLogin.Click += new EventHandler(btnLogin_Click);
} void CreateControl()
{
Button btnLogin=new Button();
btnLogin.Text = "登录";
btnLogin.Id = "btnLoigin_UC";
Page.Form.Controls.Add(btnLogin);
btnLogin.Click += new EventHandler(btnLogin_Click);
} protected void btnLogin_Click(object sender, EventArgs e)
{
Response.WriteLine(" <script type=\"text/javascript\">alert('登录成功') </script>");
}
--------------------------------
如果你要事件有效,那么,你每一次PostBack之后都需要调用CreateContrl事件,并不只是说第一个页面Page_Load生成之后就不用理了
{
if (e.KeyData == Keys.Enter)
inPutFrm.Close();
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ShowControl();
Session.Add("LoginControl", this);
}
else
{
LoginControl login = (LoginControl)Session["LoginControl"];
Button btn = (Button)login.FindControl("btnLogin_UC");
btn.Click += new EventHandler(btnLogin_Click);
}
}
用上面的方法是把用户控件保存到Session中了,也能找到了btnLogin_UC但是当运行到else时,Session中的login已经不是当前正在运行的实例了,所以还是不能触发之前绑定的事件
拜托这位仁兄看清楚在回答好吗?
void CreateControl()
{
Button btnLogin=new Button();
btnLogin.Text = "登录";
btnLogin.Id = "btnLoigin_UC";
// 这不是绑定事件吗?
btnLogin.Click += new EventHandler(btnLogin_Click);
this.Controls.Add(btnLogin);
}在这个方法中我是写有向页面添加创建按钮的语句的,只是在发帖的时候忘了输入上去了
这些都不是这个问题的重点
再次说明一下“我动态创建的控件已经能够正常浏览了”
{
ShowControl();
if (!IsPostBack)
{
Session.Add("LoginControl", this);
}
else
{
LoginControl login = (LoginControl)Session["LoginControl"];
Button btn = (Button)login.FindControl("btnLogin_UC");
btn.Click += new EventHandler(btnLogin_Click);
}
}
也就是说无论你在什么情况下,都要动态产生一下控件,否则会失败的。
我写的用户控件,本身不包含在Form里面,但是当我在其他页面引用它时就已经包含在该页的form里面了
可以看看这个
正解!总结:
虽然在页面提交后又执行了一次创建控件的事件,但是创建的控件保留了页面传过来的信息
达到了我的要求,原来一直以为只要我执行了相同的方法就会覆盖掉原来的控件的值。
看来对Web的了解还是很肤浅呀