none
Listview RRS feed

  • Pregunta

  • Buena; Cuando lleno un listview desde una consulta al Active directory me salen los equipos correctamente, pero luego cuando quiero recorrer los equipos en busca del usuario logueado, me desaparecen los items y no aparecen hasta que termina de recorrer los 400 equipos. Lo que quiero es que me muestre para cada equipo el usuario logueado al mismo tiempo que los recorre, osea cuando encuentra el usuario me lo cambia de color y pasa al siguiente item, todo esto viendolo en el momento. Les pongo mi codigo. Gracias de antemano.NOTA: Uso visual basic 2010 express. Mi correo si alguna alma caritativa: abahbou@hotmail.com

    Imports System.DirectoryServices
    Imports System.Net.NetworkInformation
    Imports System
    Imports System.Collections
    Imports System.Collections.Generic
    Imports System.ComponentModel
    Imports System.Diagnostics
    Imports System.Drawing
    Imports System.IO
    Imports System.Net
    Imports System.Runtime.CompilerServices
    Imports System.Threading
    Imports System.Windows.Forms
    Imports Microsoft.VisualBasic
    Imports Microsoft.VisualBasic.ApplicationServices
    Imports Microsoft.VisualBasic.CompilerServices

    Public Class Form1
        Dim equipo As ListViewItem
        Dim contador As Decimal = 0
        Dim flag As Boolean
        Dim i1 As Integer
        Dim s1 As String = ""
        Dim s2 As String
        Dim s3 As String
        Dim s4 As String
        Dim flag1 As Boolean
        Dim color As Color
        Dim ienumerator1 As IEnumerator, ienumerator2 As IEnumerator
        Dim strUserName
        Dim objWMIService
        Dim colComputer
        Dim s5 As String
        Dim objetoUsuario
        Dim dominio As String
        Dim i As Integer
        Dim progressBar As ProgressBar = ProgressBar1
       


        Private Sub personalizar_listview_usuario()
            Dim listView As ListView = ListView1
            listView.View = View.Details
            listView.FullRowSelect = True
            listView.Columns.Add("Maquina", "Maquina", 100)
            listView.Columns.Add("Usuario", "Usuario", 130)
            listView.Columns.Add("Nombre", "Nombre", 230)
            listView.Columns.Add("MAC", "MAC", 140)
            listView.GridLines = True
            listView = Nothing
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Close()
        End Sub

        Private Sub Cargar_maquinas() Handles Button2.Click
            Dim flag As Boolean = ListView1.Items.Count

            Dim flagArr As Boolean() = New Boolean() {True}
            Dim objArr1 As Object() = New Object(1) {}
            Dim objArr2 As Object() = objArr1
            Dim ienumerator As IEnumerator
            Try
                'Apuntamos al directorio
                Dim DirectoryEntry1 As New DirectoryEntry("LDAP://OU=ESTACIONES,OU=ET-JRIBERA,OU=ET,DC=MDEF,DC=ES")
                'Creamos nuestro buscador
                Dim mySearcher As New DirectorySearcher(DirectoryEntry1)
                'Filtro de busqueda, equipos..
                mySearcher.Filter = ("objectClass=Computer")
                'Por cada elemento encontrado...
                Button2.Enabled = False
                Try
                    ienumerator = mySearcher.FindAll().GetEnumerator()
                    For Each encontrado As SearchResult In mySearcher.FindAll()
                        'Lo voy escribiendo en el listview1...
                        ListView1.Items.Add(Convert.ToString(encontrado.Properties("name")(0))) ' Llena la 1ª columna
                        ListView1.Items(i).SubItems.Add("Pendiente...") ' Llena la 2ª columna
                        ListView1.Items(i).SubItems.Add("Pendiente...") ' llena la 3ª columna
                        ListView1.Items(i).SubItems.Add("Pendiente...") ' Llena la 4ª columna
                        i += 1
                        flag = ienumerator.MoveNext()
                    Next
                Finally
                End Try
                ListView1.Enabled = True
                Label1.Text = Conversions.ToString(ListView1.Items.Count)
            Catch e2 As Exception
                ProjectData.SetProjectError(e2)
                MessageBox.Show("Imposible acceder al emplazamiento solicitado", "Error en datos", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                ListView1.Enabled = True
                Button2.Enabled = True
                ProjectData.ClearProjectError()
                GoTo label_1
                ProjectData.ClearProjectError()
            End Try
            'ListView1.Sorting = SortOrder.Ascending
            'comprobar_usuarios()
    label_1:
        End Sub
        Private Sub comprobar_usuarios() Handles Button3.Click
            Dim i3 As Integer
            Dim s1 As String = ""
            Dim i1 As Integer = 0
            Dim i2 As Integer = ListView1.Items.Count - 1
            progressBar.Maximum = Conversions.ToInteger(Label1.Text)
            progressBar.Minimum = 0
            ProgressBar1.Increment(1)
            'progressBar.Step = 1
            progressBar.Value = 1
            progressBar = Nothing
            Label3.Text = "0 %"
            i1 = 0
            dominio = "mdef.es"
            Button3.Enabled = False
            While i1 <= 10
                ListView1.EnsureVisible(i1)
                ListView1.Items(i1).BackColor = color.Black
                ListView1.Items(i1).ForeColor = color.Red
                s2 = ListView1.Items(i1).SubItems(0).Text
                ListView1.Items(i1).SubItems(1).Text = "COMPROBANDO"
                Try
                    flag1 = My.Computer.Network.Ping(s2)
                    If flag1 Then
                        objWMIService = GetObject("winmgmts:\\" & s2 & "\root\cimv2") 'Instancio un objeto para manejar los servicios de WMI en el equipo seleccionado
                        colComputer = objWMIService.ExecQuery("Select * from Win32_ComputerSystem") 'Realizo un query de la clase Win32_ComputerSystem y lo guardo en una colección
                        For Each objComputer In colComputer            'Realizo un bucle de cada objeto en la colección
                            strUserName = objComputer.UserName     'Guarda el Nombre de usuario logoneado en una variable
                            s5 = strUserName
                            'strmac = objComputer.Name
                            's3 = strmac
                            'MsgBox(s3)
                            Dim chArr As Char() = New Char() {"\"c}
                            Dim sArr1 As String() = s5.Split(chArr)
                            s1 = sArr1(1)
                            'MsgBox(s1)
                            'flag1 = ienumerator1.MoveNext()
                            objetoUsuario = GetObject("WinNT://" + dominio + "/" + s1 + ",user")
                            s3 = objetoUsuario.Get("Fullname")

                            ListView1.Items(i1).ForeColor = color.Blue
                            ListView1.Items(i1).SubItems(1).Text = s1 'Llenamos el listview con el nombre de usuario
                            ListView1.Items(i1).SubItems(2).Text = s3 'Llenamos el listview con el nombre de usuario completo
                            'ListView1.Items(i1).SubItems(3).Text = s4 'Llenamos el listview con el nombre de la unidad del usuario
                        Next
                    Else
                        ListView1.Items(i1).ForeColor = color.Red
                        ListView1.Items(i1).SubItems(1).Text = "Sin conexión"
                        ListView1.Items(i1).SubItems(2).Text = "Sin conexión"
                        ListView1.Items(i1).SubItems(3).Text = "Sin conexión"

                    End If
                Catch ex As Exception
                    ProjectData.SetProjectError(ex)
                    ListView1.Items(i1).ForeColor = color.Black
                    ListView1.Items(i1).SubItems(1).Text = "Sin conexión"
                    ListView1.Items(i1).SubItems(2).Text = "Sin conexión"
                    ListView1.Items(i1).SubItems(3).Text = "Sin conexión"
                    ProjectData.ClearProjectError()
                End Try
                ListView1.Items(i1).BackColor = color.White
                ProgressBar1.Value = i1 + 1
                ProgressBar1.Refresh()
                Dim d As Double = CDbl((ProgressBar1.Value * 100)) / CDbl(ProgressBar1.Maximum)
                Label3.Text = d.ToString("##0.##") + " %"
                Label3.Refresh()
                i1 += 1
                Label3.Text = ListView1.Items.Count()
            End While
            Button2.Enabled = True
            Button3.Enabled = True
        End Sub

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


    • Editado abahest lunes, 19 de diciembre de 2011 18:19
    lunes, 19 de diciembre de 2011 18:18

Respuestas

Todas las respuestas

  • Hola, cuando te metes dentro de un bucle, del tipo que sea, son pocas las cosas que se refrescan solas, hasta que el bucle termina no se ve nada, tendras que pasar el control al formulario de cuando en cuando, pon esto en tu bucle , donde te parezca mas adecuado para que te enseñe lo que esta seleccionado en el momento.

     My . Application . DoEvents()

     (los espacios delante y detras de los puntitos sobran, pero si lo pongo como es en realidad me lo pone la instruccion en varias lineas)

     



    jueves, 5 de enero de 2012 11:43
  • Puedes probar la posibilidad de usar Threads (Hilos de ejecución).

    Puedes ver y descargar un ejemplo desde aquí:

    Multiprocesamiento

    Saludos.


    Santiago Ezequiel Rueda
    santiagorueda@live.com.ar
    Blog

    Entre Ríos
    Argentina
    jueves, 5 de enero de 2012 15:06
  • Muchas gracias por la ayuda. Lo he rsuelto simplemente poniendo un listview.refresch. Gracias y saludos
    Antonio Esteban
    viernes, 6 de enero de 2012 23:04