C# 禁用";原因验证“;用于动态创建的按钮

C# 禁用";原因验证“;用于动态创建的按钮,c#,asp.net,C#,Asp.net,我创建同一个按钮两次:一次在Page_Load上,另一次在:Page_PreRender上。 我希望看到相同的行为,但是,在Page_PreRender上创建的按钮没有按预期的方式工作。(即,属性“causeValidation”仍然正确) “我想为页面\u preRender中的按钮禁用“causeValidation”,我想在页面\u preRender中禁用该按钮。另外,我想为两个按钮执行按钮\u Click功能,目前仅对在“页面\u load”中创建的按钮执行该功能。” 我正在为这种行为

我创建同一个按钮两次:一次在Page_Load上,另一次在:Page_PreRender上。 我希望看到相同的行为,但是,在Page_PreRender上创建的按钮没有按预期的方式工作。(即,属性“causeValidation”仍然正确)

“我想为页面\u preRender中的按钮禁用“causeValidation”,我想在页面\u preRender中禁用该按钮。另外,我想为两个按钮执行按钮\u Click功能,目前仅对在“页面\u load”中创建的按钮执行该功能。”

我正在为这种行为寻找解决方案或解释

多谢各位

看看代码:

protected void Page_Load(object sender, EventArgs e)
    {            
        form1.Controls.Add(GetButton("Button1", "Click"));
    }

    protected void page_PreRender(object sender, EventArgs e)
    {
        form1.Controls.Add(GetButton("Button3", "Click"));
    }

    private Button GetButton(string id, string name)
    {
        Button b = new Button();
        b.Text = name;
        b.ID = id;
        b.CausesValidation = false;
        b.Click += new EventHandler(Button_Click);
        b.OnClientClick = "ButtonClick('" + b.ClientID + "')";
        return b;
    }

    protected void Button_Click(object sender, EventArgs e)
    {
        ClientScript.RegisterClientScriptBlock(this.GetType(), ((Button)sender).ID, "<script>alert('Button_Click');</script>");
        Response.Write(DateTime.Now.ToString() + ": " + ((Button)sender).ID + " was clicked");
    }
受保护的无效页面加载(对象发送方,事件参数e)
{            
表单1.控件。添加(GetButton(“Button1”,“单击”);
}
受保护的无效页面\u预呈现(对象发送方,事件参数e)
{
表单1.控件。添加(获取按钮(“按钮3”,“单击”);
}
私有按钮GetButton(字符串id、字符串名称)
{
按钮b=新按钮();
b、 文本=名称;
b、 ID=ID;
b、 CausesValidation=false;
b、 单击+=新建事件处理程序(按钮单击);
b、 OnClientClick=“ButtonClick(“+b.ClientID+”)”;
返回b;
}
受保护的无效按钮\u单击(对象发送者,事件参数e)
{
ClientScript.RegisterClientScriptBlock(this.GetType(),((按钮)sender).ID,“警报('Button_Click');”;
Response.Write(DateTime.Now.ToString()+”:“+((按钮)sender.ID+”已单击”);
}
下面是javascript:

<script type="text/javascript">
    function ButtonClick(buttonId) {
        alert("Button " + buttonId + " clicked from javascript");
    }
</script>

功能按钮单击(按钮ID){
警报(“按钮”+按钮ID+“从javascript中单击”);
}
更新: 让我补充一下:两个按钮都执行客户端的脚本。这意味着将创建按钮。“请参阅函数GetButton()


另外,我之所以创建“on preRender”而不是“on Page_Load”按钮,是因为:如果我有一个表单用于动态地将数据输入表中,并且我在单击按钮时添加数据,那么页面将首先回发,然后执行事件处理程序(即,数据被添加到表中,但将在下次回发时显示). 因此,PreRender用于在button_click事件更新表后显示该表

我希望此添加内容有用

从该图中可以看到,它表示asp.net页面生命周期(从中复制),
事件处理
预渲染
之前。因此,要启动
按钮,必须在
事件处理之前创建按钮本身。Page PreInit是添加动态控件的首选位置

您可以自己查看,只需在
页面加载
页面预渲染
按钮单击
,添加断点即可。请注意触发的顺序?

检查asp.net:事件在页面加载之后和预渲染之前处理


ASP.NET无法处理涉及尚未存在的控件的事件。

这是一个很好的解释,但让我补充一点:两个按钮都执行客户端脚本。这意味着将创建按钮。“请参阅函数GetButton()”。另外,我之所以创建“on preRender”而不是“on Page_Load”按钮,是因为:如果我有一个表单用于将数据动态输入表中,并且我在单击按钮时添加数据,那么页面将首先回发,然后执行事件处理程序,(即数据已添加到表中,但将在下次回发时显示)。因此,PreRender用于在通过按钮单击事件更新表后显示该表。我希望此添加是正确的useful@MAltakrori是的,这两个按钮都存在于页面上,是的客户端脚本将被执行。但当页面提交到服务器时,页面将开始新的生命,当涉及到事件处理部分时,将没有按钮3。至于第二条评论-没有真正达到你想要达到的目的。我想你是在追求客户端脚本。也许JS会适合你。如果我没有弄错,那么我同意你的看法,但我已经在PreRender上添加了事件处理程序,所以这意味着当我单击按钮时,事件处理程序应该执行附加的函数。我说得对吗?不,因为e当使用EventTarget=Button3处理事件时,没有具有该ID的控件,因此跳过该控件。