动态添加事件到自定义控件(确认消息框)

时间:2012-08-29 03:30:52

标签: c# asp.net custom-controls messagebox dopostback

我创建了一个自定义的cofirm消息框控件,我创建了一个这样的事件 -

[Category("Action")]
[Description("Raised when the user clicks the button(ok)")]
    public event EventHandler Submit;

protected virtual void OnSubmit(EventArgs e) {
     if (Submit != null)
        Submit(this, e);
}


当用户单击“Confrim Box”上的“确定”按钮时,会发生Event OnSubmit。

void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
{
    OnSubmit(e);
}


现在我像这样动态地添加这个OnSubmit事件 在aspx中 -

<my:ConfirmMessageBox ID="cfmTest" runat="server" ></my:ConfirmMessageBox>
    <asp:Button ID="btnCallMsg" runat="server" onclick="btnCallMsg_Click" />
    <asp:TextBox ID="txtResult" runat="server" ></asp:TextBox>

在cs -

protected void btnCallMsg_Click(object sender, EventArgs e)
{
  cfmTest.Submit += cfmTest_Submit;//Dynamically Add Event
  cfmTest.ShowConfirm("Are you sure to Save Data?");  //Show Confirm Message using Custom Control Message Box
}

    protected void cfmTest_Submit(object sender, EventArgs e)
        {
          //..Some Code..
          //..
          txtResult.Text = "User Confirmed";//I set the text to "User Confrimed" but it's not displayed
          txtResult.Focus();//I focus the textbox but I got Error
        }

我得到的错误是 - System.InvalidOperationException未被用户代码处理   Message =“只能在PreRender之前和期间调用SetFocus。”   源= “的System.Web”

因此,当我动态添加和触发自定义控件的事件时,Web Control中存在错误。 如果我在这样的aspx文件中添加事件,

<my:ConfirmMessageBox ID="cfmTest" runat="server" OnSubmit="cfmTest_Submit"></my:ConfirmMessageBox>

没有错误,工作正常。

有人可以帮我动态添加事件到自定义控件吗? 感谢。

2 个答案:

答案 0 :(得分:1)

问题不在于生命周期后期添加事件的组合,以及您尝试使用事件处理程序实现的内容。

正如错误明确指出的那样,问题在于这一行:

txtResult.Focus();

如果您希望能够将焦点设置为控件,则必须在InitLoad上添加事件处理程序。

您可以使用jquery在客户端设置焦点来解决此问题。

var script = "$('#"+txtResult.ClientID+"').focus();";

您必须使用RegisterClientScriptBlock发出此消息。

答案 1 :(得分:0)

最简单的改变是移动focus()调用:

bool focusResults = false;

    protected void cfmTest_Sumit(object sender, EventArgs e)
    {
      txtResult.Text = "User Confirmed";
     focusResults = true;
    }

    protected override void OnPreRender(EventArgs e)
    {
       base.OnPreRender(e);

        if(focusResults)
           txtResult.Focus();
    }

你确定txtResult.Text没有在其他地方再次设置吗?