0

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

[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);
}


当用户单击确认框上的确定按钮时,事件 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="SetFocus 只能在 PreRender 之前和期间调用。" 来源="系统.Web"

因此,当我动态添加并触发自定义控件的事件时,Web 控件中会出现错误。如果我像这样在 aspx 文件中添加事件,

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

没有错误并且工作正常。

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

4

2 回答 2

1

问题不在于生命周期后期添加的事件的组合,以及您试图通过事件处理程序实现的目标。

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

txtResult.Focus();

如果您希望能够将焦点设置到控件,则必须将事件处理程序添加到Initor上Load

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

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

您必须使用RegisterClientScriptBlock发出它。

于 2012-08-29T03:50:18.493 回答
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 没有在其他地方再次设置吗?

于 2012-08-29T03:47:25.967 回答