Fórum Criação de Extender em runtime #6301

01/06/2009

0

Olá!

Tenho um componente TextBox na minha página:

            <asp:TextBox ID="TextBox1" runat="server" CausesValidation="True"></asp:TextBox>

Para colocar uma máscara neste componente posso utilizar o MaskedEditExtender do AJAX Control Toolkit.
Ficando:

            <asp:TextBox ID="TextBox1" runat="server" CausesValidation="True"></asp:TextBox>
            <cc1:MaskedEditExtender ID="TextBox1_MaskedEditExtender" runat="server"
                Enabled="True" TargetControlID="TextBox1" Mask="AAA-9999">
            </cc1:MaskedEditExtender>

Isto funciona perfeitamente!
Meu problema é o seguinte... Tenho vários campos e gostaria de alguma coisa mais dinâmica, como por exemplo criar uma função que através da especificação do ID do TextBox e um segundo parâmetro dizendo o tipo, criaria um ou mais extenders para este componente.

Desta forma, fiz a função:

    private void modelaComponente(object componente, string tipo)
    {
        TextBox caixa = componente as TextBox;

        if (tipo.Equals("PLACA"))
            Page.Controls.Add(
                new AjaxControlToolkit.MaskedEditExtender()
                {
                    BehaviorID = caixa.ID+"_extender",
                    TargetControlID = caixa.ID,
                    Mask = "AAA-000",
                    Enabled = true
                }
            );
    }

E a chamo para cada componente TextBox que quiser, via Pageload.
O problema é que no OnLoad do extender em questão não é encontrado o componente que passei por parâmetro.
Qual o problema desta função?
Valter Ferreira

Valter Ferreira

Responder

Posts

01/06/2009

Valter Ferreira

Consegui fazer funcionar... Era só colocar no PreRender da Page.
O problema agora é fazer um componente com isto...
O componente não está aparecendo no local que eu deixei a tag no source... sempre fica ao final da página!
O código é:






using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using AjaxControlToolkit;

namespace Controles.sedepTextBox
{
    public partial class sedepTextBox : TextBox
    {
        public sedepTextBox()
        {
            InitializeComponent();
        }

        public sedepTextBox(IContainer container)
        {
            container.Add(this);
            InitializeComponent();
        }

        protected override void OnLoad(System.EventArgs e)
        {
            this.Page.PreRender += delegate
            {
                this.Page.Form.Controls.Add(this);
                this.Page.Form.Controls.Add(
                    new AjaxControlToolkit.MaskedEditExtender()
                    {
                        TargetControlID = this.ID,
                        Mask = "AAA-999",
                        Enabled = true
                    }
                 );

            };
        }
    }
}
Responder

Gostei + 0

02/06/2009

Fabio Mans

Tente sobrescrever o OnInit

 protected override void OnInit(EventArgs e)
        {
            EnsureChildControls();
            base.OnInit(e);
        }
Responder

Gostei + 0

02/06/2009

Valter Ferreira

Tentei e não deu certo... Ou eu não entendi direito o que fazer.
Mas pelo que eu ví, o problema é o seguinte:
-Só posso adicionar o extender depois que o meu componente já estiver renderizado.
Será isso? Porque ele dá o erro de não encontrar o componente pelo ID, dando referência nula.
O problema do componente aparecer no final da página, e funcionar, é porque eu forço a criação dele antes.
Qual seria uma possível solução?


Obrigado.
Responder

Gostei + 0

04/06/2009

Luiz Maia

Ola Valter,   Vc quer fazer um componente para incluir a mascara nos controles de uma pagina ASPx? É isto?   Aguardo Att   Luiz Maia
Responder

Gostei + 0

04/06/2009

Valter Ferreira

Não exatamente...
Quero instanciar qualquer tipo de extender, o de máscara é um exemplo.
Minha idéia é ter um componente com todos os extenders que sempre utilizo e definir as propriedades via programação do componente.
Meu problema é criar meu componente e criar o extender ao mesmo tempo, pois o extender precisa de encontrar o componente - e isso é o problema porque o componente só é encontrado após criar o extender. Se eu forçar sua criação, do jeito que fiz em mensagem anterior, ele fica no final da página.
Responder

