Visual Basic.NET - Problema al actualizar informacion de objetos

   
Vista:

Problema al actualizar informacion de objetos

Publicado por D.Gallego (11 intervenciones) el 10/01/2016 02:06:29
Buenas noches
Estoy haciendo un programa que coge de una base de datos nombre e ips, las cuenta y crea un circulo que dependiendo de si esta encendido o no aparece en rojo o en verde. Lo que hace es:
Busca el registro numero 1
crea el objeto
verifica el estado
Le asigna un color
Así hasta que termina con todo

Tiene un timer, pero cuando se ejecuta por 2º vez no se reflejan cambios. Entiendo que simplemente crearía un objeto nuevo encima (Que no es lo que quiero), pero no hace nada.

Querría saber como, después de crear todos esos objetos, puedo acceder a ellos para cambiar su estado.
La meta es conseguir que cada objeto a través de un hilo (imagino), compruebe cada x tiempo el estado de su ip asociado. Con los hilos tambien he tenido problemas, por eso los he dejado aparcados.
Este es el codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
Public Sub CargarEquipos()
 
        Try
 
 
            Using cnn As New OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=.\A1.mdb")
 
                ' Creamos un comando
                Dim cmd As OleDbCommand = cnn.CreateCommand()
 
                ' Abrimos la conexión
                cnn.Open()
                Dim consulta As OleDbCommand
                consulta = New OleDb.OleDbCommand("SELECT count(*) FROM IP", cnn)
                Dim Total As Integer = CType(consulta.ExecuteScalar(), Integer)
                'MsgBox(Total)
                Dim Lx As Integer = 64
                Dim Ly As Integer = 32
                Dim Sx As Integer = 32
                Dim Sy As Integer = 32
                Dim Llx As Integer = 22
                Dim Lly As Integer = 70
                Dim SeparacionH As Integer = 80
                Dim SeparacionV As Integer = 70
 
                For i As Integer = 1 To Total
 
                    If Lx > 640 Then
                        Lx = 64
                        Ly = Ly + SeparacionH
                        Llx = 22
                        Lly = Lly + SeparacionV
 
                    End If
 
 
 
                    'Dim pb As New PictureBox
                    Dim pb(i) As PictureBox
                    pb(i).Location = New Point(Lx, Ly)
                    pb(i).Size = New Size(Sx, Sy)
                    pb(i).Image = Image.FromFile(".\Iconos\azul.png")
                    Me.Controls.Add(pb(1))
                    Lx = Lx + SeparacionH
 
                    Dim lbl As New Label
                    lbl.Location = New Point(Llx, Lly)
                    lbl.TextAlign = ContentAlignment.MiddleCenter
                    'lbl.Text = "Hola"
                    Me.Controls.Add(lbl)
                    Llx = Llx + SeparacionH
                    Dim IPlabel As OleDbCommand
                    IPlabel = New OleDb.OleDbCommand("SELECT NOMBRE FROM IP WHERE ID = " & i & " ", cnn)
                    Dim label As String = CType(IPlabel.ExecuteScalar, String)
                    lbl.Text = label
 
 
 
                    Dim IPcadena As OleDbCommand
                    IPcadena = New OleDb.OleDbCommand("SELECT IPEQUIPO FROM IP WHERE ID = " & i & " ", cnn)
                    Dim IP As String = CType(IPcadena.ExecuteScalar, String)
                    'MsgBox(IP)
                    Dim value As Boolean = My.Computer.Network.Ping(IP)
                    If value = True Then
                        pb(i).Image = Image.FromFile(".\Iconos\verde.png")
                    Else
                        pb(i).Image = Image.FromFile(".\Iconos\rojo.png")
                    End If
 
                    'HiloPing = New Threading.Thread(AddressOf PINGER)
                    'HiloPing.Start()
                    'MsgBox(Lx)
 
                Next
                Lx = 64
                Ly = 32
                Sx = 32
                Sy = 32
                Llx = 22
                Lly = 70
                MsgBox("Clinc")
            End Using
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

Gracias y un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de giancarlo

Problema al actualizar informacion de objetos

Publicado por giancarlo giangbd5@hotmail.com (280 intervenciones) el 10/01/2016 18:17:31
Len lugar de usar un timer, deberías usar backround progress, de esta manera no se bloqueara la pantalla mientras corta el timer

