none
ASP.net Custom Control RRS feed

  • Pergunta

  • Olá, criei um Controle derivado de um DropDownList conforme o código descrito. Esse controle funciona bem, e tem algumas propriedades (atributos) que coloquei para que eu pudesse utilizar, como Label, Checked etc.

    Assim que a página carrega, se eu colocar valor no atributo manualmente no código Markup, ele carrega o valor. Se eu definir o valor usando a página (mesmo, no navegador), o programa recebe o valor informado, mas ao retornar a página, ou ao definir o valor via programação, tudo se perde.

    Outro ponto é que em algumas páginas, o controle está dentro de um MultiView, e quando a View selecionada muda, também perco tudo.

    namespace Core.Web
    {
        public static class Binder
        {
            internal static void OpenField(System.Web.UI.HtmlTextWriter writer, string Label) { writer.Write("<div class=\"field\"><b>" + Label + "</b>"); }
    
            internal static void AuxField(System.Web.UI.HtmlTextWriter writer, string ClientID, string Type, string Width = "")
            {
                writer.Write("<div class=\"picker\"><input type=\"" + Type + "\" id=\"" + ClientID + "_ck\" name=\"" + ClientID + "_ck\" ");
                if (Width != "") { writer.Write("style=\"width:" + Width + ";\" "); }
            }
    
            internal static void OpenField(System.Web.UI.HtmlTextWriter writer, string Label, string ClientID, string TextBox, Core.Web.Controls.FieldThemes Theme, string Width)
            {
                Core.Web.Binder.OpenField(writer, Label);
                Core.Web.Binder.AuxField(writer, ClientID, "text", Width:Width);
                writer.Write("value=\"" + TextBox + "\" ");
                if (Theme != Core.Web.Controls.FieldThemes.None)
                {
                    writer.Write("class=\"" + System.Enum.GetName(typeof(Core.Web.Controls.FieldThemes), Theme).ToLower() + "\" ");
                    switch (Theme)
                    {
                        case Core.Web.Controls.FieldThemes.Calendar: writer.Write("placeholder=\"dd/mm/aaaa\" maxlength=\"10\" "); break;
                        case Core.Web.Controls.FieldThemes.Time: writer.Write("placeholder=\"hh:mm:ss\" maxlength=\"8\" "); break;
                    }
                    
                }
                writer.Write("/>");
            }
        }
    }
    
    namespace Core.Web.Controls
    {
        public class DropTextField : System.Web.UI.WebControls.DropDownList
        {
            internal const double WidthField = 256.0;
    
            public string Label
            {
                get { return this.Attributes["label"]; }
                set { this.Attributes["label"] = value; }
            }
    
            public virtual string Value
            {
                get { return this.SelectedValue; }
                set { Core.Web.Binder.ItemsByValue(this, value); }
            }
    
            public void DoSelect(object Arg) { Core.Web.Binder.ItemsByValue(this, Arg, true); }
            protected void DropDownListRender(System.Web.UI.HtmlTextWriter writer) { base.Render(writer); }
    
            public string TextField
            {
                get { return this.Attributes["textfield"]; }
                set { this.Attributes["textfield"] = value; }
            }
    
            public Core.Web.Controls.FieldThemes Theme
            {
                get { if (this.CssClass == "") { return Core.Web.Controls.FieldThemes.None; } else { return (Core.Web.Controls.FieldThemes)System.Enum.Parse(typeof(Core.Web.Controls.FieldThemes), this.CssClass, true); } }
                set { this.CssClass = System.Enum.GetName(typeof(Core.Web.Controls.FieldThemes), value).ToLower(); }
            }
    
            public void Clear()
            {
                this.ClearSelection();
                this.TextField = "";
            }
    
            protected override void OnLoad(System.EventArgs e)
            {
                base.OnInit(e);
                this.TextField = this.Page.Request.Form[this.ClientID + "_ck"];
            }
    
            protected override void Render(System.Web.UI.HtmlTextWriter writer)
            {
                if (this.Width.Value == 0.0) { this.Width = System.Web.UI.WebControls.Unit.Pixel(96); }
                Core.Web.Binder.OpenField(writer, this.Label, this.ClientID, this.TextField, this.Theme, System.Web.UI.WebControls.Unit.Pixel((int)(Core.Web.Controls.DropTextField.WidthField - this.Width.Value)).ToString());
                this.DropDownListRender(writer);
                writer.Write("</div></div>");
            }
        }
    }

    O "DropDownList" referente (Items e Seleção) retornam sem problemas, mas o valor de "TextField" se perde.

    Alguma ideia?

    segunda-feira, 29 de setembro de 2014 12:09

