ordepavr Posted December 27, 2009 at 10:59 PM Report #302693 Posted December 27, 2009 at 10:59 PM 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"
ribeiro55 Posted December 28, 2009 at 01:38 AM Report #302702 Posted December 28, 2009 at 01:38 AM 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"
paulo silva Posted December 28, 2009 at 09:36 AM Report #302709 Posted December 28, 2009 at 09:36 AM Isso depende de como estás a fazer, se estas a usar instruções sql podes fazer um order by. cumps
ordepavr Posted December 28, 2009 at 12:04 PM Author Report #302739 Posted December 28, 2009 at 12:04 PM 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"
ribeiro55 Posted December 28, 2009 at 12:16 PM Report #302740 Posted December 28, 2009 at 12:16 PM Não basta o Sorted=True da Listbox? Já tentaste isso? 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"
ordepavr Posted December 28, 2009 at 12:39 PM Author Report #302745 Posted December 28, 2009 at 12:39 PM 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"
ordepavr Posted December 28, 2009 at 12:47 PM Author Report #302748 Posted December 28, 2009 at 12:47 PM 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"
ribeiro55 Posted December 28, 2009 at 01:05 PM Report #302750 Posted December 28, 2009 at 01:05 PM 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"
ordepavr Posted December 28, 2009 at 01:08 PM Author Report #302751 Posted December 28, 2009 at 01:08 PM 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"
ribeiro55 Posted December 28, 2009 at 03:29 PM Report #302792 Posted December 28, 2009 at 03:29 PM 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"
ordepavr Posted December 29, 2009 at 02:15 PM Author Report #302964 Posted December 29, 2009 at 02:15 PM UAU! 😕 Obrigado pela ajuda 🙂 cumps, Pedro L. "Programming is like sex: one mistake and you're providing support for a lifetime.""A exigência conduz à excelência"
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now