Criação de Extender em runtime
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?
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
Curtidas 0
Respostas
Valter Ferreira
01/06/2009
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
}
);
};
}
}
}
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
}
);
};
}
}
}
GOSTEI 0
Fabio Mans
01/06/2009
Tente sobrescrever o OnInit
protected override void OnInit(EventArgs e)
{
EnsureChildControls();
base.OnInit(e);
}
protected override void OnInit(EventArgs e)
{
EnsureChildControls();
base.OnInit(e);
}
GOSTEI 0
Valter Ferreira
01/06/2009
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.
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.
GOSTEI 0
Luiz Maia
01/06/2009
Ola Valter,
Vc quer fazer um componente para incluir a mascara nos controles de uma pagina ASPx? É isto?
Aguardo
Att
Luiz Maia
GOSTEI 0
Valter Ferreira
01/06/2009
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.
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.
GOSTEI 0
Luiz Maia
01/06/2009
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
GOSTEI 0
Luiz Maia
01/06/2009
Ola Valter, ainda estou aguardando ok?
Abraços
Luiz Maia
GOSTEI 0
Valter Ferreira
01/06/2009
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
}
);
};
}
}
}
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
}
);
};
}
}
}
GOSTEI 0
Luiz Maia
01/06/2009
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
GOSTEI 0
Valter Ferreira
01/06/2009
A minha intenção é não precisar setar um extender em um componente, e sim, usar um componente com vários extenders.
GOSTEI 0
Luiz Maia
01/06/2009
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
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
GOSTEI 0