none
Como acessar textbox criado dinamicamente? RRS feed

  • Pergunta

  • Criei uma sub assim:

        Public Sub CriaCampo(ByVal lbltxt As StringByVal lblL As IntegerByVal lblT As Integer, _
                             ByVal txtVal As StringByVal txtL As IntegerByVal txtW As Integer)

            strXAML.Append("<sdk:Label Height='23' HorizontalAlignment='Left' Margin='" & lblL & "," & lblT)
            strXAML.Append(",0,0' Name='Label" & Indlbl)
            strXAML.Append("' VerticalAlignment='Top' Content='" & lbltxt & "' /> ")
            strXAML.Append("<TextBox Height='23' HorizontalAlignment='Left' Margin='" & txtL & "," & lblT)
            strXAML.Append(",0,0' Name='TextBox" & Indlbl)
            strXAML.Append("' VerticalAlignment='Top' Text='" & BuscaTexto(txtVal) & "' /> ")

            Indlbl += 1

        End Sub

    Agora estou tentando acessar o objeto TextBox0 assim:

            Dim text As TextBox = Grid2.FindName("TextBox0")
            MessageBox.Show(text.Name)

    e o text é null, dando erro no messagebox.

    Tem como acessar o obj criado, de algum modo?

    quarta-feira, 10 de novembro de 2010 17:30

Respostas

  • Olá Nelson,
    Você já tentou da seguinte forma, ao invés de usar o FindName você cria um método que varre todos os elementos que estão no grid.  Segue o exemplo.

            private object Find(string name)
        {
          UIElement result = null;
    
          foreach (UIElement element in myGrid.Children)
          {
            if (element.Uid == name)
            {
              result = element;
              break;
            }
          }
    
          return result;      
        }
    
    

     public Window2()
        {
          InitializeComponent();
    
          string xaml = @"<TextBlock xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" <br/>
                    xmlns:x=""http://schemas.microsoft.com/winfx/2006.xaml"" Uid=""txt"" Text=""Anderson"" />";      
    
          this.myGrid.Children.Add((UIElement)XamlReader.Parse(xaml));
    
          this.Find("txt");<br/>
    }
    
    Att.
    Anderson
    • Marcado como Resposta Nelson Gonzaga sexta-feira, 12 de novembro de 2010 11:25
    quinta-feira, 11 de novembro de 2010 10:04
  • Tudo o que você faz no XAML você pode fazer em código, ou você pode criar um estilo no XAML para o seu componente e usar o seguinte código

    XAML:

    <Style TargetType="TextBox" x:Key="TextBoxStyle" >
      <Setter Property="Height" Value="25" />
      <Setter ...
    </Style>

    VB:

    Dim tbx = new TextBox()
    tbx.Style = (Style)FindResource("TextBoxStyle")
    ....
    layoutRoot.Children.Add(tbx)

    Outra solução é usar algo como o Anderson apontou.

    []s

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    • Marcado como Resposta Nelson Gonzaga sexta-feira, 12 de novembro de 2010 11:25
    quinta-feira, 11 de novembro de 2010 10:44

Todas as Respostas

  • Por que você não cria o label assim:

    Dim lbl = new Label()
    lbl.Height = 23
    ....
    layoutRoot.Children.Add(lbl)

    Aí você pode acessar o seu componente sem problemas

    []s

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    quarta-feira, 10 de novembro de 2010 21:04
  • Caro Bruno,

    Eu tinha feito assim, porque essa rotina veio de uma aplicacao antiga em VB6, mas como eu quero implementar algumas features do Blend eu resolvi mudar para XAML e cai nessa ai.

    Tem como fazer algo mesclado, tipo aplicar XAML no obj criado com New, ou descobrir o nome da propriedade no VB que o Blend ta alterando?

    Valeu pela resposta,

    NG

    quinta-feira, 11 de novembro de 2010 09:51
  • Olá Nelson,
    Você já tentou da seguinte forma, ao invés de usar o FindName você cria um método que varre todos os elementos que estão no grid.  Segue o exemplo.

            private object Find(string name)
        {
          UIElement result = null;
    
          foreach (UIElement element in myGrid.Children)
          {
            if (element.Uid == name)
            {
              result = element;
              break;
            }
          }
    
          return result;      
        }
    
    

     public Window2()
        {
          InitializeComponent();
    
          string xaml = @"<TextBlock xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" <br/>
                    xmlns:x=""http://schemas.microsoft.com/winfx/2006.xaml"" Uid=""txt"" Text=""Anderson"" />";      
    
          this.myGrid.Children.Add((UIElement)XamlReader.Parse(xaml));
    
          this.Find("txt");<br/>
    }
    
    Att.
    Anderson
    • Marcado como Resposta Nelson Gonzaga sexta-feira, 12 de novembro de 2010 11:25
    quinta-feira, 11 de novembro de 2010 10:04
  • Tudo o que você faz no XAML você pode fazer em código, ou você pode criar um estilo no XAML para o seu componente e usar o seguinte código

    XAML:

    <Style TargetType="TextBox" x:Key="TextBoxStyle" >
      <Setter Property="Height" Value="25" />
      <Setter ...
    </Style>

    VB:

    Dim tbx = new TextBox()
    tbx.Style = (Style)FindResource("TextBoxStyle")
    ....
    layoutRoot.Children.Add(tbx)

    Outra solução é usar algo como o Anderson apontou.

    []s

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    • Marcado como Resposta Nelson Gonzaga sexta-feira, 12 de novembro de 2010 11:25
    quinta-feira, 11 de novembro de 2010 10:44