Gostei + 0

05/06/2009

Luiz Maia

Ola Valter,   Tem como me mandar seu codigo todo, vou ter que simular para testar. Pode colocar no Disco Virtual ou, se for pequeno, apenas cole aqui mesmo.   Abraços Att Luiz Maia
Responder

Gostei + 0

07/06/2009

Luiz Maia

Ola Valter, ainda estou aguardando ok? Abraços Luiz Maia
Responder

Gostei + 0

08/06/2009

Valter Ferreira

O código foi enviado em mensagem anterior...
Se não estiver visualizando, segue novamente:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using AjaxControlToolkit;

namespace Controles.sedepTextBox
{
    public partial class sedepTextBox : TextBox
    {
        public sedepTextBox()
        {
            InitializeComponent();
        }

        public sedepTextBox(IContainer container)
        {
            container.Add(this);
            InitializeComponent();
        }

        protected override void OnLoad(System.EventArgs e)
        {
            this.Page.PreRender += delegate
            {
                this.Page.Form.Controls.Add(this);
                this.Page.Form.Controls.Add(
                    new AjaxControlToolkit.MaskedEditExtender()
                    {
                        TargetControlID = this.ID,
                        Mask = "AAA-999",
                        Enabled = true
                    }
                 );

            };
        }
    }
}
Responder

Gostei + 0

08/06/2009

Luiz Maia

Ola Valter,   Tente fazer um componente: AjaxControlExtender, novo projeto.   Depois altere os codigos como abaixo:   [ TargetControlType(typeof(TextBox)) ] public class ExtenderControl1 : ExtenderControl { public ExtenderControl1() { this.Page.Form.Controls.Add( new AjaxControlToolkit.MaskedEditExtender() { TargetControlID = this.ID, Mask = "AAA-999", Enabled = true } ); }   Assim deve funcionar. Aguardo um retorno.   Caso tenha alguma duvida, consulte o site do proprio Ajax: http://ajaxcontroltoolkit.com/Walkthrough/CreatingNewExtender.aspx   Abraços Att Luiz Maia
Responder

Gostei + 0

08/06/2009

Valter Ferreira

A minha intenção é não precisar setar um extender em um componente, e sim, usar um componente com vários extenders.
Responder

Gostei + 0

09/06/2009

Luiz Maia

Valter,   Encontrei outro exemplo, desta vez em vb.net. Apenas transcreva o codigo para C#, se é seu caso.   Public Partial Class ControlTesting
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Load
Controls.Add(New SpecialControl)
End Sub

End Class
Public Class SpecialControl
Inherits WebControl
Implements INamingContainer

Private Sub SpecialControl_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Load
Dim ControlAsTextBox As New TextBox
ControlAsTextBox.ID = "TextBox"
ControlAsTextBox.CssClass = "textbox"
ControlAsTextBox.AutoCompleteType = AutoCompleteType.Disabled
Dim Mask As String = "LL-#####"
If Mask <> String.Empty Then
Dim MyExtender As New AjaxControlToolkit.MaskedEditExtender
MyExtender.Mask = Mask
MyExtender.TargetControlID = ControlAsTextBox.ID
MyExtender.MessageValidatorTip = True
MyExtender.OnFocusCssClass = "MaskedEditFocus"
MyExtender.OnInvalidCssClass = "MaskedEditError"
MyExtender.MaskType = AjaxControlToolkit.MaskedEditType.None
MyExtender.InputDirection = AjaxControlToolkit.MaskedEditInputDirection.LeftToRight
MyExtender.AcceptNegative = AjaxControlToolkit.MaskedEditShowSymbol.None
MyExtender.DisplayMoney = AjaxControlToolkit.MaskedEditShowSymbol.None
MyExtender.ErrorTooltipEnabled = True
Controls.Add(MyExtender)
End If
End Class     Att Luiz Maia  
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar