Button con disabilitazione dello stesso dopo il click
di Andrea Zani, in .NET, domenica 5 luglio 2009 ore 15.00
Innanzitutto, si tratta di un tradizionale Button che al click si disabilita, ma in grado anche di controllare la presenza di Validator nella pagina. Avevo trovato il codice di questo webcontrol un po' di tempo fa. L'avevo utilizzato in un mio progetto personale e non mi aveva mai dato problemi fino a oggi, quando mi sono scontrato sulla sua inefficacia in caso di ValidationGroup. Armato di pazienza ecco che mi sono preso in mano il codice ed ho eseguito le modifiche del caso. Forse può essere utile ad altri, ed ecco il codice completo:
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Drawing;
namespace AZWebControls
{
[ToolboxBitmap(typeof(System.Web.UI.WebControls.Button)), DefaultEvent("Click"), DefaultProperty("Text")]
public class ClickOnceButton : System.Web.UI.WebControls.WebControl, IPostBackEventHandler, IButtonControl
{
public event EventHandler Click;
public event System.Web.UI.WebControls.CommandEventHandler Command;
private string OnceClickBtnName = "__onceClickBtn";
[Browsable(true), Category("Behavior")]
public bool DisableAfterClick
{
get
{
object o = base.ViewState["DisableAfterClick"];
return ((o == null) ? false : (bool)o);
}
set { base.ViewState["DisableAfterClick"] = value; }
}
[Browsable(true), Category("Behavior")]
public string CommandName
{
get
{
object o = base.ViewState["CommandName"];
return ((o == null) ? string.Empty : (string)o);
}
set { base.ViewState["CommandName"] = value; }
}
[Browsable(true), Category("Behavior")]
public string CommandArgument
{
get
{
object o = base.ViewState["CommandArgument"];
return ((o == null) ? string.Empty : (string)o);
}
set { base.ViewState["CommandArgument"] = value; }
}
[Browsable(true), Category("Appearance")]
public string DisabledText
{
get
{
object o = base.ViewState["DisabledText"];
return ((o == null) ? string.Empty : (string)o);
}
set { base.ViewState["DisabledText"] = value; }
}
[Browsable(true), Category("Appearance")]
public string Text
{
get
{
object o = base.ViewState["Text"];
return ((o == null) ? "Button" : (string)o);
}
set { base.ViewState["Text"] = value; }
}
[Browsable(true), Category("Behavior")]
public bool CausesValidation
{
get
{
object o = base.ViewState["CausesValidation"];
return ((o == null) ? true : (bool)o);
}
set { base.ViewState["CausesValidation"] = value; }
}
public ClickOnceButton()
: base(HtmlTextWriterTag.Input)
{
}
[Browsable(false)]
internal string GetClientValidateEvent
{
get {
if (string.IsNullOrEmpty(this.ValidationGroup))
return "if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); ";
else
return "if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate('"+this.ValidationGroup+"'); ";
}
}
[Browsable(false)]
internal string GetClickOnceClientValidateEvent
{
get {
if (string.IsNullOrEmpty(this.ValidationGroup))
return "if (typeof(Page_ClientValidate) == 'function') { if(Page_ClientValidate()) { " + GetOnceClickJavascript + " }} else { " + GetOnceClickJavascript + " }";
else
return "if (typeof(Page_ClientValidate) == 'function') { if(Page_ClientValidate('"+this.ValidationGroup+"')) { " + GetOnceClickJavascript + " }} else { " + GetOnceClickJavascript + " }";
}
}
[Browsable(false)]
internal string GetOnceClickJavascript
{
get { return "document.getElementsByName('" + this.OnceClickBtnName + "').item(0).setAttribute('name'," + "this.getAttribute('name')); this.disabled = true; " + (DisabledText == string.Empty ? string.Empty : "this.value = '" + DisabledText + "';") + "this.form.submit();"; }
}
protected override void RenderContents(HtmlTextWriter writer)
{
}
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
string strOnClick;
if ((base.Page == null))
{
base.Page.VerifyRenderingInServerForm(this);
}
writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit");
writer.AddAttribute(HtmlTextWriterAttribute.Name, base.UniqueID);
writer.AddAttribute(HtmlTextWriterAttribute.Value, this.Text);
if ((base.Page != null) & this.CausesValidation & base.Page.Validators.Count > 0)
{
if (this.DisableAfterClick)
{
strOnClick = this.GetClickOnceClientValidateEvent;
}
else
{
strOnClick = this.GetClientValidateEvent;
}
if (base.Attributes.Count > 0 & (base.Attributes["onclick"] != null))
{
strOnClick = string.Concat(base.Attributes["onclick"], strOnClick);
base.Attributes.Remove("onclick");
}
writer.AddAttribute("language", "javascript");
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, strOnClick);
}
else if (DisableAfterClick == true)
{
strOnClick = GetOnceClickJavascript;
if (base.Attributes.Count > 0 & (base.Attributes["onclick"] != null))
{
strOnClick = string.Concat(base.Attributes["onclick"], strOnClick);
base.Attributes.Remove("onclick");
}
writer.AddAttribute("language", "javascript");
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, strOnClick);
}
base.AddAttributesToRender(writer);
}
protected override void OnInit(EventArgs e)
{
if (DisableAfterClick && !IsHiddenFieldRegistered())
{
base.Page.ClientScript.RegisterHiddenField(this.OnceClickBtnName, "");
//base.Page.RegisterHiddenField(this.OnceClickBtnName, "");
}
base.OnInit(e);
}
private bool IsHiddenFieldRegistered()
{
foreach (Control ctl in base.Page.Controls)
{
if (ctl is HtmlInputHidden)
{
if (ctl.ID == this.OnceClickBtnName)
{
return true;
}
}
}
return false;
}
protected virtual void OnClick(EventArgs e)
{
if (Click != null)
{
Click(this, e);
}
}
protected virtual void OnCommand(System.Web.UI.WebControls.CommandEventArgs e)
{
if (Command != null)
{
Command(this, e);
}
}
void System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
{
if (this.CausesValidation)
{
base.Page.Validate();
}
this.OnClick(new EventArgs());
this.OnCommand(new System.Web.UI.WebControls.CommandEventArgs(this.CommandName, this.CommandArgument));
}
#region IButtonControl Members
[UrlProperty("*.aspx"), Editor("System.Web.UI.Design.UrlEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(System.Drawing.Design.UITypeEditor)), Themeable(false), DefaultValue("")]
public virtual string PostBackUrl
{
get
{
string str = (string)this.ViewState["PostBackUrl"];
if (str != null)
{
return str;
}
return string.Empty;
}
set
{
this.ViewState["PostBackUrl"] = value;
}
}
[DefaultValue(""), Themeable(false)]
public virtual string ValidationGroup
{
get
{
string str = (string)this.ViewState["ValidationGroup"];
if (str != null)
{
return str;
}
return string.Empty;
}
set
{
this.ViewState["ValidationGroup"] = value;
}
}
#endregion
}
}
Nella stessa categoria
I più letti del mese















Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.