一个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>");
}

解决方案 »

  1.   

    在 CreateControl() 方法中当然还有向界面添加控件的语句啦
    只是刚刚写的时候忘记写上去了
    生成的控件在客户端已经能够正常的查看了
      

  2.   

    很明显 你只是创建了一个button对象 或者说实例
    你并没有把这个控件添加到页面
    你要在页面加载的时候 把他添加到页面
    这样你就可以找到了
      

  3.   

    这个一定可以:            //创建“文本框”控件
                inPutText.Size = new Size(432, 20);
                inPutText.Location = new Point(10, 105);
                inPutFrm.Controls.Add(inPutText);
                inPutText.SelectAll();
                inPutText.KeyDown += new KeyEventHandler(this.inPutTextKeyDown);最后一句就是使用委托实现动态生成的控件与事件关联!
      

  4.   

    KeyDown是生成控件的事件;
    inPutTextKeyDown就是为控件编写的方法。
      

  5.   

    protected void Page_Load(object sender, EventArgs e) 

     
            // 动态生成控件 
            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生成之后就不用理了
      

  6.   

    方法原形如下:        private void inPutTextKeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyData == Keys.Enter)
                    inPutFrm.Close();
            }
      

  7.   

    你看看你的控件是不是在form里面
      

  8.   


    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已经不是当前正在运行的实例了,所以还是不能触发之前绑定的事件
      

  9.   


    拜托这位仁兄看清楚在回答好吗?
    void CreateControl() 

        Button btnLogin=new Button(); 
        btnLogin.Text = "登录"; 
        btnLogin.Id = "btnLoigin_UC"; 
        // 这不是绑定事件吗?
        btnLogin.Click += new EventHandler(btnLogin_Click);
        this.Controls.Add(btnLogin); 
    }在这个方法中我是写有向页面添加创建按钮的语句的,只是在发帖的时候忘了输入上去了
    这些都不是这个问题的重点

    再次说明一下“我动态创建的控件已经能够正常浏览了”
      

  10.   

    楼上的代码有点小错误:当你运行到else时,应该是提交了页面,但是你的页面只是在不是提交返回是产生的。当新提交时动态不产生了。所以就会找不到。这跟动态产生用户控件,并取值问题一样。应该把protected void Page_Load(object sender, EventArgs e)
    {
    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);
        }
    }
    也就是说无论你在什么情况下,都要动态产生一下控件,否则会失败的。
      

  11.   


    我写的用户控件,本身不包含在Form里面,但是当我在其他页面引用它时就已经包含在该页的form里面了
      

  12.   

    http://blog.csdn.net/nihongyuan/archive/2007/11/07/1871262.aspx
    可以看看这个
      

  13.   


    正解!总结:
    虽然在页面提交后又执行了一次创建控件的事件,但是创建的控件保留了页面传过来的信息
    达到了我的要求,原来一直以为只要我执行了相同的方法就会覆盖掉原来的控件的值。
    看来对Web的了解还是很肤浅呀