Jump to content

Recommended Posts

Posted

Olá mais uma vez, venho de novo com uma dúvida. Desta vez tenho que adicionar uma linha numa listbox que terá o texto de uma textbox e o valor de uma variável, por exemplo:

textbox tem escrito "P@P DESEJA UM BOM"

a variável tem o valor 2010

Devo adicionar então a linha P@P DESEJA UM BOM 2010

Mas não é só isto, tenho depois que ordenar pelo valor da variável, ou seja, se depois adicionar a mesma coisa mas em vez de 2010 tiver 2011, esta deve ficar na 1ª linha e a que estava deve ir para a 2ª linha.

logo...

ficaria a lisbox assim:

P@P DESEJA UM BOM 2011

P@P DESEJA UM BOM 2010

Espero que me possam ajudar, com os melhores cumps. Pedro L.

"Programming is like sex: one mistake and you're providing support for a lifetime.""A exigência conduz à excelência"

Posted

Mas é para ordenar pelo valor da variável ou para inserir sempre em cima?

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"

Posted

Mas é para ordenar pelo valor da variável ou para inserir sempre em cima?

Tenho que inserir uma linha nova e ordená-la em relação às outras ou seja, ficava

9999

2011

2010

2008

3

2

1

e ao inserir o 2009 ele ficaria entre o 2008 e o 2010

Isso depende de como estás a fazer, se estas a usar instruções sql podes fazer um order by.

cumps

Não tem nada de SQL, nem sei usar isso 😕

cumps

"Programming is like sex: one mistake and you're providing support for a lifetime.""A exigência conduz à excelência"

Posted

Não basta o Sorted=True da Listbox? Já tentaste isso?

Isso faz o quê? temos que ter atenção que na linha da listbox tem o texto de uma textbox + o valor de uma variavel.

"Programming is like sex: one mistake and you're providing support for a lifetime.""A exigência conduz à excelência"

Posted

Experimentei isso e realmente ele ordena do mais pequeno para o maior, como faço o contrário ? do maior para o mais pequeno.

"Programming is like sex: one mistake and you're providing support for a lifetime.""A exigência conduz à excelência"

Posted

Não fazes. Pelo menos não com a mesma facilidade.

Podes sempre adicionar uma classe personalizada à lista e fazer os sorteios por outros meios.

Agora não, mas já te dou umas dicas daqui a nada.

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"

Posted

Não fazes. Pelo menos não com a mesma facilidade.

Podes sempre adicionar uma classe personalizada à lista e fazer os sorteios por outros meios.

Agora não, mas já te dou umas dicas daqui a nada.

OK, obrigado

"Programming is like sex: one mistake and you're providing support for a lifetime.""A exigência conduz à excelência"

Posted

Ora bem, podíamos implementar o interface IComparable e proceder à ordenação, mas vou optar por abordar a coisa mais "manualmente".

Como a ListBox aceita objectos, eu cá gosto de fazer uma pequena classe, ou uma estructura, para armazenar tudo o que eu preciso de armazenar.

No teu caso, tens texto e um número, então vamos lá:

Public Class ItemDaLista
    Public Numero As Integer
    Public Texto As String

    Public Overrides Function ToString() As String
        Return Texto & " " & Numero.ToString
    End Function
End Class

O override ao ToString serve para que a representação em String deste objecto seja exactamente o que queres mostrar, que é o texto e depois o número.

A ListBox, ao listar os seus objectos, lista a sua representação em string.

Assim, para adicionares itens à ListBox, antes fazias um simples Add("qualquer coisa") mas agora vamos adicionar um objecto devidamente preenchido, por exemplo:

            Dim LI As New ItemDaLista
            LI.Numero = i
            LI.Texto = "O meu número é"
            ListaPrincipal.Add(LI)

Para procedermos à ordenação, podemos fazer algo tão simples como um "Bubble sort", como referenciado aqui:

    Private Enum Ordem
        Ascendente
        Descendente
    End Enum

    Private Sub OrdenarNumeros(ByRef Lista As ListBox, ByVal Ordem As Ordem)
        Dim TempItem As Object
        Dim TotalNumeros As Integer = Lista.Items.Count

        Select Case Ordem

            Case Ordem.Ascendente
                For i As Integer = 0 To TotalNumeros - 2
                    Dim IDL1 As ItemDaLista = CType(Lista.Items(i), ItemDaLista)
                    Dim IDL2 As ItemDaLista = CType(Lista.Items(i + 1), ItemDaLista)

                    If i <= TotalNumeros - 2 Then
                        If IDL2.Numero < IDL1.Numero Then
                            TempItem = IDL1
                            Lista.Items(i) = IDL2
                            Lista.Items(i + 1) = TempItem
                            i = -1
                        End If

                    End If
                Next


            Case Ordem.Descendente
                For i As Integer = 0 To TotalNumeros - 2
                    Dim IDL1 As ItemDaLista = CType(Lista.Items(i), ItemDaLista)
                    Dim IDL2 As ItemDaLista = CType(Lista.Items(i + 1), ItemDaLista)

                    If i <= TotalNumeros - 2 Then
                        If IDL2.Numero > IDL1.Numero Then
                            TempItem = IDL1
                            Lista.Items(i) = IDL2
                            Lista.Items(i + 1) = TempItem
                            i = -1
                        End If

                    End If
                Next
        End Select

    End Sub

EDIT: As conversões feitas para o IDL1 e IDL2 servem para evitar erros de "late bind" na comparação da variável "Numero", caso o Option Strict esteja ligado.

Basicamente estamos a comparar a variável "Numero" dentro da classe ItemDaLista que representa o objecto contido em cada item da listbox.

Com o resultado da comparação, negociamos directamente os objectos entre os índices que estamos a trabalhar.

O ByRef do argumento garante que vamos trabalhar sobre a nossa listbox e as alterações reflectem-se de imediato.

Basta agora, chamar o método de sorteio:

OrdenarNumeros(ListBox1, Ordem.Descendente)

É um método bastante lento e por isso não o recomendo para um grande volume de dados.

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"

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
×
×
  • 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.