none
Web Custom Control RRS feed

  • Pergunta

  • o problema é o seguinte:
    estou criando um web custom control que é uma text box q valide quando o campo é requerido e o tipo de dado q foi inseriodo.

    então estou crinado un controle que herda de CompositeControl e tem um TextBox, um RequiredFieldValidator e um CompareValidator para criar um controle único onde eu configure esse coisas de uma vz soh.

    o problema:
    não consigo fazer o CompareValidator validar o valor de outro controle por ele ser um controle dentro de outro controle eu naum consigo passar um controle que esteja acima e fora desse controle como parâmetro pq ele sempre diz q naum pode encontrar o controle.

    Espero q alguem possa me ajudar a resolver isso e estou postando aki o código do controle pq acho q isso pode ser útil p/ outros desenvolvedores.

    Grato,
    Antonio Luis Milesi Bastos

    ########################################

    Imports System

    Imports System.ComponentModel

    Imports System.Drawing

    Imports System.Security.Permissions

    Imports System.Web

    Imports System.Web.UI

    Imports System.Web.UI.WebControls

    <AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal), _

    AspNetHostingPermission(SecurityAction.InheritanceDemand, Level:=AspNetHostingPermissionLevel.Minimal), _

    DefaultProperty("Text"), _

    ToolboxData("<{0}:TextBoxValidator runat='server' />")> _

    Public Class TextBoxValidator

    Inherits CompositeControl

    Dim txt As TextBox

    Dim req As RequiredFieldValidator

    Dim comp As CompareValidator

    <Bindable(True), Category("WebUserControl"), DefaultValue(""), Description("Valor do TextBox")> _

    Public Property Text() As String

    Get

    EnsureChildControls()

    Return txt.Text

    End Get

    Set(ByVal value As String)

    EnsureChildControls()

    txt.Text = value

    End Set

    End Property

    <Bindable(True), _

    Category("WebUserControl"), _

    DefaultValue(""), _

    Description("ValidationGroup do controle.")> _

    Public Property ValidationGroup() As String

    Get

    EnsureChildControls()

    Return txt.ValidationGroup

    End Get

    Set(ByVal value As String)

    EnsureChildControls()

    txt.ValidationGroup = value

    req.ValidationGroup = value

    comp.ValidationGroup = value

    End Set

    End Property

    <Bindable(True), _

    Category("WebUserControl"), _

    DefaultValue(""), _

    Description("Comparar com o controle.")> _

    Public Property CompareToControl() As String

    Get

    EnsureChildControls()

    Return comp.ControlToCompare

    End Get

    Set(ByVal value As String)

    EnsureChildControls()

    comp.ControlToCompare = Parent.FindControl(value).UniqueID

    End Set

    End Property

    <Bindable(True), _

    Category("WebUserControl"), _

    DefaultValue(""), _

    Description("Comparar com o valor.")> _

    Public Property CompareToValue() As String

    Get

    EnsureChildControls()

    Return comp.ValueToCompare

    End Get

    Set(ByVal value As String)

    EnsureChildControls()

    comp.ValueToCompare = value

    End Set

    End Property

    <Bindable(True), _

    Category("WebUserControl"), _

    DefaultValue(""), _

    Description("Mensagem de erro quando não for um valor válido.")> _

    Public Property CompareToMsgErro() As String

    Get

    EnsureChildControls()

    Return comp.ErrorMessage

    End Get

    Set(ByVal value As String)

    EnsureChildControls()

    comp.ErrorMessage = value

    comp.ToolTip = value

    End Set

    End Property

    <Bindable(True), _

    Category("WebUserControl"), _

    DefaultValue(""), _

    Description("Compara TextBox com.")> _

    Public Property CompareTo() As ValidationCompareOperator

    Get

    EnsureChildControls()

    Return comp.Operator

    End Get

    Set(ByVal value As ValidationCompareOperator)

    EnsureChildControls()

    comp.Operator = value

    End Set

    End Property

    <Bindable(True), _

    Category("WebUserControl"), _

    DefaultValue(""), _

    Description("Tipo do TextBox.")> _

    Public Property CompareToType() As ValidationDataType

    Get

    EnsureChildControls()

    Return comp.Type

    End Get

    Set(ByVal value As ValidationDataType)

    EnsureChildControls()

    comp.Type = value

    End Set

    End Property

    <Bindable(True), _

    Category("WebUserControl"), _

    DefaultValue(""), _

    Description("Mensagem de erro quando o campo é requerido.")> _

    Public Property RequeridoMsgErro() As String

    Get

    EnsureChildControls()

    Return req.ErrorMessage

    End Get

    Set(ByVal value As String)

    EnsureChildControls()

    req.ErrorMessage = value

    req.ToolTip = value

    End Set

    End Property

    <Bindable(True), _

    Category("WebUserControl"), _

    DefaultValue(""), _

    Description("Se o campo é obrigatório.")> _

    Public Property Requerido() As Boolean

    Get

    EnsureChildControls()

    Return req.Enabled

    End Get

    Set(ByVal value As Boolean)

    EnsureChildControls()

    req.Enabled = value

    End Set

    End Property

    Public ReadOnly Property TextBoxID() As String

    Get

    Return txt.NamingContainer.ID & ":" & txt.ID

    End Get

    End Property

     

    Protected Overrides Sub CreateChildControls()

    Controls.Clear()

    txt = New TextBox()

    txt.ID = "TextBoxValidator"

    req = New RequiredFieldValidator()

    req.ID = "RequiredField"

    req.ControlToValidate = txt.ID

    req.EnableClientScript = True

    req.Text = "*"

    req.ErrorMessage = "Campo requerido!"

    req.Display = ValidatorDisplay.Dynamic

    req.SetFocusOnError = True

     

    comp = New CompareValidator

    comp.ID = "CompareTo"

    comp.Operator = ValidationCompareOperator.DataTypeCheck

    comp.ControlToValidate = txt.ID

    comp.EnableClientScript = True

    comp.Text = "*"

    comp.ErrorMessage = "Valor inválido!"

    comp.Display = ValidatorDisplay.Dynamic

    comp.SetFocusOnError = True

    Me.Controls.Add(txt)

    Me.Controls.Add(req)

    Me.Controls.Add(comp)

    End Sub

    Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)

    txt.RenderControl(writer)

    writer.WriteLine()

    req.RenderControl(writer)

    comp.RenderControl(writer)

    End Sub

    Protected Overrides Sub RecreateChildControls()

    EnsureChildControls()

    End Sub

    End Class

    quarta-feira, 5 de julho de 2006 18:07