El porque no sale? Me parece que quizás deberías usar el controls.clear aunque en realidad deberías solo modificar el valor o color, no agregar nuevos controles
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al actualizar informacion de objetos

Publicado por D.Gallego (11 intervenciones) el 10/01/2016 20:56:34
Buenas
¿Que es eso del control clear?
El hecho de que se quede la pantalla bloqueada de momento es un mal menor, porque nadie la va a tocar, solo estará a modo de monitor.
La duda que tengo es, como modifico el color de los elementos, quiero decir, todos se llaman igual, ¿Como los identifico?
Es decir, creo todos los objetos, eso se tiene que hacer sí o si, al menos la primera vez, y luego?

Un saludo y gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de giancarlo

Problema al actualizar informacion de objetos

Publicado por giancarlo (280 intervenciones) el 10/01/2016 23:17:29
Cuando usas me.controls.add agregas un control al formulario, si usas clear, limpias o los eliminas.

Para modificar necesitas identificar el control y cambiarle alguna propiedad, cuando usas dentro del for usas pb(i) as picturebox deberías cambiarle por pb as new picturebox además establecerle algún nombre pb.name="nombre"&i cuando hagas eso recién podrás usar un control y cambiarlo directamente

Fíjate si funciona controls(índice o "nombre").value en caso no funcione tendrías que usar algo como

1
2
3
4
5
For each elemento as control in me.controls
If elemento.name=nombre que buscas
Cambiar color
End if
End for

Estoy desde mi celular y no recuerdo muy bien el código exacto, pero espero darte alguna idea
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al actualizar informacion de objetos

Publicado por D.Gallego (11 intervenciones) el 10/01/2016 23:38:07
Buenas
No tenia ni idea que se pudiese hacer, me has abierto una gran cantidad de puertas :)
En cuento pueda lo pruebo y te comento, aunque tardare, porque ahora estaré liado, pero no me olvidaré de responderte.

Gracias y un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al actualizar informacion de objetos

Publicado por D.Gallego (11 intervenciones) el 12/01/2016 21:18:19
Buenas
He identificado los picturebox como me habías comentado, ahora se llamaran Estado1, Estado2, etc...
1
2
3
4
5
6
Dim pb As New PictureBox
                    pb.Name = "Estado" & i
                    pb.Location = New Point(Lx, Ly)
                    pb.Size = New Size(Sx, Sy)
                    pb.Image = Image.FromFile(".\Iconos\azul.png")
                    Me.Controls.Add(pb)

El problema es que ahora no se que como llamar a dichos controles para cambiarle las propiedades una vez creadas. Aquí me he quedado atascado. Solucionando esto, ya debería de funcionar. Luego quedaría limar cosillas.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Using cnn As New OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=.\A1.mdb")
            For Cuenta As Integer = 1 To Total
 
                Dim IPcadena As OleDbCommand
                IPcadena = New OleDb.OleDbCommand("SELECT IPEQUIPO FROM IP WHERE ID = " & Cuenta & " ", cnn)
                Dim IP As String = CType(IPcadena.ExecuteScalar, String)
                'MsgBox(IP)
                Dim value As Boolean = My.Computer.Network.Ping(IP)
                If value = True Then
                    pb.Image = Image.FromFile(".\Iconos\verde.png")
                Else
                    pb.Image = Image.FromFile(".\Iconos\rojo.png")
                End If
 
            Next
            Cuenta = 1
 
                End Using
¿Como deberia asignarlo? Así no funciona,
1
pb(Cuenta).Image = Image.FromFile(".\Iconos\verde.png")
y así tampoco:
1
pb & Cuenta.Image = Image.FromFile(".\Iconos\verde.png")
Gracias y un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al actualizar informacion de objetos

Publicado por D.Gallego (11 intervenciones) el 19/01/2016 20:15:36
En vez de usar ".Image" he usado ".backgroundimage"
Así lo he solucionado:
1
2
3
4
5
6
7
8
9
For Each ctrl As Control In Me.Controls
 
                            If TypeOf ctrl Is System.Windows.Forms.PictureBox Then
                                If ctrl.Name = "Estado" & Cuenta Then
                                    ctrl.BackgroundImage = Image.FromFile(".\Iconos\verde.png")
                                    ctrl.Size = ctrl.BackgroundImage.Size
                                End If
                            End If
Next

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar