.EditCurrent Dialog-Form Property vorbelegen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von klyer.

    .EditCurrent Dialog-Form Property vorbelegen

    Hallo Com,

    aus @ErfinderDesRadess Lib nutze ich u.a. das EditCurrent in Verbindung mit AddNewX.
    Mit AddNewX belege ich Werte für die BindingSource vor und mit EditCurrent bearbeite ich diese entsprechend in dem Dialog-Form.

    Mein Dialog-Form hat nun eine öffentliche Property für interne Zwecke, welche ich vor dem EditCurrent gern setzen möchte. Wie ist das möglich?

    Code:

    VB.NET-Quellcode

    1. With TestBS.AddNewX(Of TestRow)()
    2. .Wert = Defaultwert
    3. '...
    4. End With
    5. If TestBS.EditCurrent(Of dlgEdit)() = DialogResult.OK Then
    6. 'do something
    7. Else
    8. TestBS.RemoveCurrent()
    9. End If
    10. '*****dlgEdit*****
    11. Public Property Status As Integer = 0


    Wo kann ich dlgEdit.Status = 1 setzen?

    Danke schon einmal
    Tja, tut mir leid - ist so nicht möglich.

    Die .EditCurrent-Extension ist halt ziemlich optimiert, dass mans mit einer Zeile erledigt hat.

    Vlt kannste die Architektur umbauen, dass man dem EditItem nicht einen Typ-Parameter übergibt, und der estellt dann selbst das Form daraus, sondern dass du das Form extern erstellst, und das EditItem-Dingens öffnet und schließt das nur mit .ShowDialog.
    OK. Vielleicht kann noch an einer anderen Variable gedreht werden :)
    Das eigentlich Problem besteht darin, dass ich den Dialog für "Neu anlegen" und "Bearbeiten" nutze. Wenn nun etwas neu angelegt wird, möchte ich eine Duplikatsprüfung ausführen.
    Momentan mache ich das aus der Dialog-Form heraus, da ich so die "Neu angelegten Werte" aus der Suche ausschließen kann. Dafür setzte ich auch die Variable, dass nur bei "Neu anlegen" geprüft wird.
    Wie könnte das noch gelöst werden außer Architektur Umbauten?
    Keine Ahnung.
    Du könntest die Methode halt nachbauen.
    Also das Prinzip ist ja, dass mit BindingSource.AddNew(X) ein neuer Datensatz erzeugt, aber noch nicht zugefügt wird. Trotzdem wird von diesem Datensatz ein DataRowView gebildet, und wird an den Dialog gegeben, und als DataSource an die BindingSource geklatscht - per Reflection.
    Das kann man auch von Hand machen, da fällt der ganze Reflection-Kram weg.

    Das ist halt das Prinzip: DataRowView transportiert sämtiche Properties des Datensatzes, und implementiert drüberhinaus auch IEditableObject, und deshalb kann mans auch canceln und weg ist es.
    Ansonsten hast du immer noch recht viele Möglichkeiten.
    Etwa im Form_Load des Dialogs kannst du noch am übergebenen Datensatz rumfummeln - falls es nur ums Generieren widerspruchsfreier Daten geht - das geht ja auch im Dialog selbst.

    Auch kann man viel machen mit Validierung, zB gibt es DataRow.SetError, und mit ErrorProvidern oder auch im DatagridView kann man dem User Feedback geben, was falsch ist.
    Und natürlich übernimmt man keinen Dialog, wenn Dataset.HasErrors=True.

    ErfinderDesRades schrieb:

    Ansonsten hast du immer noch recht viele Möglichkeiten.


    Ja... habe es mit Rekursion gelöst.
    (Habe gerade keine Lust den Code für Forum anzupassen)

    VB.NET-Quellcode

    1. Private Sub Check()
    2. If AddressBookBindingSource.EditCurrent(Of dlgGuest)() = DialogResult.OK Then
    3. Dim row = AddressBookBindingSource.At(Of AddressBookRow)
    4. If CHelper.IsGuest(frmMain.BSAddressbook, row.FirstName, row.LastName, row.GuestID) Then
    5. Dim result = MessageBox.Show("Dieser Gast existiert bereits! Wollen Sie dennoch fortfahren?")
    6. If result = DialogResult.No Then
    7. Check()
    8. End If
    9. End If
    10. GetGuest()
    11. Else
    12. AddressBookBindingSource.RemoveCurrent()
    13. End If
    14. End Sub