Jump to content

Listbox - Atribuir ids aos items.


Techas
 Share

Recommended Posts

Boas,

Estou a utilizar o seguinte codigo para adicionar items a uma listbox:

For i = 0 To .marketData.Length - 1
                        With .marketData(i)
                            If .marketStatus = "ACTIVE" Then
                                If .marketName = "Half Time Score" Or .marketName = "Correct Score" Then
                                    Dim Items As String() = Split(.menuPath, "\")
                                    ListBox1.Items.Add(.marketId & " - " & Items(UBound(Items)) & " - " & .marketName)
                                End If
                            End If
                        End With
                    Next

Preciso do valor em .markeId quando seleciono o item e para isso estou a usar isto:

mid0 = CStr(Val(ListBox1.SelectedItem))

Embora funcione tudo muito bem, não gostava de ter um numero no inicio de cada elemento da lista. Haverá maneira de atribuir o valor de .marketId a cada elemento da lista, obtê-lo depois de seleccionar o elemento sem precisar de ser como fiz?

Obrigado  😞

Link to comment
Share on other sites

Claro.

Podes adicionar objectos inteiros à colecção de itens da listbox, Structures inclusivé. Ela apresenta no texto do item, a representação string desse objecto.

Basta depois um simples CType para "recuperares" o Intellisense.

Se nada disto te faz sentido, eu já te faço um exemplo, daqui a nada, que agora não posso 🙂

Ou talvez alguém to possa fazer antes 😞

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

😄 OK

Não vou tentar sequer olhar para o teu código. Tem letrinhas a mais para a dor de cabeça com que estou, sorry 😞

Passo-te um exemplo que podes Copiar e Colar para ver logo resultados, que te ajuda a perceber como deves solucionar o teu problema.

É na verdade muito lógico e suficientemente simples, basta olhares para o código com atenção e abstraíres-te do facto de uma listbox só te parecer listar texto, o que não é de todo verdade.

O que estamos a fazer em baixo é criar duas instâncias da Structure pessoa, que compreende um conjunto de 3 membros expostos (podem ser os que te apetecer).

Cada instância é preenchida com os dados de cada indivíduo e por fim espeta-se tudo para a colecção "Items" da ListBox.

Precisas, para o Copy/Paste de 1xListBox, 3xButton (Idade, Morada e Telefone), tudo com os nomes por defeito.

Depois basta substituír o código do Form1 com o que tens abaixo, e tens o exemplo a mexer.

Public Class Form1
    Private Structure Pessoa
        Public Nome As String
        Public Idade As Integer
        Public Morada As String
        Public Telefone As String
        
        'Fazemos o override ao método que devolve a representação string (o texto que ves na textbox) 
        'e damos-lhe o que queremos dar, neste caso o nome e a idade entre parêntesis
        Public Overrides Function ToString() As String
            Return Nome & " (" & Idade.ToString & ")"
        End Function
    End Structure

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        'Preenchemos as estructuras nas novas instâncias
        Dim P1 As New Pessoa
        P1.Nome = "Zeca Farinha"
        P1.Idade = 22
        P1.Morada = "Rua dos marmelos, Lote 1"
        P1.Telefone = "987654321"

        Dim P2 As New Pessoa
        P2.Nome = "João Ratão"
        P2.Idade = 25
        P2.Morada = "Rua da marmelada, Lote 2"
        P2.Telefone = "987654312"

        'Adicionamos os objectos Pessoa à Listbox (tcharan!)
        ListBox1.Items.Add(P1)
        ListBox1.Items.Add(P2)

    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        'Basta depois ir pedir o membro exposto do objecto, com uma simples conversão de tipo 
        'para o Intellisense (a caixinha de sugestão do Visual Studio) trabalhar
        'Neste caso pedimos a idade numa MsgBox. O mesmo para os restantes botões, com membros expostos diferentes
        MsgBox(CType(ListBox1.SelectedItem, Pessoa).Idade)
    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        MsgBox(CType(ListBox1.SelectedItem, Pessoa).Morada)
    End Sub

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
        MsgBox(CType(ListBox1.SelectedItem, Pessoa).Telefone)
    End Sub
End Class

Se não extraíres daí nada que te faça jeito, não sei como te posso explicar melhor :dontgetit: 🙂

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Estive agora a experimentar e resolvi assim:

Private Structure Market
        Public id As Integer
        Public path As String
        Public name As String
        Public Overrides Function ToString() As String
            Return path & " - " & name
        End Function
    End Structure

For i = 0 To .marketData.Length - 1
                        With .marketData(i)
                            If .marketStatus = "ACTIVE" Then
                                If .marketName = "Half Time Score" Or .marketName = "Correct Score" Then
                                    Dim Items As String() = Split(.menuPath, "\")
                                    Dim Q As New Market
                                    Q.id = .marketId
                                    Q.path = Items(UBound(Items))
                                    Q.name = .marketName
                                    ListBox1.Items.Add(Q)
                                End If
                            End If
                        End With
                    Next

Tudo a funcionar 5 estrelas  😞 mais uma vez muito obrigado.

Link to comment
Share on other sites

Não vale a pena estar a abrir outro topico porque acho que tem alguma coisa a ver com a minha questão anterior  😛

Estou a usar o seguinte código para mudar a cor dos items da listbox:

 Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
        Dim stringToDraw As String = ListBox1.Items(e.Index).ToString
        Dim C As Color
        If stringToDraw = "Unmatched" Then
            C = Color.Blue
        Else
            C = Color.Red
        End If
        e.DrawBackground()
        e.DrawFocusRectangle()
        e.Graphics.DrawString(stringToDraw, e.Font, New SolidBrush(C), e.Bounds)
    End Sub

E funciona tudo muito bem, a questão era o que preciso de modificar ali para mudar a cor de acordo com algum valor da estrutura Market que não está "à mostra" na listbox. Do género se Market.id = 32324 então a cor será igual a vermelho.

Link to comment
Share on other sites

 Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
        Dim stringToDraw As String = ListBox1.Items(e.Index).ToString
        Dim tempMarket As Market = CType(ListBox1.Items(e.Index),Market)
        Dim C As Color
        If tempMarket.id = 32324 Then
            C = Color.Blue
        Else
            C = Color.Red
        End If
        e.DrawBackground()
        e.DrawFocusRectangle()
        e.Graphics.DrawString(stringToDraw, e.Font, New SolidBrush(C), e.Bounds)
    End Sub

O0

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.