Eliminar Items en blanco

Iniciado por CAEL20, 24 Marzo 2018, 03:06 AM

0 Miembros y 1 Visitante están viendo este tema.

CAEL20

Saludos como poder eliminar items en blancos que hay en una lista de un Listbox?? :( VB.NET

Eleкtro

#1
Buenas.

1. Las preguntas sobre VB.NET van en el foro de programación .NET.

2. A pesar de que la pregunta que has formulado se puede y se debería considerar una pregunta vaga a la que no se te debería responder, puesto que podrías haber buscado en Google para encontrar miles de resultados... pero estuve mirando algunos de esos resultados para indicarte algún enlace, y lo cierto es que no me gustó ninguna de las soluciones (feas y poco óptimas) que se pueden encontrar en Google, así que aquí tienes una solución que he desarrollado basada en extensiones de método y con soporte para tipos genéricos:

Código (vbnet) [Seleccionar]
Namespace ListBoxExtensions

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Contains custom extension methods to use with <see cref="ListBox"/> control.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   <HideModuleName>
   Public Module ListBoxExtensions

#Region " Public Extension Methods "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Removes items of the specified type in the source <see cref="ListBox"/> given a condition.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <typeparam name="T">
       ''' The <see cref="Type"/> of items to remove.
       ''' </typeparam>
       '''
       ''' <param name="sender">
       ''' The source <see cref="ListBox"/>.
       ''' </param>
       '''
       ''' <param name="predicate">
       ''' A <see cref="Func(Of T, Boolean)"/> function to test each element for a condition.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
        <DebuggerStepThrough>
        <Extension>
        <EditorBrowsable(EditorBrowsableState.Always)>
       Public Sub RemoveItems(Of T)(ByVal sender As ListBox, ByVal predicate As Func(Of T, Boolean))
           Dim collection As ListBox.ObjectCollection = sender.Items
           Dim indices As New Stack(Of Integer)

           For index As Integer = 0 To (collection.Count - 1)
               Dim obj As Object = collection(index)
               If (TypeOf obj Is T) AndAlso (predicate.Invoke(DirectCast(obj, T))) Then
                   indices.Push(index)
               End If
           Next index

           sender.BeginUpdate()
           sender.SelectedIndex = -1
           Do While (indices.Any())
               collection.RemoveAt(indices.Pop())
           Loop
           sender.EndUpdate()

            collection = Nothing
            indices = Nothing
       End Sub

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Removes any empty string items (<see cref="String.Empty"/>) in the source <see cref="ListBox"/>.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="sender">
       ''' The source <see cref="ListBox"/>.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       <DebuggerStepThrough>
       <Extension>
       <EditorBrowsable(EditorBrowsableState.Always)>
       Public Sub RemoveEmptyStrings(ByVal sender As ListBox)
           Dim predicate As Func(Of String, Boolean) =
               Function(str As String) As Boolean
                   Return String.IsNullOrEmpty(str)
               End Function

           ListBoxExtensions.RemoveItems(Of String)(sender, predicate)
       End Sub

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Removes any empty string items (<see cref="String.Empty"/>)
       ''' and also string items that consists only of white-space characters in the source <see cref="ListBox"/>.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="sender">
       ''' The source <see cref="ListBox"/>.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       <DebuggerStepThrough>
       <Extension>
       <EditorBrowsable(EditorBrowsableState.Always)>
       Public Sub RemoveEmptyOrWhiteSpaceStrings(ByVal sender As ListBox)
           Dim predicate As Func(Of String, Boolean) =
               Function(str As String) As Boolean
                   Return String.IsNullOrWhiteSpace(str)
               End Function

           ListBoxExtensions.RemoveItems(Of String)(sender, predicate)
       End Sub

#End Region

   End Module

End Namespace


Modo de empleo para eliminar cadenas de texto vacías (String.Empty):
Código (vbnet) [Seleccionar]
Me.ListBox1.Items.AddRange({"1", "2", "3", "", String.Empty, "4", "5"})
ListBoxExtensions.RemoveEmptyStrings(Me.ListBox1)


Modo de empleo para eliminar cadenas de texto vacías (String.Empty) y cadenas de texto que solo consistan en espacios en blanco:
Código (vbnet) [Seleccionar]
Me.ListBox1.Items.AddRange({"1", "2", "3", "", String.Empty, "        ", "4", "5"})
ListBoxExtensions.RemoveEmptyOrWhiteSpaceStrings(Me.ListBox1)


Modo de empleo para eliminar items de un tipo específico que cumplan cierta condición:
Código (vbnet) [Seleccionar]
Me.ListBox1.Items.AddRange({Color.Red, Color.Green, Color.Blue})

Dim predicate As Func(Of Color, Boolean) =
   Function(c As Color) (c = Color.Green)

ListBoxExtensions.RemoveItems(Of Color)(Me.ListBox1, predicate)


Por último, recuerda que puedes importar el espacio de nombres para simplificar el uso de las extensiones de método:
Código (vbnet) [Seleccionar]
Imports Namespace_Principal.ListBoxExtensions

...

Dim lb As ListBox = Me.ListBox1

lb.RemoveEmptyStrings()
lb.RemoveEmptyOrWhiteSpaceStrings()
lb.RemoveItems(Of Type)(Predicate)


...y que para el método RemoveItems(Of T) siempre puedes declarar una función a nivel de clase y utilizar el operador AddressOf:
Código (vbnet) [Seleccionar]
Public Class TestClass

Private Sub Metodo()
   Dim lb As ListBox = Me.ListBox1
   lb.Items.AddRange({Color.Red, Color.Green, Color.Blue})

   ListBoxExtensions.RemoveItems(Of Color)(lb, AddressOf Me.ColorPredicate)
End Sub

Private Function ColorPredicate(ByVal c As Color) As Boolean
   Select Case c

       Case Color.Green
           Return True

       Case Else
           Return False

   End Select
End Function

End Class