Je nach vorauswahl in einem DGV bei User die dem User zugeteilten Pc`s in einer Combobox anzeigen lassen

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Je nach vorauswahl in einem DGV bei User die dem User zugeteilten Pc`s in einer Combobox anzeigen lassen

    Hi erstmal, Es ist eine Access Datenbank

    Also mein Problem ist Folgendes:
    Ich habe ein DataGridView das über eine Datenbank befüllt wird. und in diesem DGV einige Spalten eine davon ist "User" und die andere nennt sich "PcID"(Also PC01,PC02 etc.), In der Datenbank kann Eine "PcID" mehrere "User" haben und genauso andersrum
    also eine Many to Many Relation diese haben noch eine Zwischentabelle namens "UserPcIDs" in der die PcIDs und User die diese benutzen dargestellt sind(Bilder seht ihr unten). Nun möchte ich das sobald ich auf einen User im DGV klicke links neben dem DGV eine Combobox wo in der ersten Spalte, also die Spalte die man auch sieht wenn die Combobox zugeklappt ist, die PcIDs aufgelistet werden also das in der Combobox alles in etwa so steht: PC01;PC05;PC06 und halt so weiter falls der User z.B noch mehr Computern zugeteilt ist. Sobald ich ich die Dropdownliste der Combobox öffne möchte ich das dort in dieser Combobox ALLE PcIDs der Datenbank aufgelistet sind und das die PcIDs die dem User zugeteilt sind in irgendeiner Weise Grün markiert werden.

    Ich vermute das dass ganze über einen Inner Join funktioniert leider habe ich keinerlei Idee wie ich das ganze genau umsetzen soll bzw. kann.
    Sitze schon seit drei Tagen an der Geschichte und deshalb bitte ich evlt um einen kleinen Denkanstoßer, Tipps oder Erklärungen oder auch Codeschnippsel die mir eventuell in Richtung Verständnis helfen könnten.

    Bin für alles Dankbar :D
    MFG Fabian

    !Dennoch bitte ich mir nicht zu sagen mach es doch über den Designer mit z.B dem m : n oder Joining View oder sonstigem. Würde das hier gerne ohne die Assistenten großartig zu nutzen lösen!


    Bilder:

    Designer mit Combobox:





    Tabellen in Access:



    Ich würde es in etwa so machen:
    Man befülle zwei Listen
    - Liste 1 -> Alle PCs
    - Liste 2 -> PCs des Users

    Liste 1 als ItemCollection der ComboBox

    Im DrawItem-Event der Combobox abfragen ob das Item in Liste 2 ist. (ComboBox.DrawMode auf OwnerDrawFixed oder OwnerDrawVariable wechseln)
    Falls ja, den Hintergrund Grün färben.

    Hier einmal ein Beispiel (ComboBox1.DrawMode auf OwnerDrawFixed oder OwnerDrawVariable zu wechseln)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim UsersPCsList As New List(Of String)
    3. Dim AllPCsList As New List(Of String)
    4. Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    5. For i As Integer = 1 To 10
    6. AllPCsList.Add("PC" & i.ToString("00"))
    7. Next
    8. UsersPCsList.AddRange({"PC05", "PC06", "PC07"})
    9. ComboBox1.Items.AddRange(AllPCsList.ToArray)
    10. Me.BeginInvoke(New SetTextDelegate(AddressOf Me.SetText))
    11. End Sub
    12. 'You need to change ComboBox.DrawMode to OwnerDrawFixed/OwnerDrawVariable to fire the comboBox_DrawItem
    13. Private Sub ComboBox1_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ComboBox1.DrawItem
    14. e.DrawBackground()
    15. If Not e.Index = -1 Then
    16. Dim myItemText As String = CType(sender, ComboBox).Items(e.Index).ToString()
    17. If UsersPCsList.Contains(myItemText) Then
    18. e.Graphics.FillRectangle(New SolidBrush(Color.Green), e.Bounds)
    19. e.Graphics.DrawString(myItemText, e.Font, New SolidBrush(Color.White), e.Bounds)
    20. Else
    21. e.Graphics.DrawString(myItemText, e.Font, New SolidBrush(e.ForeColor), e.Bounds)
    22. End If
    23. End If
    24. e.DrawFocusRectangle()
    25. End Sub
    26. Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    27. Dim t As String = CType(sender, ComboBox).SelectedItem.ToString
    28. If UsersPCsList.Contains(t) Then
    29. UsersPCsList.Remove(t)
    30. Else
    31. UsersPCsList.Add(t)
    32. End If
    33. 'Debug.Print(String.Join("; ", myList))
    34. Me.BeginInvoke(New SetTextDelegate(AddressOf Me.SetText))
    35. End Sub
    36. Private Delegate Sub SetTextDelegate()
    37. Private Sub SetText()
    38. ComboBox1.Text = String.Join("; ", UsersPCsList)
    39. End Sub
    40. End Class

    fabimaurice schrieb:

    Ich habe ein DataGridView das über eine Datenbank befüllt wird.
    Das ist schoma keine gute Idee.
    DGV entwickelt erstaunliche Fähigkeiten - auch Darstellung von m:n-Relationen - wenn man es datengebunden an ein typisiertes Dataset verwendet.
    Das Dataset kann man dann aus der DB befüllen - nicht das DGV.
    Einen Überblick über die DGV-Fähigkeiten, und wie einfach das zu designen ist, erhälst du hier: vier Views-Videos

    Wenn das dein Interesse weckt, kannste ja weitere Fragen stellen.
    @ErfinderDesRades setze mich mal ein wenig damit auseinander bin wie gesagt noch neu ^^. Sollte ich Fragen haben meld ich mich thx.

    @HenryV Hast du evtl auch eine ahnung wie ich die Pc's nicht grün markiere sondern in der combobox als checked abhaken lasse?

    Vollzitat entfernt. Beiträge zusammengefügt. ~Thunderbolt

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

    Da es standardmässig in .net keine Combobox mit Chechkboxen gibt, muss du wohl was eigenes machen, auf etwas vorgefertigtes zurückgreifen (Beispiel) oder du benutzt das CheckedListBox-Control.

    Schnelllösung: Die Abfrage im DrawItem-Event anpassen und die "CheckBox" mitzeichnen.

    VB.NET-Quellcode

    1. If UsersPCsList.Contains(myItemText) Then
    2. e.Graphics.DrawString("☒ " & myItemText, e.Font, New SolidBrush(e.ForeColor), e.Bounds)
    3. Else
    4. e.Graphics.DrawString("☐ " & myItemText, e.Font, New SolidBrush(e.ForeColor), e.Bounds)
    5. End If
    Dadurch das ich am anfang den Add Range Befehl eingebe wird im Programm nur die Pcs die in der Range stehen angehakt ich möchte jedoch das die Pc's die in der DB diesem User zugeteilt sind angehakt werden sonst hab ich alles raus habe jz auch die Checked Combobox implementiert also nicht nur die Schnelllösung

    Vollzitat entfernt. ~Thunderbolt

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

    OK, alles auf Anfang.
    Mit dieser SQL-Abfrage für MsAccess, bekommst du eine Tabelle mit allen PCs und ob der User "2" zugeordnet ist.

    SQL-Abfrage

    1. SELECT PCs.PcID,
    2. IIF ((SELECT UserPcIDs.UserID FROM UserPcIDs WHERE UserPcIDs.UserID=2 AND UserPcIDs.PcID=PCs.PcID),TRUE,FALSE)
    3. AS IsUserOfPC
    4. FROM PCs;

    Mit dieser Tabelle musst du dann irgendwie deine Checked Combobox füttern.