nach Ping vorhandene Namen in DGV füllen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von tuvok.

    nach Ping vorhandene Namen in DGV füllen

    Hallo,
    ich will mir ne Art Verknüpfungsverwaltung bauen .. und möchte das in nem DGV nur die PCs angezeigt werden die auch Online sind.
    Alle PCNamen stehen in einer Datenbank die ausgelesen wird.

    Jetzt habe ich versucht, mit nem Backgroundworker das hinzubekommen.. aber ich verstehe den Fehler nicht wirklich oder ich verstehe den Sinn nicht so ganz..
    Wäre schön, wenn Ihr mir helfen könntet..

    VB.NET-Quellcode

    1. Private Sub VerkVerwaltung_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
    2. BackgroundWorker1.RunWorkerAsync()
    3. End Sub
    4. Dim übergabe1 As List(Of String) = New List(Of String)
    5. Dim übergabe2 As List(Of String) = New List(Of String)
    6. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    7. Dim PingPC() As String
    8. Dim PCBeschreib() As String
    9. cmd.CommandText = "select * from tbl_pcinfo Where NichtAnzeigen = '" & 0 & "' order by PCName"
    10. Try
    11. con.Open() 'Verbindung zur db öffnen
    12. reader = cmd.ExecuteReader()
    13. Dim zahl As Integer = 0
    14. Do While reader.Read()
    15. PingPC(zahl) = reader("PCName")
    16. PCBeschreib(zahl) = reader("PCBeschreibung")
    17. zahl = zahl + 1
    18. Loop
    19. reader.Close()
    20. con.Close()
    21. Catch ex As Exception
    22. MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    23. End Try
    24. For i As Integer = 0 To PingPC.Length - 1
    25. If My.Computer.Network.Ping(PingPC(i)) = True Then
    26. übergabe1.Add(PingPC(i))
    27. übergabe1.Add(PCBeschreib(i))
    28. End If
    29. Next
    30. End Sub
    31. Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    32. DataGridView1.Rows.Clear()
    33. DataGridView1.RowHeadersVisible = False 'markier Button ausblenden
    34. For Each _ZEILE As Integer In übergabe1
    35. DataGridView1.Rows.Add(_ZEILE, übergabe2.Item(_ZEILE))
    36. Next
    37. End Sub


    Bei Zeile 29 macht er nen Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. NullReferenceExeption
    PingPc ist ein Array.

    Da ein Array nicht dynamisch erweiterbar ist, ist es notwendig eine Arraygrenze oder Initialisierung anzugeben.
    Du legst aber gar nichts fest, sondern deklarierst lediglich das Array (Z. 8).
    Somit bleibt das Array leer.

    Benutze einfach eine List(Of String).
    Referenz: msdn.microsoft.com/en-us/library/6sh2ey19.aspx

    Liebe Grüße
    /nicht getestet
    m mit dem thema Arrays das is glaub net so mein Fall :)..

    VB.NET-Quellcode

    1. Private Sub VerkVerwaltung_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
    2. BackgroundWorker1.RunWorkerAsync()
    3. End Sub
    4. Dim übergabe1 As List(Of String) = New List(Of String)
    5. Dim übergabe2 As List(Of String) = New List(Of String)
    6. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    7. Try
    8. Catch ex As Exception
    9. MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    10. End Try
    11. Dim PingPC As String()
    12. Dim PCBeschreib() As String
    13. Dim myArrayList As New ArrayList
    14. cmd.CommandText = "select DISTINCT PCName, PCBeschreibung from tbl_pcinfo Where NichtAnzeigen Like '" & 0 & "' order by PCName"
    15. con.Open() 'Verbindung zur db öffnen
    16. reader = cmd.ExecuteReader()
    17. Dim zahl As Integer = 0
    18. If reader.hasRows() Then
    19. While reader.Read()
    20. myArrayList.Add(reader("PCName").ToString())
    21. Dim PCName As String() = CType(myArrayList.ToArray(GetType(String)), String())
    22. 'Dim PCName As String = reader("PCName").ToString()
    23. 'MessageBox.Show(PCName)
    24. PingPC(zahl) = PCName
    25. Dim PCBeschreibung As String = reader("PCBeschreibung").ToString()
    26. If Not IsNothing(PCBeschreibung) Then
    27. PCBeschreib(zahl) = PCBeschreibung
    28. Else
    29. PCBeschreib(zahl) = ""
    30. End If
    31. zahl = zahl + 1
    32. End While
    33. reader.Close()
    34. End If
    35. con.Close()
    36. For i As Integer = 0 To PingPC.Count - 1
    37. If My.Computer.Network.Ping(PingPC(i)) = True Then
    38. übergabe1.Add(PingPC(i))
    39. übergabe1.Add(PCBeschreib(i))
    40. End If
    41. Next
    42. End Sub
    43. Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    44. DataGridView1.Rows.Clear()
    45. DataGridView1.RowHeadersVisible = False 'markier Button ausblenden
    46. For Each _ZEILE As Integer In übergabe1
    47. DataGridView1.Rows.Add(_ZEILE, übergabe2.Item(_ZEILE))
    48. Next
    49. End Sub
    50. End Class


    er macht mir den Fehler Der Wert vom Typ "1-dimensionales Array von String" kann nicht in "String" konvertiert werden.
    also an dieser Stelle

    VB.NET-Quellcode

    1. PingPC(zahl) = PCName
    Was soll das Try-Catch bewirken?

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. Dim PingPC As New List(Of String)
    3. Dim PCBeschreib As New List(Of String)
    4. Dim myList As New List(Of String)
    5. 'Muss Distinct nicht ans Ende? Ist bei Linq jedefalls so.
    6. cmd.CommandText = "select DISTINCT PCName, PCBeschreibung from tbl_pcinfo Where NichtAnzeigen Like '0' order by PCName"
    7. con.Open() 'Verbindung zur db öffnen
    8. reader = cmd.ExecuteReader()
    9. If reader.hasRows() Then
    10. While reader.Read()
    11. myList.Add(reader("PCName").ToString())
    12. PingPC.Add(PCName)
    13. Dim PCBeschreibung As String = reader("PCBeschreibung").ToString()
    14. If Not String.IsEmpty(PCBeschreibung) Then
    15. PCBeschreib.Add(PCBeschreibung)
    16. Else
    17. 'Unnötig?
    18. PCBeschreib.Add(String.Empty)
    19. End If
    20. End While
    21. reader.Close()
    22. End If
    23. con.Close()
    24. For i As Integer = 0 To PingPC.Count - 1
    25. Übergabe.Add(PingPc(i))
    26. Übergabe.Add(PCBeschreib(i))
    27. Next
    28. End Sub

    Auch wenn mir den Sinn des Codes nicht einleuchtet.
    Jetzt kann man ihn wenigstens lesen.

    Was hast du eig. vor?
    /nicht getestet
    Tag,
    so habe es mal ausprobiert.. aber der Code ging so auch nicht.. *nachdenk*

    er sagt mir

    VB.NET-Quellcode

    1. PingPC.Add(PCName)

    Der Wert vom Typ "System.Windows.Forms.DataGridViewTextBoxColumn" kann nicht in "String" konvertiert werden.

    und hier

    VB.NET-Quellcode

    1. If Not String.IsEmpty(PCBeschreibung) Then

    "IsEmpty" ist kein Member von "String".

    ich glaube ich überdenke das ganze noch mal..
    ich möchte auf jeden Fall .. das ganze in einem Backgroundworker laufen lassen damit das Tool trotzdem noch arbeiten kann..
    und es soll halt die PC Namen aus der DB nach dem Pingen aussortieren und nur die PCs die Online sind in das DGV reinlesen
    Backgroundworker ist ziemlich ineffizient, weil der nur einen Thread bereitstellt.
    Wenn du also 50 PCs durchpingen willst - jeder mit TimeOut 2s, dann ist die Anzeige u.U. erst nach 100s vollständig.
    Stattdessen kannst du die 50Pings auch mit asynchronen Methoden abfahren, also parallel.
    Dann ist die Anzeige nach 2s komplett.

    gugge auch IPScanner - Post#2.

    tuvok schrieb:

    "IsEmpty" ist kein Member von "String".

    Ja, keine Ahnung welches Framework du nutzt.
    Nimm halt

    VB.NET-Quellcode

    1. Not [String] Is Nothing


    tuvok schrieb:

    Der Wert vom Typ "System.Windows.Forms.DataGridViewTextBoxColumn" kann nicht in "String" konvertiert werden.

    Zeig mal die Stelle, wo PcName deklariert wird.

    Aber vermutlich hat das Ganze sowieso kein Sinn.
    Mach es am Besten gleich richtig - Bau dir eine Klasse "Pc" mit den entsprechenden Eigenschaften & benutze TPL.
    /nicht getestet
    Zeig mal die Stelle, wo PcName deklariert wird.

    PCName = ne Spalte aus der Tabelle in meiner Datenbank

    Das andere Problem habe ich hiermit gelöst

    VB.NET-Quellcode

    1. If Not String.IsNullOrEmpty(PCBeschreibung) Then


    aber ich werde das ganze mal rausschmeissen, da es mir jetzt wieder neue Fehler aufzeigt..