ListView Arry Schleife

  • Allgemein

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Mangafreak1995.

    ListView Arry Schleife

    Hi,

    ich programmiere einen Programm Restarter, weil manche Server Dienste auf dem V-Server immer nach ca. 10Std ausgehen.

    da ich aber mal neue Server am laufen habe und mal alte rausnhäme, müchte ich einen Server Restarter schreiben, bei dem man die Server in eine ListView einfügen und entfernen kann.
    Das einfügen und entfernen funktioniert schon mal, aber ich möchte Prüfen, ob der Prozess (Server) schon läft und dazu brauche ich den Namen (String) des Servers, welchen ich aus der ListView bekomme.
    Ich möchte auch alle Items (Servereinträge) prüfen, ob die Sevrer laufen.

    dazu benutze ich einen Timer
    Private i As Integer
    Timer1_Tick
    If Process.GetProcessByName(Was muss ich hier eintragen, damit ich den Text des Items(i) bekomme?).Exists = False Then
    Process.Start(Was muss ich hier eintragen, damit ich von dem Selbem Item das SubItem.Text bekomme?)
    i = i + 1
    End Sub
    End If

    Das mit dem Process.... ist noch falsch, werde es nachher googeln.
    also jetzt mal für deutlich (xD) :
    du hast nen Server
    mit Programmen
    wovon welche ca. alle 10 Std abschmieren
    und du willst überprüfen ob das Programm noch läuft oder nicht =? und wenn nicht dann wieder starten ?

    mach ne Datei wo alle exe-files + Pfad aufgelistet sind, pack die zu deinem Prog und nen die ProgList.txt
    weiteres findest du hier:
    mehr Infos :D

    VB.NET-Quellcode

    1. Public MyProgs as new List (of String)
    2. Public Sub LoadThem
    3. Dim cur as new list (of string)
    4. cur.AddRange(io.file.ReadAllLines(application.Startuppath &"\ProgList.txt"))
    5. For c as Integer = 0 to cur.Count -1
    6. If io.path.getextension(cur(c)) = ".exe" Then MyProgs.Add((cur(c)))
    7. Next
    8. Timer1.Interval = 100000 ' jede 10 Sekunden reicht eig ... wenn nich höher schrauben (bzw. kleiner)
    9. Timer1.Start()
    10. End Sub
    11. Private Sub Timer1_Tick(sender as object, e as system.eventargs) Handles Me.Timer1.Tick
    12. For v as integer = 0 MyProgs.Count - 1
    13. if Not(Process.GetProcessesByName(io.path.getfilenamewithoutextension(MyProgs(v))).Length > 0) Then Process.Start(MyProgs(v))
    14. Next
    15. end Sub
    Das ist auch eine Idee :), ich wollte es mit dem ListView machen, weil es meiner Meinung nach besser aussieht und handhablich ist. Zudem lerne ich dadurch den Umgang mit ListViews ^^.

    Dennoch danke für deinen Vorschlag, wenn es mit der ListView nicht klappt, werde ich diesen verwenden :)
    ist alles ausm Kopf geschrieben ... ich kann dir das nicht garantieren ob alles funktioniert
    du kannst ja von jedes List (of String)-Item dem Listview hinzufügen
    wenn du die Programmicons als Bilder in der ListView haben willst sprech mich dazu einfach an
    Habe es schon versucht über
    Private List(Arry) As String
    List(GeradeArry) = Name
    List(Name+1Arry) = Pfad

    das wird auch unter Garantie funktionieren, allerdings habe ich da Probleme beim entfernen der Items, und zwar wollte ich dies so machen.

    Zum Entfernen aus der ListView verwende ich
    ServerList.Items.Remove(ServerList.SelectedItems(0))

    ich muss diese aber ebenfalls aus der List entfernen und dann die List neu sortieren, damit es keine Lücken gibt.
    Das Sortieren ist nicht so schwierig, die Lücken würden jetzt auch nicht so dramatisch sein.
    Problem ist aber, ich weis nicht, wie ich den Index des entferneten Items herausbekomme, habe es schon durch

    List(ServerList.SelectedItems(0).Index) = ""
    versucht, aber dies funktioniert nicht.
    Entferne nur das Item aus der ArrayList und lade dann die Listview neu
    Entferne nur das Item aus der ArrayList und lade dann die Listview neu


    Wie kann ich erkennen, welches Item aus der ArryList entfernt werden soll?

    ArryList(2 * ListView.Index des selectierten Items wird benötigt) = ""
    ArryList(2 * ListView.Index des selectierten Items wird benötigt + 1) = ""

    Mein Quellcode sieht zurzeit so aus:

    Public Class frmMain
    Private Sub TrayIcon_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TrayIcon.MouseDoubleClick
    WindowState = FormWindowState.Normal
    End Sub
    Private Sub AddServerToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddServerToolStripMenuItem.Click
    Dim ofd As New OpenFileDialog
    With ofd
    .Filter = "Executable File | *.exe"
    .ShowDialog()
    If .CheckFileExists = True Then
    ServerList.Items.Add(.SafeFileName).SubItems.Add(.FileName)
    End If
    End With
    End Sub

    Private Sub RemoveServerToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RemoveServerToolStripMenuItem.Click
    ServerList.Items.Remove(ServerList.SelectedItems(0))
    End Sub

    Private Sub ClearListToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ClearListToolStripMenuItem.Click
    ServerList.Items.Clear()
    End Sub
    Private Sub frmMain_SizeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.SizeChanged
    ServerList.Size = New Size(Me.Size.Width - 16, Me.Size.Height - 85)
    End Sub
    End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ViktorS“ ()

    indem du es weißt
    wenn du díe Listview auf den Array aufbaust dann sind sie in genau der Reihenfolge
    Jo das stimmt, ich kann die Spur (Private Spur As Byte z.B.) immer beim hinzufügen eines Items auch erhöhen, aber es wird nicht immer das letzte oder erste Item entfernt, sondern es wird ein Item selektiert und entfernt, mir fällt jetzt nichts ein, wie man die Spur daran anpassen soll.
    Beispiel:

    VB.NET-Quellcode

    1. Dim DeinArray() as <Type> = {<Value1>,<Value3>,<Value2>,<Value5>}
    2. Public Sub LoadThem
    3. Dim j as new List (of <Type>)
    4. j.AddRange(DeinArray)
    5. Listview1.Items.Clear
    6. For c as integer = 0 to j.Count - 1
    7. Listview1.Items.Add(Cstr(j(c)))
    8. Next
    9. End Sub


    das sieht dann so aus

    <Value1>
    <Value3>
    <Value2>
    <Value5>

    VB.NET-Quellcode

    1. Public Sub Delete(x as integer)
    2. j.RemoveAt(x)
    3. LoadThem()
    4. End Sub

    x = 2

    <Value1>
    <Value3>
    <Value5>

    und Mit Add genauso... ok ?
    Jo das verstehe ich, nur wie kann man erkennen, welches Item gerade selektiert ist, denn das Item wird über Rechtsklick entfernt, und das Item wird vom USer per Maus selektiert und das Selektierte Item muss einen Index haben, den man auch als Arry benutzen kann, allerdings weis ich nicht, wie ich an diesen Index herankomme.

    Eins ist zumindest sicher, wenn ich in
    Public Sub Delete(x as integer)
    j.RemoveAt(x)
    LoadThem()
    End Sub

    für x = ListViewx.Items.Remove(ListViewx.SelectedItems(0).Index einsetze, dann wird es nicht funktionieren. (Schon geprüft^^)
    wenn du das Selektieren von nur einem Item zulässt :

    VB.NET-Quellcode

    1. Listbox1.SelectedIndex

    wenn du das Selektieren von mehreren Items zulässt :

    VB.NET-Quellcode

    1. For Each i as Integer in Listbox1.SelectedIndices
    2. '...
    3. Next


    ganz einfach ^^ ... musst nur rumprobieren
    Habs rumprobiert und bin dabei auf die Antwort von meiner als aller erstes gestellten Frage gestoßen^^, habe dabei aber wiederrum ein Problem.

    Ich habe zum Versuch volgenden Quellcode aufgeschrieben:

    Quellcode

    1. Private Sub tRandom_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tRandom.Tick
    2. start:
    3. i = 0
    4. MsgBox(ServerList.Items(i).Text)
    5. Try
    6. i = i + 1
    7. MsgBox(ServerList.Items(i).Text)
    8. Catch ex As Exception
    9. GoTo start
    10. End Try
    11. End Sub


    Aber es gibt dabei Probleme, und zwar, wenn ich das Arry (i) bei 0 zählen lasse, dann zeigt es mir bei jedem Aufruf den Text von dem Items mit dem Index 0. Wenn och es hingegen bei 1 zählen lasse, dann zeigt es mir alles so an, wie es sollte, das Problem dabei ist dan nur, es überspringt das Item mit dem Index 0.

    Dieses Ereignis trift auf, wenn ich

    Quellcode

    1. Private Sub tRandom_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tRandom.Tick
    2. MsgBox(ServerList.Items(i).Text)
    3.    
    4. i = i + 1
    5.    
    6. End Sub
    dan wiederholt es ständig den index 0
    aber wenn ich dies mache:

    Quellcode

    1. Private Sub tRandom_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tRandom.Tick
    2.   i = i + 1MsgBox(ServerList.Items(i).Text)   
    3. End Sub
    dan zählt es vom Index 1 hoch, aber es berücksichtigt auch vom logischem her sofort sichtbar den Index 0 nicht mehr.
    füg beim letzteren noch i = -1 ein ^^
    dann zählt er auf 0 und fängt da an
    So ändlich fiunktioniert es komplett, das warnv nämlich schon die Lösung, ich hatte nur einen Logik Fehler drinn, und zwar wird der Index per MsgBox angezeigt und wen ich nicht auf OK klicke, dann erhöht sich der counter i auch nicht^^, dashier ist jetzt die lösung:

    Quellcode

    1. Private Sub tRandom_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tRandom.Tick
    2. If i < ServerList.Items.Count Then
    3. lblStatus.Text = ServerList.Items(i).Text & " " & i
    4. i += 1
    5. Else
    6. i = 0
    7. End If
    8. End Sub


    und das Thema ist

    ######Closed#########

    Danke für die Hilfe an alle :)