Erweiterter Umgang mit typisiertem DataSet -> Tabellennamen lesen/Namensübergabe etc.

  • VB.NET
  • .NET 4.0

Es gibt 259 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Ich lasse mir mit letzter Anfrage ja Einträge voreintragen in's DataSet.
    Diese Einträge bekomme ich nach dem Ablauf in einem DGV angezeigt.

    Es gibt u.a. eine Spalte "Datum" - kann ich mit der Bindingsource / den Daten direkt die Row im DGV selektieren, die das heutige Datum hat
    oder muss ich die Spalte "Datum" im DGV danach durchsuchen?

    LG
    Originaler (noch) Nichtskönner :D
    Das DGV wird nicht durchsucht, dafür die die BindingSource da. DeineBindingSource.Position = DeineBindingSource.Find(NameDerDatumsspalte, WertDerGefundenWerdenSoll)
    Bei nem Datum musst Du wohl nur ein wenig aufpassen, was genau in der Tabelle drinsteht. Weil ein String "26.06.2020" und Date.Today werden nicht als gleich angesehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Danke, für den Tipp.
    Es ist kein String, sondern Date als Datentyp. Mit Date.Today.Date sollte das klappen - ich teste mal rum

    EDIT: funzt leider nicht, kommt immer "-1" als Position raus
    bsDatenabfrageHc.Position = bsDatenabfrageHc.Find("Datum", Date.Today.ToShortDateString)
    Originaler (noch) Nichtskönner :D

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

    geht leider beides nicht...
    also weder bsDatenabfrageHc.Position = bsDatenabfrageHc.Find("Datum", Date.Today.ToShortDateString)
    noch bsDatenabfrageHc.Position = bsDatenabfrageHc.Find("Datum", Date.Today.Date)
    Originaler (noch) Nichtskönner :D
    bsDatenabfrageHc.Position = bsDatenabfrageHc.Find("Datum", Date.Today.Date) müsste aber, wenn auch noch ein kleiner Unsinn drinne ist - korrekt wäre:
    bsDatenabfrageHc.Position = bsDatenabfrageHc.Find("Datum", Date.Today) (von Date.Today muss man kein Date nochmal abrufen.)

    Achso: es kann immer noch sein, dass in den Daten keine Datumse drinne sind, sondern Zeitpunkte (DAtum+Stunde,Minute,...). Dann gibts da ja auch keine Übereinstimmung.
    Edit: ups: petaod war schneller
    Aber statt "die Datumsabfrage ebenfalls auf den Tag reduzieren" könntest du den Zeitbereich eines Tages abfragen:
    Datum >= Date.Today AndAlso Datum < Date.Tomorrow
    Ach - das geht jetzt aber nichtmehr mit der blöden BindingSource.Find-Methode, sondern geht mit Linq.

    Aber petaod hat auch recht: Wenn du die DatenErhebung korrigieren könntest, dass da von vornherein wirklich nur Datumse in den Datenbestand gelangen - wär besser.

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

    Mit bsDatenabfrageHc.Position = bsDatenabfrageHc.Find("Datum", Date.Today)
    funktioniert es - ich hatte einen Fehler im Code und zwar hab ich die bs.position abgefragt, bevor ich den Filter zur Anzeige des bestimmten Mitarbeiters
    auf die BS gelegt hatte :/

    Jetzt hab ich erst den Filter gesetzt und dann die Position abgefragt - nun klappt's.
    Geht das jetzt noch irgendwie, dass das DGV auch zu der Position hinscrollt? Aktuell ist das mit heutigem Datum z.B. ziemlich weit unten im DGV - schöner wär's dass
    das ganz oben angezeigt wird (hinscrollen wegen mir)

    EDIT: hat sich erledigt - funzt mit dgv.FirstDisplayedScrollingRowIndex = bsDatenabfrageHc.Position ;)
    Originaler (noch) Nichtskönner :D
    uuuund natürlich noch was ^^ :

    Ich habe folgenden Dialog:


    beim Öffnen des Dialogs soll die cmbMitarbeiter mit einem Bestimmten Mitarbeiter gefüllt sein.
    An dieser cmb hängt die bsCmbMitarbeiter

    Der Aufruf sieht wie folgt aus:

    VB.NET-Quellcode

    1. Dim maID = bsPlanMitarbeiter.At(Of PlanRow).MitarbeiterID 'MitarbeiterID abrufen
    2. Using dlg As New dlgPlanNeu
    3. Dts.Register(dlg, False)
    4. dlg.bsCmbMitarbeiter.Filter = $"ID = {maID}" 'MitarbeiterID als Filter
    5. dlg.ShowDialog()
    6. End Using


    Er stellt mir aber trotzdem alle Mitarbeiter zur Auswahl. Am liebsten wäre mir, dass der korrekte Mitarbeiter eingetragen in der cmb drin steht und ich die auf Enabled = False setzen kann...
    Wo ist hier mein Denkfehler?
    Die ID, die aus der PlanRow geholt wird ist definitiv die richtige....
    Originaler (noch) Nichtskönner :D

    ErfinderDesRades schrieb:

    Muss man wohl mal untersuchen, ob danach irgendetwas den Filter wieder weglöscht


    jo hast recht, da funkt meine Rechtesteuerung dazwischen weil der Dialog auch woanders genutzt wird ohne Voreintragung... dann duplizier' ich den und lass
    den Krempel da weg, dann sollte das funzen. Danke für den Hinweis :thumbup:

    EDIT: der Filter klappt jetzt, ich hätte aber gerne den gefilterten Mitarbeiter als "Vorauswahl" / feste Auswahl in der Combobox stehen, wenn sich der Dialog öffnet.

    VB.NET-Quellcode

    1. dlg.bsCmbMitarbeiter.Filter = $"ID = {maID}"
    2. dlg.cmbMitarbeiter.SelectedValue = maID


    was mach' ich da falsch?
    Bilder
    • Unbenannt.PNG

      1,52 MB, 639×286, 10 mal angesehen
    • Unbenannt2.png

      86,54 kB, 420×314, 11 mal angesehen
    Originaler (noch) Nichtskönner :D

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

    Hey,

    ich wüsste nicht wie ich das anstellen soll - der Datensatz wird erst bei DialogResult.OK erzeugt...
    es handelt sich hier nicht um ein EditNew weil ich mit von...bis Datum arbeiten muss und er mir bei EditNew dann immer
    einen Sample-Eintrag mit 01.01.1900 erzeugt, den ich nicht gebrauchen kann ;)

    Deshalb bräuchte ich das schon direkt eingetragen in der ComboBox (kann wegen mir auch für den Fall eine Textbox sein, denn ich brauch da keine Auswahl treffen,
    die Textbox müsste aber auf den Member(ID) hören und expFullname anzeigen)
    Originaler (noch) Nichtskönner :D

    Neu

    Ich hätte da nochmal einen kleinen Schönheitsfehler entdeckt - komme aber nicht dahinter, wie ich den weg bekomme :(
    Dazu hab' ich die Solution mit Testdaten mal angehangen.

    Login: admin
    pw: test

    Im Tree 3.1 Datenabfrage HC doppelklicken -> Mitarbeiter H,D,test auswählen
    ein paar Einträge markieren, rechtsklick -> schnelländerung

    wenn ich im MultiEdit-Dialog auf abbrechen klicke (oder ESC drücke), bekomme ich die Exception dass der Wochentag (DBNull) nicht in string umgewandelt werden kann.
    Wenn ich abbrechen drücke, soll da eigentlich garnix passieren...


    Hat jemand einen Tipp für mich?
    Dateien
    Originaler (noch) Nichtskönner :D

    Neu

    Der Fehler wird in der Sub EditMulti in BindingSourceX.vb von @ErfinderDesRades ausgelöst. An der Stelle hör ich auf zu recherchieren, da ich dort nicht mehr durchblicke. Der Code führt irgendwie dazu, dass die 2. ausgewählte Zeile zerschossen wird.

    ##########

    Ich hab doch noch weiter geschaut. Die genannte Sub ruft EditMultiPrepare auf, die dann alle beschreibbaren Werte auf DbNull setzt. Dann schnappt Dein PrePaint_EventHandler zu und kann mit den ganzen DbNull-Zellen nix mehr anfangen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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

    Neu

    VaporiZed schrieb:

    in BindingSourceX.vb von @ErfinderDesRades ausgelöst


    Edit2: nicht fertig gelesen, sorry - warum greift der PrePaint-Handler denn nochmal zu, obwohl schon alles "erledigt" ist?
    Edit3: geht auch so leider nicht:

    VB.NET-Quellcode

    1. Private Sub dgv_RowPrePaint(sender As Object, e As DataGridViewRowPrePaintEventArgs) Handles dgv.RowPrePaint
    2. Dim rw = DirectCast(DirectCast(dgv.Rows(e.RowIndex).DataBoundItem, DataRowView).Row, DatenabfrageHcRow)
    3. If Not rw.WochenTag Is DBNull.Value Then
    4. If rw.WochenTag = "Samstag" OrElse rw.WochenTag = "Sonntag" Then dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.LightGray
    5. End If
    6. End Sub

    Edit4: Mir ist im Haltemodus grad aufgefallen, dass das RowPrePaint-Event durchgehend gefeuert wird (hatte 3 Rows markiert und keine Aktion durchgeführt)...
    gibt's da nochwas anderes um die Rows mit entsprechendem Wochentag zu färben, was nur beim Laden des DGV passiert und danach nicht mehr?

    Originaler (noch) Nichtskönner :D

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „tragl“ ()