mehrere Listboxen mit einer Scrollbar bewegen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von bitmonk.

    mehrere Listboxen mit einer Scrollbar bewegen

    Guten Morgen,

    ich bin kein Spezialist darum wende ich mich an euch. Folgendes Problem:

    Ein VB Programm mit Datenbankanbindung gibt die bezogenen Daten (= 8 Spalten) in acht Listboxen, die nebeneinander liegen, aus.

    (Man könnte dies auch ein einer breiten Listbox machen, jedoch wirkt dass sehr unübersichtlich)

    Mein Wunsch wäre mit den acht Boxen zu arbeiten, jedoch sollte es die Möglichkeit geben diese alle

    paralell über eine Scrollbar zu bewegen. Dies wäre gut da es keinen Sinn macht einzelne Boxen zu bewegen da

    dadurch natürlich die Datensätze nicht mehr zusammenhängend dargestellt werden.

    Wie lässt sich soetwas realisieren? Eine extra "Haupt-"Scrollbar implementieren? Die anderen irgendwie parallel schalten?

    Danke euch für Tipps!

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

    Pack Deine ListBoxen alle in ein Panel und gib diesem die Property AutoScroll = True.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hey Rod,

    danke schon mal für deine Hilfe. Habe das Panel angelegt und die Boxen reingepackt.

    Nachdem ich dann die Autoscrollfunktion auf true gesetzt habe erschien am unteren Rand eine horizontale

    Scrollbar. Ich brauch aber eine links oder rechts mit der ich vertikal scrollen kann...

    Sollte doch irgendwie klappen order?
    Sieh Dir mal die Panel.AutoScrollMargin-Property an, trage da einen sinnvollen Wert für Height ein, dann scrollt es.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ...hatte inzwischen auch eine vertikale Scrollbar hergezaubert indem ich das Panel vom Height her kleiner gemacht habe als

    meine Listboxen. Leider aber ist das nicht die Lösung meines Problems. Evtl. habe ich mich nicht ganz klar ausgedrückt.

    Ich will die Inhalte meiner Listboxen mit einer Scrollbar parallel durchscrollen können. Im Moment ist es so das ich mit der Panel-

    Scrollbar die 20 cm Höhe meiner Listboxen rauf und runter fahren kann, leider aber nicht deren Inhalt. Da es sich um Daten einer Datenbank handelt ist dieser

    weitaus umfangreicher und kann nicht in den 20 cm der Listboxen dargestellt werden.

    D.H. ich will den Inhalt scrollen und nicht die äußere Form....



    Danke schon mal!
    Hm mir kommt vor du hast das falsche Steuerelement...
    Wenn du 2 Listboxen gleichzeitig scrollen willst dann wäre es doch das einfachste das in 1 Steuerelement zu machen oder?
    Hierbei bietet sich Listview (Listbox mit mehreren Spalten) oder noch besser da du auf eine Datenbank zugreifst ein DataGridView an.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    ...ja, diese Listview ist wohl das tool das benötigt wird.

    Habe eine angelegt und versucht diese mit Daten zu füllen. Leider klappt das aber nicht.

    Bei den Listboxen hatte ich folgenden Code:



    Try

    con.ConnectionString = _
    "Server=FF-PC-888\SQLEXPRESS;Database=SAM;Trusted_Connection=True;"
    cmd.Connection = con

    cmd.CommandText =
    "select * from status"
    con.Open()

    reader = cmd.ExecuteReader()

    ListBox1.Items.Clear()

    ListBox2.Items.Clear()

    ListBox3.Items.Clear()

    ListBox4.Items.Clear()

    ListBox5.Items.Clear()

    ListBox6.Items.Clear()

    ListBox7.Items.Clear()

    ListBox8.Items.Clear()

    ListBox9.Items.Clear()

    ListBox10.Items.Clear()

    ListBox11.Items.Clear()

    arr.Clear()


    DoWhile reader.Read()
    ListBox1.Items.Add(reader("FinkSNr"))ListBox2.Items.Add(reader("SNr"))
    ListBox3.Items.Add(reader("Datum"))ListBox4.Items.Add(reader("Zeit"))
    ListBox5.Items.Add(reader("Scanort"))ListBox6.Items.Add(reader("Scanart"))
    ListBox7.Items.Add(reader("Bearbeiter"))ListBox8.Items.Add(reader("Status"))
    ListBox9.Items.Add(reader("Partner"))ListBox10.Items.Add(reader("Nummer"))
    ListBox11.Items.Add(reader("Kommentar"))

    Das mit ...Items.Add() klappt bei den Colums zum befüllen nicht. Kann mir da jemand sagen wie man die einzelnen Colums befüllen kann?
    Oder soll ich das im Datenbanken Forum posten?
    Ich hab für das Befüllen einer Listview eine Methode:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. doLvwAddItem(ListView1, "Spalte 1", "Spalte 2", "Spalte 3")
    3. End Sub
    4. ''' <summary>
    5. ''' Fügt einen neuen Listvieweintrag hinzu
    6. ''' </summary>
    7. ''' <param name="lvw">Name der Listview welche bearbeitet werden soll</param>
    8. ''' <param name="szText">Array mit Daten</param>
    9. ''' <remarks></remarks>
    10. Public Sub doLvwAddItem(ByVal lvw As ListView, ByVal ParamArray szText() As String)
    11. With lvw.Items
    12. ' 1. Eintrag hinzufügen
    13. With .Add(szText(0))
    14. If szText.Length > 1 Then
    15. ' String-Array für die weiteren Zellen erstellen...
    16. Dim SubItems(szText.Length - 1) As String
    17. Array.Copy(szText, 1, SubItems, 0, szText.Length - 1)
    18. ' ... und diese via AddRange dem ListView hinzufügen
    19. .SubItems.AddRange(SubItems)
    20. End If
    21. End With
    22. End With
    23. End Sub


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Kannst Du vllt. mal einen Screenshot Deines Programmes posten?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    [/url][/img]



    ^^ Hier mal ein Screenshot. Zur Erläuterung: Es geht um Pakettrackingdaten verschiedener Partner/Dienstleister. Diese haben wir zunächst in

    eine zentrale DB importiert. Nun soll dieses VB Programm als ein Sendungsmonitor/Verwaltungsprogramm dienen.

    D.H. die Daten der DB können mit verschienden (SQL)Filtern dargestellt werden, z.B eine Übersicht, sortiert nach Partnern oder alle

    Pakete bei denen es Probleme gibt etc... Dazu noch eine Änderungs/Kommentarfunktion (das sind die Textboxen oben) und eine Suchfunktion, das wars auch schon.

    Im Prinzip funtkioniert das auch schon alles, nur das mit den Listboxen ist einfach unpraktisch da ich Sie nur einzeln scrollen kann, was natürlich keinen

    Sinn ergibt....



    Bin gerade dabei die Methode von fichz mit der Listview zu testen (Ist hier im Screenshot noch nicht zu erkennen)
    danke für den Link Rob. Habe es zunächst mit der Listview wie fichz beschrieben versucht, habe es aber bislang nicht hinbekommen.

    Jetzt habe ich in deinem Link die Anleitung entdeckt wie man mehrere Listboxen parallel scrollen kann.

    Bei der Eläuterung habe ich aber schon gleich zu Beginn Probleme (wie gesagt, bin kein Programmier-Spezialist) :



    Erstellen Sie ein neues Projekt und platzieren auf die Form drei ListBox-Controls als Control-Array (List1(0), List(1) und List1(2)). Fügen Sie nachfolgenden Code zunächst in ein Modul ein:



    Option Explicit ' Benötigte API-Deklarationen

    Private Declare Function SendMessage Lib "user32" _

    Alias "SendMessageA" ( _

    ByVal hwnd As Long, _

    ByVal wMsg As Long, _

    ByVal Param As Long, _

    lParam As Any) As Long



    Private Const LB_SETCURSEL = &H186

    Private Const LB_SETTOPINDEX = &H197



    Was ist mit "ListBox-Controls als Control-Array (List1(0), List(1) und List1(2))." gemeint bzw was ist zu tun?

    Und an welcher Stelle im Code soll dieser Teil eingebaut werden? Er spircht hier von einem Modul das zunächst erstellt werden muss....
    Mach Dir bitte zunächst ein separates Testprogramm für nur dieses Problem!
    Da hast Du die VB5, VB6-Version erwischt.
    Nimm mal diesen Link.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen herzlichen Dank euch allen, es funktioniert nun. Bin nun bei meiner Variante mit den

    mehreren Listboxen geblieben da die Programmierung schon relativ weit vorangeschritten war und es außerdem für diesen

    Zweck auch ganz praktisch ist. Für die Zukunft merke ich mir das aber mal mit Listview und dem Grid.

    Habe es num mit dem Timer-Objekt Timer wie in dem Link von Rod beschrieben gelöst.

    Bin richtig Happy gerade, dachte heute schon dass das nichts wird... ;)
    Fein.
    Kannst Du bitte mal ein Stück Code posten, der richtig funktioniert?
    Dann wäre dies ein echt guter und zitierbarer Thread.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    bitmonk schrieb:

    nur den Teil mit der Scrollbarsyncronisation
    , das ist Inhalt dieses Threads.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, hier der Code um die Scrollbars zu syncronisieren (funktioniert wenn man an eine Stelle klickt wie auch wenn man einfach durchscrollt)

    Bitte beachten das die Listboxen jeweils mit der gleichen Anzahl von Datensätzen/Zeilen gefüllt sein müssen...
    In diesem Beispiel wird mit 3 Listboxen gearbeitet. Im Prinzip werden Box 2 und 3 immer mit der Position von Listbox 1 vergleichen und ggf. sofort angepasst.

    D.H. in diesem Fall ist die Listbox1 und deren Scrollbar das "Steuerelement" :


    VB.NET-Quellcode

    1. Public Class Form1
    2. 'Timer deklarieren
    3. Dim WithEvents oTimer As Timer
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
    5. ' Timer startenoTimer = New Timer
    6. oTimer.Interval = 50
    7. oTimer.Start()
    8. End Sub
    9. Private Sub oTimer_Tick(ByVal sender AsObject, ByVal e As System.EventArgs) Handles oTimer.Tick
    10. 'Scrollbarsyncro
    11. With ListBox1
    12. ' TopIndex
    13. If .TopIndex <> ListBox2.TopIndex Then
    14. ListBox2.TopIndex = .TopIndexEndIf
    15. ' SelectedIndex
    16. If .SelectedIndex <> ListBox2.SelectedIndex Then
    17. ListBox2.SelectedIndex = .SelectedIndex
    18. End If
    19. End With
    20. With ListBox1
    21. ' TopIndex
    22. If .TopIndex <> ListBox3.TopIndex Then
    23. ListBox3.TopIndex = .TopIndexEndIf
    24. ' SelectedIndex
    25. If .SelectedIndex <> ListBox3.SelectedIndex Then
    26. ListBox3.SelectedIndex = .SelectedIndex
    27. End If
    28. End With
    29. End Sub
    30. End Class


    Wenn man mehr Listboxen hat müssen diese jeweils wie hier im Beispiel (2 und 3) mit der Listbox1 verglichen werden. Elegant wäre das wohl mit einer Schleife.... ;)

    Edit by nikeee13:
    Bitte den VB-Tag verwenden! VB-Tag eingefügt.

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

    bitmonk schrieb:

    Ein VB Programm mit Datenbankanbindung gibt die bezogenen Daten (= 8 Spalten) in acht Listboxen, die nebeneinander liegen, aus.
    kommt mir vor wie fast absurder Quatsch.
    Du hast eine Tabelle, zeigst sie aber nicht im Tabellen-Anzeige-Control an - ich rede vom Datagridview.

    Und wenn du Ado.Net für dich arbeiten lässt, also ein typisiertes Dataset erstellst und befüllst, dann kannst du das mit glaub 5 Zeilen Code lösen. Bei allen anneren Vorgehensweisen (insbes. ListView-Holzweg) wirst du dich vmtl. in 3 Jahren selber fragen "Was zum Kuckuck habich da denn verzapft?"

    Ach so, Tut, wies gehen könnte: "Datenbank in 10 Minuten" auf Movie-Tuts
    Edit by ErfinderDesRades: -> unnötiges Vollzitat entfernt

    Ja, du hast recht. Wie du dem Thread entnehmen kannst habe ich auch gemerkt das ein Grid View das richtige Tool gewesen wäre.

    Da ich aber nicht viel Ahnung von VB hatte und mein Programm schon recht weit fortgeschritten war, habe ich es über die Synchronisation

    der einzelnen Listviews versucht. Zugegeben, hätte man wohl auch anders lösen können, evtl ist aber diese Lösung aber für jemand anderen

    von Nutzen bei dem dieser Weg Sinn macht...

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