Todas as Respostas

  • Milesi,

    Pelo que entendi você está herdando o controle TextBox e adicionando a ele para renderizar junto os controles de validação não é isso?

    Então, se não me engano, você já criou uma propriedade para inserir o valor a comparar:

    Só que a comparação do controle é inserida em outra propriedade no CompareValidator:

    ControlToCompare

    Então você poderia criar outra propriedade na qual você passa o ID do outro controle na qual deseja comparar.

    Tipo:

    comp.ControlToCompare = suaPropriedadeQueRecebeIdDoControle

    Ou então usar a mesma propriedade na qual criou, mas definir um case ou alguma coisa do tipo.

     

     

    Espero ter ajudado!

    quarta-feira, 5 de julho de 2006 18:27
  • essa propriedade jah esta lah... e ja pode ser setada.
    o problema é como seta-lá?
    eu passo o id do controle q eu quero validar mas ele naum é encontrado por estar fora do web custom control.

    Algumas outra sugestão?

    quarta-feira, 5 de julho de 2006 18:39
  • Milese,

    Você pode buscar por outros controles utilizando-se da propriedade Page que instancia a pagina corrente que esta seu controle.

    MyBase.Page....

     

    quarta-feira, 5 de julho de 2006 20:37
    Moderador
  • sim correto!

    de dentro do controle manualmente eu consigo acessar um controle q esta no controle pai usando parent.FindControl("controle")... ok
    Mas quando passo esse controle pro ControlToCompare = Parent.FindControl(value).ID ele diz q naum pode encontrar o controle.
    o ControlToCompare recebe o ID de um controle e busca por ele dentro do msm controle q ele esta ou nos controles dentro dele. o problema e fazer ele encontrar um controle q esta fora dele, num controle pai.

    Algumas outra sugestão?

    quarta-feira, 5 de julho de 2006 22:09
  • Tenta o que o Cerqueira falou:

    MyBase.Page.FindControl.....

    Ou então tenta adicionar mais um parente, tipo:

    Outra coisa, se não me engano, pra procurar o controle, você passa o valor dessa forma:

    ........FindControl("idControle")

    E não ........FindControle("idControle").ID como está tentando.

     

     

    Espero ter ajudado!

    quinta-feira, 6 de julho de 2006 01:04
  • pôs é...
    encontrar o controle naum eh o problema!

    mas o ControlToCompare tem q receber uma string com o id do controle q o próprio método deve fazer uma busca pelo controle, e ai esta o problema, eu passo o id do controle e ele naum encontra pq o controle esta um nível a cima no controle pai.

    Alguma outra sugestão?

    quinta-feira, 6 de julho de 2006 01:36
  • Herda a classe do CompareValidator e faz suas modificações.

    Pesquise mais sobre isso no www.msdn.com/library

     

    quinta-feira, 6 de julho de 2006 12:05