Von Listview zu Gridview Hyperlink problem

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Von Listview zu Gridview Hyperlink problem

    Guten Abend,

    Ich bin neu hier bei Euch und könnte Eure Hilfe gebrauchen.

    Ich habe mir erfolgreich eine Form erstellt mit einer Listview mit 2 Spalten und zum testen hatte ich mir diverse Suchmaschinen hinzugefügt.
    Mit der Sub ListView1_Click kann ich sie auch aufrufen.
    Im laufe der Zeit stellte ich fest das man die Listview nicht so gut konfigurieren kann z.B Spalten ausblenden.
    Im Internet und auch hier im Forum wird man dazu angehalten besser eine DataGridview zu nehmen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub CheckBox3_Click(sender As Object, e As EventArgs) Handles CheckBox3.Click
    3. With ListView1.Items
    4. SubItem = .Add("Hyperlink1")
    5. SubItem.SubItems.Add("https://www.google.de")
    6. SubItem = .Add("Hyperlink2")
    7. SubItem.SubItems.Add("https://duckduckgo.com")
    8. SubItem = .Add("Hyperlink3")
    9. SubItem.SubItems.Add("https://www.bing.com")
    10. SubItem = .Add("Hyperlink4")
    11. SubItem.SubItems.Add("https://de.yahoo.com")
    12. End With
    13. End Sub
    14. Private Sub ListView1_Click(sender As Object, e As EventArgs) Handles ListView1.Click
    15. Dim extern As Process = New Process
    16. extern.StartInfo.FileName = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
    17. extern.StartInfo.WindowStyle = ProcessWindowStyle.Normal
    18. extern.StartInfo.Arguments = ListView1.SelectedItems(0).SubItems(1).Text
    19. extern.Start()
    20. End Sub
    21. End Class


    Das habe ich dann auch getan. Das befüllen der Gridview habe ich umsetzen können.
    Und mit der Checkbox wird es ausgelöst.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    3. 'Einstellungen vornehmen
    4. With DataGridView1
    5. .AllowUserToAddRows = False ' User kann keine Zeilen hinzuf.
    6. .RowHeadersVisible = False ' Überheader ausblenden
    7. .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
    8. End With
    9. End Sub
    10. Private Sub CheckBox3_Click(sender As Object, e As EventArgs) Handles CheckBox3.Click
    11. With DataGridView1
    12. .Columns.Clear()
    13. 'Spalten fürs DGV erstellen
    14. .Columns.Add("Spalte1", "Suchmaschine")
    15. .Columns.Add("Spalte2", "Link")
    16. 'DGV füllen
    17. .Rows.Add("Google")
    18. .Rows(0).Cells(1).Value = "https://www.google.de"
    19. .Rows.Add("Bing")
    20. .Rows(1).Cells(1).Value = "https://www.bing.com"
    21. .Rows.Add("Yahoo")
    22. .Rows(2).Cells(1).Value = "https://de.yahoo.com"
    23. .Rows.Add("Duck")
    24. .Rows(3).Cells(1).Value = "https://duckduckgo.com"
    25. End With
    26. End Sub
    27. End Class


    Ich dachte ich könnte das starten der Hyperlinks in der Gridview genauso lösen wie mit der Listview.
    Klick in die Spalte 1 und Wert aus der Spalte 2 übernehmen.
    Da habe ich mich getäuscht. Ich bekomme immer den Fehler Datei nicht gefunden.

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
    2. Dim extern As Process = New Process
    3. extern.StartInfo.FileName = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
    4. extern.StartInfo.WindowStyle = ProcessWindowStyle.Normal
    5. extern.StartInfo.Arguments = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).ToString
    6. extern.Start()
    7. End Sub


    Meine Vermutung ist das diese zeile falsch ist:

    VB.NET-Quellcode

    1. extern.StartInfo.Arguments = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).ToString


    Wer von Euch kann mir dieses Problem bitte lösen?

    Vielen Dank im vorraus

    LG Poeci
    Willkommen im Forum.

    Poeci schrieb:

    Klick in die Spalte 1 und Wert aus der Spalte 2 übernehmen.
    Da der Satzbau etwas … merkwürdig ist, setz ich hier mal das Spekulatiusbacken an: Du klickst auf die Zelle in Spalte 1 (mit der Aufschrift Google) und gehst davon aus, dass bei extern.StartInfo.Arguments nun plötzlich https://www.google.de drinsteht? Dann hast Du falsch gedacht, wohl weil Du es nicht geprüft hast (Thema Debugging). Woher soll der Compiler wissen, dass Zelle#1 und #2 in Zusammenhang stehen? Da müsstest Du schon schreiben

    VB.NET-Quellcode

    1. DataGridView1.Rows(e.RowIndex).Cells(1).ToString
    Unter der Voraussetzung, dass e.ColumnIndex 0 ist! Zu Prozedurbeginn prüfen!

    btw. sowas
    DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).ToString
    kannst Du mit
    DataGridView1.Item(e.ColumnIndex, e.RowIndex).ToString
    oder ggf. (!, haut zusammenhangsbedingt nicht immer hin)
    DataGridView1.CurrentCell
    ersetzen. Ist kürzer
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Auch hier wäre eine Objektliste als Datenquelle sehr komfortabel. Die Logik kann dann im jeweiligen Objekt erfolgen, ohne das man mit irgendwelchen Zellen rumfummeln muss.

    Klasse Suchmaschine
    Property Name (String)
    Property URL (String)
    Property Argument (String)
    Property Checked (Boolean)

    Für jede Suchmaschine eine neue Instanz der Klasse erzeugen, mit Werten befüllen und einer List (Of Suchmaschine) hinzufügen. Diese Liste dann dem Grid als Datenquelle geben.

    Vom Setter der Property „Checked“ aus kann man dann, sofern True, den URL Aufruf machen.

    Tadaaa Businesslogik und Oberflächlich getrennt und kein cell gewurschtel mehr.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Guten Morgen,

    Vielen Dank für Eure Antworten.

    @ VaporiZed

    VaporiZed schrieb:


    Da müsstest Du schon schreiben

    VB.NET-Quellcode

    1. DataGridView1.Rows(e.RowIndex).Cells(1).ToString



    Ich habe mir ein paar Variablen angelegt und mit Haltepunkte habe ich es dann herausgefunden.
    Mit folgender Zeile funktioniert es. Das Value ist die Lösung.

    VB.NET-Quellcode

    1. DataGridView1.Rows(e.RowIndex).Cells(1).Value.ToString()


    Also für die Zukunft werde ich erst mit den Haltepunkten was ausprobieren.
    Ich hätte das gestern auch ohne Euch zuschreiben herausfinden können.

    Trotzdem vielen Dank für Deinen Tipp.

    @mrMo

    Werde ich mir mal anschauen habe zwar noch keine Ahnung von Klassen kann aber bestimmt nicht schaden.

    Nochmals vielen Dank für die Unterstützung.

    LG Poeci
    X/
    Hab ich doch glatt einfach den Fehler (= Zeile ohne .Value) übernommen und daran rumgedoktort.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Einfachste Variante:
    Du haust Dir ein leeres DGV namens DeinDGV auf's Form und schreibst in den Code:

    VB.NET-Quellcode

    1. Public Class Form1 'oder wie immer Deine Form-Klasse heißt
    2. Private ReadOnly Objekte As New List(Of Objekt)
    3. Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Objekte.Add(New Objekt With {.ID = 1, .Name = "Foo"})
    5. Objekte.Add(New Objekt With {.ID = 2, .Name = "Bar"})
    6. Objekte.Add(New Objekt With {.ID = 3, .Name = "Bazz"})
    7. DeinDGV.DataSource = Objekte
    8. End Sub
    9. End Class
    10. Friend Class Objekt
    11. Property ID As Integer
    12. Property Name As String
    13. End Class
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.