Principales respuestas
Listview

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
Respuestas
-
Muchas gracias por la ayuda. Lo he rsuelto simplemente poniendo un listview.refresch. Gracias y saludos
Antonio Esteban- Marcado como respuesta Enrique M. MontejoModerator lunes, 19 de marzo de 2012 15:37
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)
- Editado J. Luis Alamillo jueves, 5 de enero de 2012 11:46
- Propuesto como respuesta Santiago Ezequiel Rueda jueves, 5 de enero de 2012 15:05
-
Puedes probar la posibilidad de usar Threads (Hilos de ejecución).
Puedes ver y descargar un ejemplo desde aquí:
Saludos.
Santiago Ezequiel Rueda
santiagorueda@live.com.ar
Blog
Entre Ríos
Argentina- Editado Santiago Ezequiel Rueda jueves, 5 de enero de 2012 15:08
-
Muchas gracias por la ayuda. Lo he rsuelto simplemente poniendo un listview.refresch. Gracias y saludos
Antonio Esteban- Marcado como respuesta Enrique M. MontejoModerator lunes, 19 de marzo de 2012 15:37