我已经创建了一个自定义的web控件来充当一个带有图像的按钮。我希望能够将其设置为ASP.NET面板控件的DefaultButton参数的目标。我已经实现了IButton接口,使用该控件加载页面时不会产生任何错误。但是,当我在面板内文本框中按enter时,不会引发控件的Click事件。当我用一个标准的ASP.NET按钮替换我的控件时,一切工作正常。
我有一个测试页面,其中的面板包含一个文本框、一个自定义按钮的实例和一个标准的asp.net按钮。这些按钮连接到一个事件处理程序,该事件处理程序将文本框更改为调用者的ID。
当面板的DefaultButton设置为ASP.NET按钮时,在下一个框中按enter即可正常工作-页面将回发,并且文本框中将填充标准按钮的名称。当面板的DefaultButton设置为my button时,在textbox中按enter将导致页面回发,但不会激发Click事件。手动单击该按钮可以正常工作。
有人知道我必须向我的自定义控件添加什么才能使它处理来自Panel控件的事件吗?我希望在Button的源代码中使用Reflector,但无法确定是什么导致了这种行为。
我已经在下面发布了控件的源代码,以及测试页面的相关源代码。
控制来源:
public class NewButton : WebControl, IPostBackEventHandler, IButtonControl
{
public NewButton() : base(HtmlTextWriterTag.A) { }
public event EventHandler Click;
public event CommandEventHandler Command;
public string Text
{
get { return ViewState["Text"] as string; }
set { ViewState["Text"] = value; }
}
public string ImageUrl
{
get { return ViewState["ImageUrl"] as string; }
set { ViewState["ImageUrl"] = value; }
}
protected virtual void OnClick(EventArgs e)
{
if (Click != null)
Click(this, e);
}
protected virtual void OnCommand(CommandEventArgs e)
{
if (Command != null)
Command(this, e);
}
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Class, "Button");
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetPostBackEventReference(this, "Click"));
}
protected override void RenderContents(HtmlTextWriter writer)
{
// base.RenderContents(writer);
writer.WriteFullBeginTag("span");
writer.WriteFullBeginTag("span");
if (!String.IsNullOrEmpty(ImageUrl))
{
writer.WriteBeginTag("img");
writer.WriteAttribute("src", Page.ResolveClientUrl(ImageUrl));
writer.Write(HtmlTextWriter.SelfClosingTagEnd);
writer.Write(" ");
}
writer.WriteEncodedText(Text);
writer.WriteEndTag("span");
writer.WriteEndTag("span");
}
public void RaisePostBackEvent(string eventArgument)
{
if (this.CausesValidation)
{
Page.Validate(this.ValidationGroup);
}
OnClick(EventArgs.Empty);
OnCommand(new CommandEventArgs(this.CommandName, this.CommandArgument));
}
public bool CausesValidation
{
get { return ViewState["CausesValidation"] as bool? ?? true; }
set { ViewState["CausesValidation"] = value; }
}
public string CommandArgument
{
get { return ViewState["CommandArgument"] as string; }
set { ViewState["CommandArgument"] = value; }
}
public string CommandName
{
get { return ViewState["CommandName"] as string; }
set { ViewState["CommandName"] = value; }
}
public string PostBackUrl
{
get { return ViewState["PostBackUrl"] as string; }
set { ViewState["PostBackUrl"] = value; }
}
public string ValidationGroup
{
get { return ViewState["ValidationGroup"] as string; }
set { ViewState["ValidationGroup"] = value; }
}
}调用它的代码:
<asp:Panel ID="Panel1" runat="server" CssClass="StandardForm" DefaultButton="NewButton1">
<asp:TextBox runat="server" ID="text1" Columns="40" />
<MyControls:NewButton ID="NewButton1" runat="server" Text="Test" OnClick="OnClick" />
<asp:Button runat="server" ID="OldButton1" OnClick="OnClick" Text="Test" />
</asp:Panel>代码隐藏:
protected void OnClick(object sender, EventArgs args)
{
text1.Text = "Click event received from " + ((WebControl) sender).ID;
}该控件的呈现方式如下:
<div id="ctl00_MainContent_Panel1" class="StandardForm" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'ctl00_MainContent_NewButton1')">
<input name="ctl00$MainContent$text1" type="text" size="40" id="ctl00_MainContent_text1" />
<a id="ctl00_MainContent_NewButton1" class="Button" onclick="__doPostBack('ctl00$MainContent$NewButton1','')"><span><span>Test</span></span></a>
<input type="button" name="ctl00$MainContent$OldButton1" value="Test" onclick="javascript:__doPostBack('ctl00$MainContent$OldButton1','')" id="ctl00_MainContent_OldButton1" />
</div>发布于 2010-01-26 01:31:17
WebForm_FireDefaultButton函数的工作方式是显式地在相关元素上查找click()事件。注意,我指的是调用element.click()的能力,而不是OnClick属性。对于某些元素,浏览器会自动将其链接起来,但不会像控件那样呈现链接。如果使用LinkButton,您将注意到相同的行为。有几种不同的方法可以解决这个问题。你可以重写这篇文章中的WebForm_FireDefaultButton javascript函数:
Link Button on the page and set it as default button, work fine in IE but not in Mozila
或者你可以在你的控件中添加一些代码来正确地连接客户端的点击函数,也许像this...though这样的东西是我想不到的:
protected override void OnPreRender(EventArgs e)
{
string clickString = string.Format("document.getElementById('{0}').click = function() {{ {1} }};", this.ClientID, Page.ClientScript.GetPostBackEventReference(this, "Click"));
Page.ClientScript.RegisterStartupScript(this.GetType(), "click_hookup_" + this.ClientID, clickString, true);
}发布于 2010-01-26 00:40:39
查看客户端标记(在浏览器中查看源代码);此功能应在源代码中呈现类似以下内容:
javascript:return WebForm_FireDefaultButton(event, 'ct100$bodyplaceholder$newbutton1')";在您的页面中,如果设置正确...如果第二个参数不能正确匹配你的按钮,它就不会正确地触发。这可能有以下几个原因:
HTH。
https://stackoverflow.com/questions/2133788
复制相似问题