Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: CAEL20 en 24 Marzo 2018, 03:06 am



Título: Eliminar Items en blanco
Publicado por: CAEL20 en 24 Marzo 2018, 03:06 am
Saludos como poder eliminar items en blancos que hay en una lista de un Listbox?? :( VB.NET


Título: Re: Eliminar Items en blanco
Publicado por: Eleкtro en 24 Marzo 2018, 22:02 pm
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
  1. Namespace ListBoxExtensions
  2.  
  3.    ''' ----------------------------------------------------------------------------------------------------
  4.    ''' <summary>
  5.    ''' Contains custom extension methods to use with <see cref="ListBox"/> control.
  6.    ''' </summary>
  7.    ''' ----------------------------------------------------------------------------------------------------
  8.    <HideModuleName>
  9.    Public Module ListBoxExtensions
  10.  
  11. #Region " Public Extension Methods "
  12.  
  13.        ''' ----------------------------------------------------------------------------------------------------
  14.        ''' <summary>
  15.        ''' Removes items of the specified type in the source <see cref="ListBox"/> given a condition.
  16.        ''' </summary>
  17.        ''' ----------------------------------------------------------------------------------------------------
  18.        ''' <typeparam name="T">
  19.        ''' The <see cref="Type"/> of items to remove.
  20.        ''' </typeparam>
  21.        '''
  22.        ''' <param name="sender">
  23.        ''' The source <see cref="ListBox"/>.
  24.        ''' </param>
  25.        '''
  26.        ''' <param name="predicate">
  27.        ''' A <see cref="Func(Of T, Boolean)"/> function to test each element for a condition.
  28.        ''' </param>
  29.        ''' ----------------------------------------------------------------------------------------------------
  30.        <DebuggerStepThrough>
  31.        <Extension>
  32.        <EditorBrowsable(EditorBrowsableState.Always)>
  33.        Public Sub RemoveItems(Of T)(ByVal sender As ListBox, ByVal predicate As Func(Of T, Boolean))
  34.            Dim collection As ListBox.ObjectCollection = sender.Items
  35.            Dim indices As New Stack(Of Integer)
  36.  
  37.            For index As Integer = 0 To (collection.Count - 1)
  38.                Dim obj As Object = collection(index)
  39.                If (TypeOf obj Is T) AndAlso (predicate.Invoke(DirectCast(obj, T))) Then
  40.                    indices.Push(index)
  41.                End If
  42.            Next index
  43.  
  44.            sender.BeginUpdate()
  45.            sender.SelectedIndex = -1
  46.            Do While (indices.Any())
  47.                collection.RemoveAt(indices.Pop())
  48.            Loop
  49.            sender.EndUpdate()
  50.  
  51.            collection = Nothing
  52.            indices = Nothing
  53.        End Sub
  54.  
  55.        ''' ----------------------------------------------------------------------------------------------------
  56.        ''' <summary>
  57.        ''' Removes any empty string items (<see cref="String.Empty"/>) in the source <see cref="ListBox"/>.
  58.        ''' </summary>
  59.        ''' ----------------------------------------------------------------------------------------------------
  60.        ''' <param name="sender">
  61.        ''' The source <see cref="ListBox"/>.
  62.        ''' </param>
  63.        ''' ----------------------------------------------------------------------------------------------------
  64.        <DebuggerStepThrough>
  65.        <Extension>
  66.        <EditorBrowsable(EditorBrowsableState.Always)>
  67.        Public Sub RemoveEmptyStrings(ByVal sender As ListBox)
  68.            Dim predicate As Func(Of String, Boolean) =
  69.                Function(str As String) As Boolean
  70.                    Return String.IsNullOrEmpty(str)
  71.                End Function
  72.  
  73.            ListBoxExtensions.RemoveItems(Of String)(sender, predicate)
  74.        End Sub
  75.  
  76.        ''' ----------------------------------------------------------------------------------------------------
  77.        ''' <summary>
  78.        ''' Removes any empty string items (<see cref="String.Empty"/>)
  79.        ''' and also string items that consists only of white-space characters in the source <see cref="ListBox"/>.
  80.        ''' </summary>
  81.        ''' ----------------------------------------------------------------------------------------------------
  82.        ''' <param name="sender">
  83.        ''' The source <see cref="ListBox"/>.
  84.        ''' </param>
  85.        ''' ----------------------------------------------------------------------------------------------------
  86.        <DebuggerStepThrough>
  87.        <Extension>
  88.        <EditorBrowsable(EditorBrowsableState.Always)>
  89.        Public Sub RemoveEmptyOrWhiteSpaceStrings(ByVal sender As ListBox)
  90.            Dim predicate As Func(Of String, Boolean) =
  91.                Function(str As String) As Boolean
  92.                    Return String.IsNullOrWhiteSpace(str)
  93.                End Function
  94.  
  95.            ListBoxExtensions.RemoveItems(Of String)(sender, predicate)
  96.        End Sub
  97.  
  98. #End Region
  99.  
  100.    End Module
  101.  
  102. End Namespace

Modo de empleo para eliminar cadenas de texto vacías (String.Empty):
Código
  1. Me.ListBox1.Items.AddRange({"1", "2", "3", "", String.Empty, "4", "5"})
  2. 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
  1. Me.ListBox1.Items.AddRange({"1", "2", "3", "", String.Empty, "        ", "4", "5"})
  2. ListBoxExtensions.RemoveEmptyOrWhiteSpaceStrings(Me.ListBox1)

Modo de empleo para eliminar items de un tipo específico que cumplan cierta condición:
Código
  1. Me.ListBox1.Items.AddRange({Color.Red, Color.Green, Color.Blue})
  2.  
  3. Dim predicate As Func(Of Color, Boolean) =
  4.    Function(c As Color) (c = Color.Green)
  5.  
  6. 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
  1. Imports Namespace_Principal.ListBoxExtensions
  2.  
  3. ...
  4.  
  5. Dim lb As ListBox = Me.ListBox1
  6.  
  7. lb.RemoveEmptyStrings()
  8. lb.RemoveEmptyOrWhiteSpaceStrings()
  9. 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
  1. Public Class TestClass
  2.  
  3. Private Sub Metodo()
  4.    Dim lb As ListBox = Me.ListBox1
  5.    lb.Items.AddRange({Color.Red, Color.Green, Color.Blue})
  6.  
  7.    ListBoxExtensions.RemoveItems(Of Color)(lb, AddressOf Me.ColorPredicate)
  8. End Sub
  9.  
  10. Private Function ColorPredicate(ByVal c As Color) As Boolean
  11.    Select Case c
  12.  
  13.        Case Color.Green
  14.            Return True
  15.  
  16.        Case Else
  17.            Return False
  18.  
  19.    End Select
  20. End Function
  21.  
  22. End Class