DGV + LINQ + ParentTable

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Peterle.

    DGV + LINQ + ParentTable

    Hallo,

    in einem gebundenen DGV zeige ich per ComboBox die Einträge einer Parent-Tabelle. Letztere besteht aus den Einträgen HeizrateID und Heizrate. In der DGV-ComboBox werden die Bezeichnungen der Parent-Tabelle angezeigt (DisplayMember = Heizrate, ValueMember = HeizrateID). Nun wollte ich per LINQ den höchsten Heizrate-Wert aus meiner DGV-Spalte holen:

    VB.NET-Quellcode

    1. MaxHeizrate = curDgv.Rows.Cast(Of DataGridViewRow)().Max(Function(x) CInt(x.Cells("colHeizRate").Value))


    Hier kriege ich aber meine HeizrateID zurück. Wie kann ich also meine LINQ-Abfrage, bezogen auf eine DGV-Spalte, so ergänzen, dass ich mir mit der HeizrateID aus dem DGV den entsprechenden Eintrag aus der Parent-Tabelle holen kann? Per Workaround konnte ich mir zunächst die ID holen und damit dann in der Parent-Tabelle schauen, welcher Wert dort hinterlegt ist:

    VB.NET-Quellcode

    1. Dim minHeizrateID = curDgv.Rows.Cast(Of DataGridViewRow)().Min(Function(x) (CInt(x.Cells("colHeizRate").Value)))
    2. MaxHeizrate = ds.Heizrate.FindByHeizrateID(minHeizrateID).Heizrate


    Da ich mit einem typisierten DataSet arbeite, sind die Tabellenindizes negativ (deshalb Min()). Erst später, bei der Portierung auf die Datenbank, werde ich es mit positiven Indizes zu tun haben. Von daher ist die obige Lösung Mist, weil ich hier später noch einmal in den Code eingreifen müsste.

    Peterle
    Du arbeitest untypisiert!
    Wie heisst deine BS zu curDGV?
    Mit BS.CurrentRow machst du einen Doppelcast über DatarowView auf die typisierte DataRow:
    Dim MaxHeizrate = DirectCast(DirectCast(BS, DatarowView).Row, typDataRow).Max(Function(r) r.typParentRow.Heizindex) das kann nicht funktionieren - dazu muss ich dein Datenmodel kennen...
    Die typ. DataRows musst du halt anpassen - die kenne ich nicht!

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

    Obigen Code habe ich in eine Klasse ausgelagert, welche die BindingSource nicht kennt. Dies müsste ich dann vermutlich ändern, also z.B. die BS per Konstruktor der Klasse übergeben... nur, wie halte ich die BS in der Klasse dann aktuell?! Oder zeigt die übergebene BS per Referenz immer auf den aktuellen Stand? So weit reicht mein Wissen leider noch nicht...
    Z.B. will ich einige Zellen im DGV in Abhängigkeit des Inhaltes formatieren. Dafür habe ich im Konstruktor des Formulars z.B.

    VB.NET-Quellcode

    1. AddHandler dgvTemperaturKurven.SelectionChanged, Sub() TemperaturKurven.DgvSetCellStyle(dgvKurvenSegmente)


    hinterlegt. Wenn sich im "Parent-DGV" die Auswahl ändert, übergebe ich das dgvKurvenSegmente an eine Prozedur der Klasseninstanz Temperaturkurven... und in dieser Prozedur möchte ich die z.B. die max. Heizrate bestimmen, wie eingangs im Thread beschrieben. Letztendlich will ich per separater Klasse die Formatierung des DGVs und die Zusammenfassung des Inhaltes auslagern, wofür ich halt der Klasse bei bestimmten Events das DGV übergebe. Ich hoffe, das beantwortet deine Frage :/

    Peterle schrieb:

    dgvKurvenSegmente
    enthält dieses DGV nun alle Datensätze, wo der Maximalwert festgestellt werden soll? Wenn Ja dann ev. so:

    VB.NET-Quellcode

    1. Dim max As DeinDatenTyp
    2. For Each row In DirectCast(DeinDataGridView.DataSource, BindingSource)
    3. Dim rw = DirectCast(DirectCast(rw, DataRowView).Row, DeineTypisierteDataRow) 'sonst hier noch eine .Parentrow.Heizrate einfügen (k.A. kenne dein Datenmodel nicht!)...
    4. If rw.Heizrate > max Then Max = rw.Heizrate
    5. Next
    Aus Post#1 werd ich nicht schlau. Du wunderst Dich, warum Du eine ID erhältst, wenn Du den Maximalwert aus colHeizRate rausholst, nimmst aber dieselbige Spalte, um im Workaround die passende ID zu holen und dann den Heizratenwert. Warum nimmst Du nicht gleich den Wert, der in der richtigen Spalte steht.
    Kurzer Einwurf: Warum holst Du die Daten aus dem DGV und nicht aus der DataTable des tDS?
    Kannst Du mal ein tDS-Designer-Screenshot(ausschnitt) + eine Testtabelle posten, in der Deine Ist- und Sollwerte drinstehen?
    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.