DataRowState.Modified wird nicht gesetzt??

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    DataRowState.Modified wird nicht gesetzt??

    Hi,
    ich erstelle gerade ein Telefonbuch auf Basis des Active Directory.
    Das klappt soweit auch bestens.
    Nun möchte ich gerne Änderungen wieder zurück ins AD schreiben.
    Meine Datatable hab ich als Details in meine Form eingefügt (siehe Bildle).
    Wenn ich nun einen Wert ändere und Save drücke, erhalte ich stets den Fehler, das meine Datatable in der die Änderungen stehen soll, null ist.
    Somit wird wohl das Flag .Modified nicht gesetzt.
    Wann wird das Flag denn gesetzt?

    EDIT: den Code für den Save Button vergessen, Sorry:

    C#-Quellcode

    1. private void btnSave_Click(object sender, EventArgs e)
    2. {
    3. DataTable dt = dsAD.ADUser.GetChanges(DataRowState.Modified);
    4. var changes = new Dictionary<string, object>();
    5. foreach (DataRow row in dt.Rows)
    6. {
    7. foreach (DataColumn col in dt.Columns)
    8. {
    9. changes.Add(col.ColumnName, row[col.ColumnName]);
    10. }
    11. }
    12. //con.UpdateUser(txtSurName.Text, changes);
    13. //ReadOnlyChange(textBoxes, true);
    14. }

    "Hier könnte Ihre Werbung stehen..."
    oder du hast das falsche dsAD am Wickel.
    Oder du hast iwo .AcceptChanges() aufgerufen - dann sind die Rowstates auch alle weg.
    Prüf ma direkt, ob zum Zeitpunkt des Speichern beim geänderten Datensatz Rowstate.Modified ist.
    Falls nicht, obs ühaupt iwann mal gesetzt wurde.
    Und dann checken, wo diese Information verloren gegangen ist.
    Hi,
    es gibt nur ein dsAD und das ist in der einzigsten Form die es gibt.
    Hatte auch gerade nochmal alles aus der Form geschmissen und neu hinzugefügt.
    Dennoch ist meine Tabelle, die die geänderten Zerilen enthalten soll DataTable dt = dsAD.ADUser.GetChanges(DataRowState.Modified); wieder null....
    Irgendwie scheint mein VS auch wieder falsch eingestellt worden zu sein, denn wenn ich nen Haltepunkt setze springt er da nicht hin sondern endet immer mit Haltepunkt.
    Gibts nen schnellen weg um zu sehen welcher Datensatz den RowState.Modified hat?
    AcceptChanges rufe ich auch nirgends auf

    EDIT:
    Die einzelnen Rows werden durch eine Methode in die Datatable hinzugefügt. Am Ende diser Methode hab ich jetzt mal AcceptChanges() aufgerufen, da der RowState aller Rows vorher immer Added war.
    Nun ändere ich in der Textbox etwas und trotzdem sind alle Rows mit Unchanged gesetzt...
    Ich werd noch bekloppt...

    "Hier könnte Ihre Werbung stehen..."

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

    Hi,
    So, ich habe nun ein bsADUser.EndEdit(); an den Anfang der Methode gesetzt und schon gehts.

    EDIT:
    Eine Sache habe ich noch.
    Ich hab jetzt die Einträge der Row ja in ein Dictionary geschrieben, dieses Dict schicke ich dann an eine Methode, die die Daten wieder ins AD schreibt.
    Kann ich irgendwie hergehen und nur die geänderten Werte ins Dict schreiben? anstatt die gesamte Row?
    "Hier könnte Ihre Werbung stehen..."

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

    Hi,
    da bin ich gestern auch noch drüber gestolpert:

    C#-Quellcode

    1. rivate void btnSave_Click(object sender, EventArgs e)
    2. {
    3. bsADUser.EndEdit();
    4. DataTable dt = dsAD.ADUser.GetChanges(DataRowState.Modified);
    5. Dictionary<string, object> changes = new Dictionary<string, object>();
    6. foreach (DataRow row in dt.Rows)
    7. {
    8. foreach (DataColumn col in dt.Columns)
    9. {
    10. if (!row.HasVersion(DataRowVersion.Current).Equals(row.HasVersion(DataRowVersion.Original)))
    11. changes.Add(col.ColumnName, row[col.ColumnName]);
    12. }
    13. }
    14. //con.UpdateUser(txtSurName.Text, changes);
    15. //ReadOnlyChange(textBoxes, true);
    16. foreach (var item in changes)
    17. {
    18. MessageBox.Show(item.ToString());
    19. }
    20. changes.Clear();
    21. }

    Versteh es nur nicht so ganz und daher klappt es nicht wirklich.
    Ich möchte im Dictionary lediglich die Colum/Row haben, die geändert wurde. Alle anderen sollen ignoriert werden.
    "Hier könnte Ihre Werbung stehen..."
    Hi,
    hab nun den gewünschten Erfolg erzielt.

    C#-Quellcode

    1. public void ChangeUserValue(DataTable dt, string user)
    2. {
    3. Dictionary<string,object> dictChanges = new Dictionary<string, object>();
    4. DataTable changes = dt.GetChanges(DataRowState.Modified);
    5. foreach (DataRow row in dt.Rows)
    6. {
    7. foreach (DataColumn col in dt.Columns)
    8. {
    9. var origin = row[col, DataRowVersion.Original];
    10. var current = row[col, DataRowVersion.Current];
    11. if (!current.Equals(origin))
    12. dictChanges.Add(col.ColumnName, current);
    13. }
    14. }
    15. UpdateUser(user, dictChanges);
    16. dictChanges.Clear();
    17. }

    nun hab ich im Dictionary lediglich die geänderten Spalten mit dem geänderten Wert, die ich dann ins AD schreiben kann.

    EDIT:
    hier noch die Methode UpdateUser

    C#-Quellcode

    1. void UpdateUser(string username, Dictionary<string,object> prop)
    2. {
    3. using (PrincipalContext domain = new PrincipalContext(ContextType.Domain, _Domain))
    4. {
    5. using (UserPrincipal user = new UserPrincipal(domain))
    6. {
    7. user.Surname = username;
    8. using (PrincipalSearcher search = new PrincipalSearcher(user))
    9. {
    10. UserPrincipal mainProps = (UserPrincipal)search.FindOne();
    11. DirectoryEntry lowProps = (DirectoryEntry)mainProps.GetUnderlyingObject();
    12. foreach (var item in prop)
    13. {
    14. if(item.Value.ToString() == "")
    15. lowProps.Properties[item.Key].Clear();
    16. else
    17. lowProps.Properties[item.Key].Value = prop[item.Key].ToString();
    18. }
    19. lowProps.CommitChanges();
    20. }
    21. }
    22. }
    23. }


    "Hier könnte Ihre Werbung stehen..."

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