Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas Com Coleções


Denis Bittencourt Muniz

Pergunta

Olá galera! Tudo bom? (eu já to +/-, xD)

Olha, o negócio é o seguinte:

Estou desenvolvendo um componente para consultas ao banco de dados. Terá um ComboBox com os campos de consulta, um TextBox para o valor (parâmetro) do usuário e um DataGridView, para exibição dos dados. Até aí, tudo bem!

Estou usando um UserControl como base. Quando vou definir uma propriedade (tem que ser propriedade, já que quero que a mesma, futuramente, seja parte da Smart Tag do meu componente), eu não sei como dispor a mesma... ( :P , eu sei declarar uma propriedade sim! xD) estranho? Explicando melhor:

  • Fiz uma estrutura chamada Field, contendo três propriedades: Rótulo (descrição para o usuário), Nome (nome do campo) e Type (tipo do campo, uma outra história, não importante ao caso). Então, criei um campo privado chamado _fields, que é do tipo List(Of Field), ou seja, um generic. Depois, uma propriedade somente-leitura, chamada Fields, que encapsula o maldito campo, _fields. Liguei a propriedade DataSource do ComboBox de campos com a propriedade Fields, mas percibi um detalhe: se após a ligação, ou seja, a execução da linha: "cmbCampo.DataSource=Me.Fields", for adicionado mais um item (Field) a propriedade Fields, o conteúdo (Items) do ComboBox não será atualizado...
Resumindo: como faço essa atualização ocorrer. Alias, alguém sugere alguma outra idéia/método para interface de adição/remoção de campos, apesar que tem que ser propriedade, para funcionar com Smart Tags (no caso uma janelinha iria aparecer para a configuração de campos, parecido com a edição da propriedade Items do componente ComboBox). Ajuda? To ficando louco já!

Grato desde já!

Falows!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

É, eu fiz o teste aqui e realmente acontece o que você diz. Mas, fiz outro teste usando uma DataTable e dá certo. O primeiro teste foi:

Public Class Field
    Private _rótulo As String
    Private _nome As String
    Private _tipo As Type

    Public Property Rótulo() As String
        Get
            Return _rótulo
        End Get
        Set(ByVal value As String)
            _rótulo = value
        End Set
    End Property

    Public Property Nome() As String
        Get
            Return _nome
        End Get
        Set(ByVal value As String)
            _nome = value
        End Set
    End Property

    Public Property Tipo() As Type
        Get
            Return _tipo
        End Get
        Set(ByVal value As Type)
            _tipo = value
        End Set
    End Property

    Public Sub New(ByVal rótulo As String, ByVal nome As String, ByVal tipo As Type)
        Me.Rótulo = rótulo
        Me.Nome = nome
        Me.Tipo = tipo
    End Sub

    Public Overrides Function ToString() As String
        Return Me.Nome
    End Function
End Class

Public Class Teste
    Private _fields As List(Of Field)

    Public Property Fields() As List(Of Field)
        Get
            Return _fields
        End Get
        Set(ByVal value As List(Of Field))
            _fields = value
        End Set
    End Property

    Public Sub New()
        Me.Fields = New List(Of Field)
    End Sub
End Class
Daí fiz o teste:
Dim k As New Teste()

k.Fields.Add(New Field("Nome:", "Nome", Type.GetType("System.String")))
k.Fields.Add(New Field("Telefone:", "Telefone", Type.GetType("System.String")))

ComboBox1.DataSource = k.Fields

'Adicionado depois:
k.Fields.Add(New Field("Teste:", "Teste", Type.GetType("System.String")))
Realmente o campo "Teste", adicionado depois, não aparece. E aí está a segunda classe que criei (agora usando uma DataTable e sem criar a classe Field):
Public Class Teste2
    Private _fields As DataTable

    Public Property Fields() As DataTable
        Get
            Return _fields
        End Get
        Set(ByVal value As DataTable)
            _fields = value
        End Set
    End Property

    Public Sub New()
        Me.Fields = New DataTable()
        Me.Fields.Columns.Add("Rótulo", Type.GetType("System.String"))
        Me.Fields.Columns.Add("Nome", Type.GetType("System.String"))
        Me.Fields.Columns.Add("Tipo", Type.GetType("System.Type"))
    End Sub
End Class
E, com esta fiz o teste:
Dim k2 As New Teste2()

k2.Fields.Rows.Add("Nome:", "Nome", Type.GetType("System.String"))
k2.Fields.Rows.Add("Telefone:", "Telefone", Type.GetType("System.String"))

ComboBox2.DataSource = k2.Fields
ComboBox2.DisplayMember = "Nome"

'Adicionado depois:
k2.Fields.Rows.Add("Teste:", "Teste", Type.GetType("System.String"))

E neste caso apareceu o último campo adicionado ("Teste") automaticamente na ComboBox.

Esta diferença deve existir pelo fato de uma lista (List) não ter acesso ao controle que está exibindo os dados para atualizá-lo no momento que um item é adicionado. Já a DataTable deve ter este tipo de acesso.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...