Link aus der DB in ein ListView bringen und anklickbar machen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von xXGhostXx.

    Link aus der DB in ein ListView bringen und anklickbar machen

    Tach...,

    ich lasse derzeit eine bestimmte liste aus einer DB auslesen, das ohne Probleme. Nur möchte ich das wenn man auf ein Item in der ListView klickt das sich der Browser mit dem dazugehörigem Link aus der DB öffnet.

    wie die Liste derzeit aussieht:


    Jeder Eintrag soll einen bestimmten Link haben


    wie man den Link öffnet ist mir schon klar (Process.Start) nur ebend nicht wie man die Zwischen speichern kann und dann dem richtigem Ei targ zugeordnet werden kann.
    Was auch gut wäre wenn man quasi ein LinkLabel am ende des Eintrages machen könnte!

    Danke schonmal ;)
    Der ListView-Holzweg

    Die Tabelle ist so nicht sauber zu handeln. Die Datumse werden zB sicherlich falsch sortiert, weil Listview nur den Datentyp String kennt, und Datumse sind numal keine Strings.

    Wenn du deine Datenverarbeitung mit einem typisierten Dataset aufziehst, hätteste keine solche Probleme, auch nicht mit den Links.
    Üblicherweise besteht ein Link ja aus 2 Datenwerten: einmal die Ansicht (wo man draufklickst) und zum anderen die dahinterliegende Url.
    IM DatagridView wäre das einfach zb über eine LinkDatagridViewColumn zu erledigen, während Listview einfach nix entsprechendes auf Pfanne hat.
    So DataGridView ist fertig gebraten...

    nur fehlt noch das Gewürz^^ Der Link wird schon als Link dargestellt nur weiß ich keine richtige Methode um ihn zu öffnen. Ich hab es mit einem Process.Start(LinkDataGridViewTextBoxColumn.Text) im CellConentClick Event versucht jedoch kam eine Fehlermeldung
    Der Prozess kann nicht gestartet werden, da ein Dateiname nicht angegeben wurde.
    Oder hab ich einfach einen falschen Verweis beim Process.Start?

    xXGhostXx schrieb:

    So DataGridView ist fertig gebraten...
    hmm - aber die Hauptsache ist doch, die Datenverarbeitung mit einem typisierten Dataset aufzuziehen - hast du das schon fertig, und das DGV daran angebunden?? Das wäre verblüffend schnell, weil normalerweise haben die Leuts enorme Probleme bei der Umstellung der Denkgewohnheiten.
    bin beeindruckt! :thumbsup:

    nadenn - also im CellContentClick musste zunächst die Eventargs abprüfen, ob e.ColumnIndex auch wirklich die Link-Column addressiert. Und dann holstedir mit

    VB.NET-Quellcode

    1. dim rwBusiness As BusinessRow = Directcast(Directcast(BusinessBindingSource.Current, DataRowView),BusinessRow)
    die angeklickste BusinessRow.
    Und damit müsste

    VB.NET-Quellcode

    1. Process.Start(rwBusiness.Link)
    eiglich problemlos hinhauen.

    Also ich habe jetzt mal vorrausgesetzt, dass du die DataTable "Business" genannt hast, weil es scheint ja um Geschäfts-Abschlüsse zu gehen.

    Ausserdem musste vmtl. eine Imports-Anweisung auf das Dataset setzen, Ansonsten musste den BusinessRow-Typ vollqualifiziert angeben - das wird bisserl länglich.
    Also die DataTable heißt "dayzhandler"

    Ein Import ist schon vorhanden (ich hoffe der richtige)

    VB.NET-Quellcode

    1. Imports DayzHändlerStatus.dayzDataSet1


    Nur weiß ich gerade nicht wie ich das nicht wie ich das mit den EventArgs machen soll :|

    Aktuell sieht es so aus

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    2. Dim rwBusiness As dayzhandlerRow = DirectCast(DirectCast(DayzhandlerBindingSource.Current, DataRowView), dayzhandlerRow)
    3. Process.Start(rwBusiness.link)
    4. End Sub
    na, du enttäuschst mich ;)

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    2. If e.ColumnIndex <> 6 Then Return
    3. Dim rwBusiness As dayzhandlerRow = DirectCast(DirectCast(DayzhandlerBindingSource.Current, DataRowView), dayzhandlerRow)
    4. Process.Start(rwBusiness.link)
    5. End Sub


    Über die Benamung sollteste nochmal hirnen: Umlaute verursachen immer wieder mal Probleme, also

    VB.NET-Quellcode

    1. DayzHändlerStatus
    iwann wird das mal Ärger machen - gewöhn dir das besser gleich ab.
    rwBusiness darf dann auch nicht mehr so heißen, weil es ist ja eine dayzhandlerRow.

    Nun weiß leider kein Mensch auf der Welt ausser dir, sich etwas unter einem dayzhandler vorzustellen - lässt sich da nix besseres ausdenken?

    Und KlassenNamen würdich immer mit Großbuchstaben anfangen lassen, und ich bin da glaub nicht der einzige, der so denkt.

    Das sind aber alles Änderungen, die du am Dataset vornehmen mußt - die CodeNamen ergeben sich dann ja daraus.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Jaa ich steh zwischen Anfänger und Fortgeschrittener :D

    Nur hab ich das jetzt mal so über nommen aber einen Fehler gibts noch
    Der Wert vom Typ "System.Data.DataRowView" kann nicht in "DayzHändlerStatus.dayzDataSet1.dayzhandlerRow" konvertiert werden.
    edit: grr diese edits während ich am schreiben bin und sie nicht lese :D
    sorry - typischer Fehler, wenn ich aussm kopf schreib. Es muß heißen (achtung - ist auch aussm KOpf):

    VB.NET-Quellcode

    1. Dim rwBusiness As dayzhandlerRow = DirectCast(DirectCast(DayzhandlerBindingSource.Current, DataRowView).Row, dayzhandlerRow)


    edit: sorry wegen des Edits :D
    wie kommst du mit Dll-Projekten, Generica und Extension-Methods klar?
    Ich habe immer ein Helpers-Dll-Projekt eingebunden, mit folgenden BindingSource-Extensions (in Wahrheit sinds noch viel mehr):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Namespace System
    3. Public Module BindingSourceX
    4. ''' <summary>
    5. ''' provides a placeholder-syntax for filters. Sample: bs.FilterX("Datum >= ? And ? >= Datum", dtpVon.Value, dtpBis.Value)
    6. ''' </summary>
    7. ''' <exception cref="ArgumentException">expression contains more placeholders than values are passed</exception>
    8. <Extension()> _
    9. Public Sub FilterX(ByVal bs As BindingSource, ByVal expression As String, ByVal ParamArray values() As Object)
    10. Dim splits = expression.Split("?"c) ' identify placeholder '?'
    11. If splits.Count > values.Length + 1 Then Throw New ArgumentException( _
    12. "expression contains more placeholders than values are passed")
    13. For i = 0 To splits.Length - 2
    14. Dim val = values(i)
    15. Dim format = If(TypeOf val Is String, "'{0}'", If(TypeOf val Is Date, "#{0}#", "{0}"))
    16. splits(i) &= String.Format(Globalization.CultureInfo.InvariantCulture, format, val)
    17. Next
    18. bs.Filter = String.Concat(splits)
    19. End Sub
    20. ''' <summary> returnt die typisierte Datarow an aktueller Position - oder Nothing. </summary>
    21. <Extension()> _
    22. Public Function At(Of T As DataRow)(ByVal subj As BindingSource) As T
    23. Return DirectCast(subj.At(subj.Position), T)
    24. End Function
    25. ''' <summary>
    26. ''' returnt die typisierte Datarow am index. Bei ungültigem index Nothing (keine OutOfRange-Exception!)
    27. ''' </summary>
    28. <Extension()> _
    29. Public Function At(Of T As DataRow)(ByVal subj As BindingSource, ByVal index As Integer) As T
    30. Return DirectCast(subj.At(index), T)
    31. End Function
    32. ''' <summary>
    33. ''' returnt die Datarow am index. Bei ungültigem index Nothing (keine OutOfRange-Exception!)
    34. ''' </summary>
    35. <Extension()> _
    36. Public Function At(ByVal subj As BindingSource, ByVal index As Integer) As DataRow
    37. If index < 0 OrElse index >= subj.Count Then Return Nothing
    38. Return DirectCast(subj(index), DataRowView).Row
    39. End Function
    40. End Module
    41. End Namespace


    Weil diesen doppelten DirectCast finde ich ja sowas von gräuselig, und mithilfe der At-Extension ließe er sich folgendermaßen vereinfachen:

    VB.NET-Quellcode

    1. Dim rwBusiness = DayzhandlerBindingSource.At(Of dayzhandlerRow)


    (Die Filter-Extension wird übrigens in DataExpressions vorgestellt.)