Respostas

  • Resolvido! Alterei o uso para o ViewState, e o evento de alteração dos dados via Request.Form no OnLoad e não no OnInit (eu tinha trocado). Só perdi a possibilidade de colocar como vazio (""). Eu não sei como testar um Request.Form se o elemento existe ou se ele está vazio.

    Segue:

    namespace Core.Web.Controls
    {
        public class DropTextField : System.Web.UI.WebControls.DropDownList
        {
            internal const double WidthField = 256.0;
    
            public string Label
            {
                get { return this.Attributes["label"]; }
                set { this.Attributes["label"] = value; }
            }
    
            public virtual string Value
            {
                get { return this.SelectedValue; }
                set { Core.Web.Binder.ItemsByValue(this, value); }
            }
    
            public void DoSelect(object Arg) { Core.Web.Binder.ItemsByValue(this, Arg, true); }
            protected void DropDownListRender(System.Web.UI.HtmlTextWriter writer) { base.Render(writer); }
    
            protected override void Render(System.Web.UI.HtmlTextWriter writer)
            {
                Core.Web.Binder.OpenField(writer, this.Label);
                this.DropDownListRender(writer);
                writer.Write("</div>");
            }
    
            public string TextField
            {
                get
                {
                    string value = (string)this.ViewState["textfield"];
                    return ((value == null) ? "" : value);
                }
                set { this.ViewState["textfield"] = value; }
            }
            
            public Core.Web.Controls.FieldThemes Theme
            {
                get { if (this.CssClass == "") { return Core.Web.Controls.FieldThemes.None; } else { return (Core.Web.Controls.FieldThemes)System.Enum.Parse(typeof(Core.Web.Controls.FieldThemes), this.CssClass, true); } }
                set { this.CssClass = System.Enum.GetName(typeof(Core.Web.Controls.FieldThemes), value).ToLower(); }
            }
    
            public void Clear()
            {
                this.ClearSelection();
                this.TextField = "";
            }
    
            protected override void OnLoad(System.EventArgs e)
            {
                base.OnInit(e);
                string value = this.Page.Request.Form[this.ClientID + "_ck"];
                if (value != null && value != "") { this.TextField = value; }
            }
    
            protected override void Render(System.Web.UI.HtmlTextWriter writer)
            {
                if (this.Width.Value == 0.0) { this.Width = System.Web.UI.WebControls.Unit.Pixel(96); }
                Core.Web.Binder.OpenField(writer, this.Label, this.ClientID, this.TextField, this.Theme, System.Web.UI.WebControls.Unit.Pixel((int)(Core.Web.Controls.DropTextField.WidthField - this.Width.Value)).ToString());
                this.DropDownListRender(writer);
                writer.Write("</div></div>");
            }
        }
    }
    • Marcado como Resposta SammuelMiranda terça-feira, 30 de setembro de 2014 12:33
    terça-feira, 30 de setembro de 2014 12:33

Todas as Respostas

  • Eu imagino que, a partir do momento em que eu defino "this.Attributes["xxx"]", que na próxima chamada do método "protected virtual object SaveViewState()" - herdado do System.Web.UI.WebControls.Control - todos os valores em "Attributes[]" serão salvos.

    Essa suposição está correta?

    segunda-feira, 29 de setembro de 2014 13:31
  • Resolvido! Alterei o uso para o ViewState, e o evento de alteração dos dados via Request.Form no OnLoad e não no OnInit (eu tinha trocado). Só perdi a possibilidade de colocar como vazio (""). Eu não sei como testar um Request.Form se o elemento existe ou se ele está vazio.

    Segue:

    namespace Core.Web.Controls
    {
        public class DropTextField : System.Web.UI.WebControls.DropDownList
        {
            internal const double WidthField = 256.0;
    
            public string Label
            {
                get { return this.Attributes["label"]; }
                set { this.Attributes["label"] = value; }
            }
    
            public virtual string Value
            {
                get { return this.SelectedValue; }
                set { Core.Web.Binder.ItemsByValue(this, value); }
            }
    
            public void DoSelect(object Arg) { Core.Web.Binder.ItemsByValue(this, Arg, true); }
            protected void DropDownListRender(System.Web.UI.HtmlTextWriter writer) { base.Render(writer); }
    
            protected override void Render(System.Web.UI.HtmlTextWriter writer)
            {
                Core.Web.Binder.OpenField(writer, this.Label);
                this.DropDownListRender(writer);
                writer.Write("</div>");
            }
    
            public string TextField
            {
                get
                {
                    string value = (string)this.ViewState["textfield"];
                    return ((value == null) ? "" : value);
                }
                set { this.ViewState["textfield"] = value; }
            }
            
            public Core.Web.Controls.FieldThemes Theme
            {
                get { if (this.CssClass == "") { return Core.Web.Controls.FieldThemes.None; } else { return (Core.Web.Controls.FieldThemes)System.Enum.Parse(typeof(Core.Web.Controls.FieldThemes), this.CssClass, true); } }
                set { this.CssClass = System.Enum.GetName(typeof(Core.Web.Controls.FieldThemes), value).ToLower(); }
            }
    
            public void Clear()
            {
                this.ClearSelection();
                this.TextField = "";
            }
    
            protected override void OnLoad(System.EventArgs e)
            {
                base.OnInit(e);
                string value = this.Page.Request.Form[this.ClientID + "_ck"];
                if (value != null && value != "") { this.TextField = value; }
            }
    
            protected override void Render(System.Web.UI.HtmlTextWriter writer)
            {
                if (this.Width.Value == 0.0) { this.Width = System.Web.UI.WebControls.Unit.Pixel(96); }
                Core.Web.Binder.OpenField(writer, this.Label, this.ClientID, this.TextField, this.Theme, System.Web.UI.WebControls.Unit.Pixel((int)(Core.Web.Controls.DropTextField.WidthField - this.Width.Value)).ToString());
                this.DropDownListRender(writer);
                writer.Write("</div></div>");
            }
        }
    }
    • Marcado como Resposta SammuelMiranda terça-feira, 30 de setembro de 2014 12:33
    terça-feira, 30 de setembro de 2014 12:33