我创建了一个自定义的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>
没有错误,工作正常。
有人可以帮我动态添加事件到自定义控件吗? 感谢。
答案 0 :(得分:1)
问题不在于生命周期后期添加事件的组合,以及您尝试使用事件处理程序实现的内容。
正如错误明确指出的那样,问题在于这一行:
txtResult.Focus();
如果您希望能够将焦点设置为控件,则必须在Init
或Load
上添加事件处理程序。
您可以使用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没有在其他地方再次设置吗?