Fórum Criação de Extender em runtime #6301
01/06/2009
0
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
Curtir tópico
+ 0Posts
01/06/2009
Valter Ferreira
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
02/06/2009
Fabio Mans
protected override void OnInit(EventArgs e)
{
EnsureChildControls();
base.OnInit(e);
}
Gostei + 0
02/06/2009
Valter Ferreira
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
04/06/2009
Luiz Maia
Gostei + 0
04/06/2009
Valter Ferreira
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
05/06/2009
Luiz Maia
Gostei + 0
07/06/2009
Luiz Maia
Gostei + 0
08/06/2009
Valter Ferreira
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
08/06/2009
Luiz Maia
Gostei + 0
08/06/2009
Valter Ferreira
Gostei + 0
09/06/2009
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
Clique aqui para fazer login e interagir na Comunidade :)