Datagridview an vorhandene list(of MyClass) binden und nur bestimmte Werte anzeigen

  • VB.NET
  • .NET (FX) 1.0–2.0

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

    Datagridview an vorhandene list(of MyClass) binden und nur bestimmte Werte anzeigen

    Nabend liebe Community,

    ich habe eine list(of MyClass).
    MyClass besteht aus 10 Eigenschaften + ein paar Methoden und Funktionen.

    Ich möchte nun nur 3 Eigenschaften von MyClass aus der Liste einem DatagridView (3 Spalten) zuweisen und anzeigen lassen.

    Ich bekomme es einfach nicht hin, die Zuweisung nur von 3 der 6 Properties zu machen :huh:

    Muss ich dann nochmal eine seperate Liste erstellen, wo nur die Sachen als Property drin sind, die mein DGV anzeigen soll? ?(

    Danke für eure Denkanstöße :)
    Die Properties die nicht sichtbar sein sollen, mit System.Component.Model.Browsable(False) ausblenden. Du kannst die Properties auch als Private markieren und wenn von aussen der Wert geändert werden soll, eine Sub zum setzen nutzen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim a As New List(Of Details)
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. DataGridView1.DataSource = a
    5. End Sub
    6. End Class
    7. Class Details
    8. <System.ComponentModel.Browsable(False)> Public Property A As String
    9. Public Property B As String
    10. <System.ComponentModel.Browsable(False)> Public Property C As String
    11. End Class
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Ah, verdammt...
    Ich habe so etwas in Erinnerung gehabt, wusste aber nicht mehr, wie es angegeben bzw verwendet wird, besten Dank!

    @NoIde
    Wie ist das mit Klassen, die Extern (in einer DLL) sind ?


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

    Ich würde eine abgeleitete Klasse erstellen und die Properties überschreiben.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim a As New List(Of Details)
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. DataGridView1.DataSource = a
    5. End Sub
    6. End Class
    7. Class Details
    8. Inherits InDllDetails
    9. <System.ComponentModel.Browsable(False)> Public Overloads Property A As String
    10. <System.ComponentModel.Browsable(False)> Public Overloads Property C As String
    11. End Class
    12. Class InDllDetails
    13. Public Property A As String
    14. Public Property B As String
    15. Public Property C As String
    16. End Class
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Interessanter Ansatz...

    Wenn die Dll-Klasse jetzt übertrieben gesagt 999 Properties hätte, müsste ich dann jede *.Browsable(False) setzen?

    Hätte gedacht, dass ich das z.b. in der DataSource festlegen könnte o.Ä.
    Bin allerdings ein Anfänger, was das DGV angeht, bezüglich DataBinding...
    Ich geb auch mal Ketchup und Senf dazu. Ein Alternativansatz.
    Du hast ein DGV. Da wählst Du über den SmartTag: Datenquelle und klickst da auch [Projektdatenquelle hinzufügen...], [Objekt], Deine Klasse auswählen. Und dann werden im DGV-Designer alle möglichen Properties angezeigt. Da löschst Du die raus, die Du nicht willst.
    Bilder
    • BoundDgv.png

      58,79 kB, 1.176×766, 180 mal angesehen
    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.

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

    VaporiZed schrieb:

    Ich geb auch mal Ketchup und Senf dazu. Ein Alternativansatz.
    Du hast ein DGV. Da wählst Du über den SmartTag: Datenquelle und klickst da auch [Projektdatenquelle hinzufügen...], [Objekt], Deine Klasse auswählen. Und dann werden im DGV-Designer alle möglichen Properties angezeigt. Da löschst Du die raus, die Du nicht willst.

    Na da hat sich ja wer Mühe gegeben ^^
    Das habe ich so in der Art auch schon probiert, allerdings bekomme ich dann folgende Fehlermeldung, sobald das DGV angezeigt wird:

    Quellcode

    1. Die Anwendung befindet sich im Haltemodus.Ihre App wurde angehalten, aber es gibt keinen anzuzeigenden Code, da alle Threads externen Code ausgeführt haben (normalerweise System- oder Frameworkcode).

    Und zwar, weil bei einigen Spalten als Datentyp kein String, sondern eine Klasse steht, die man aber mit .toString() zu einem passenden String bekommen würde.
    Nur das kann ja das DGV nicht, oder?

    Und, das DGV aktualisiert die Werte nicht, nachdem ich die DataSource 1x zugewiesen habe, obwohl die Werte in der Liste sehr wohl aktualisiert werden :huh:
    Hab herausgefunden, dass sich das DGV aktualisiert, wenn ich nach dem aktualisieren der Liste DataGridView1.Refresh() aufrufe...

    Kleine Korrektur, es ist eine Liste mit Interfaces, nicht mit klassen, welche in einer externen (fremden) Dll stecken :whistling:

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „TRiViUM“ ()

    :huh:
    Bei mir muss ich da schon ganz bewusst explizit angeben, dass ich die Extraklassen drinhaben will. Aber selbst wenn ich das mache, wird mir entweder gar nichts angezeigt oder die Spalte allein wird einfach nicht angezeigt. Ist jetzt vielleicht nicht ganz das Szenario, was Dir vorliegt, aber für den Anfang gingen folgende Sachen ohne Crash:

    VB.NET-Quellcode

    1. Public Class Testklasse
    2. Public Property A As Integer = 0
    3. Public Property B As Integer = 1
    4. Public Property C As Integer = 2
    5. Public Testinstanz As New Testklasse2
    6. Public Class InterneKlasse
    7. End Class
    8. Public NewForm As New Form
    9. End Class
    10. Public Class Testklasse2
    11. End Class

    Allerdings stellst sich die Frage, wie tief die Klassenstruktur angezeigt werden soll bzw. ob Du die anderen Klassen überhaupt sehen willst oder ob Dir quasi Ebene 1 reicht.
    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.

    TRiViUM schrieb:

    Das habe ich so in der Art auch schon probiert, allerdings bekomme ich dann folgende Fehlermeldung, sobald das DGV angezeigt wird:
    >>Die Anwendung befindet sich im Haltemodus.Ihre App wurde angehalten, aber es gibt keinen anzuzeigenden Code, da alle Threads externen Code ausgeführt haben (normalerweise System- oder Frameworkcode).
    Und zwar, weil bei einigen Spalten als Datentyp kein String, sondern eine Klasse steht, die man aber mit .toString() zu einem passenden String bekommen würde.
    Nur das kann ja das DGV nicht, oder?
    Scheints hat deine Datenklasse Properties (es sind je keine Spalten - Spalten werden es ja erst im DGV), deren Datentyp ein DGV von selbst nicht vernünftig anzeigt.
    Da sollte die erste Massnahme sein, diese Properties eben von der Anzeige auszunehmen - wie Vaporized bereits erläuterte.
    Wenn das gelungen ist, kann man sich was überlegen, ob und was man ersatzweise statt dieser Properties anzuzeigt.
    Gut möglich, das man diese Property/Spalte auch weglässt - bei 999 Properties wird man wohl eh das eine oder annere weglassen wollen, odr?

    (Die Fehlermeldung kommt mir übrigens echt mysteriös vor - womöglich ist das wirklich ein ganz aussergewöhnlicher Property-Datentyp, der solche Probleme provoziert)