Announcement

Collapse
No announcement yet.

WPF DataGrid Einfügen neuer Zeilen und Focus ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WPF DataGrid Einfügen neuer Zeilen und Focus ?

    Moinmoin,

    grundsätzlich kann man über die Eigenschaft "CanUserAddRow" das Grid in den Einfügemodus schalten. Und dann gibt es auch noch das Event "InitializingNewItem", in dem man ein neues Listenelement initialisieren soll. Dies funktioniert auch grundsätzlich, aber in folgenden Szenario bietet es nicht genügend Eingriffsmöglichkeiten.

    Zum Zeitpunkt des Events "InitializingNewItem" ist das Element der neuen Zeile (z.B. Typ Adresse) bereits mittels des Default-Knostruktors erzeugt wurden.

    Das Neuanlegen eines neuen Elements erfolgt immer über eine New-Methode:

    [highlight=c#]class BSO
    {
    Adress _CurrentAdresse;
    List<Adresse> _AdressList;

    void NewAdresse()
    {
    if(!PreExecute("NewAdresse")
    return;
    Adress adresse = new Adresse();
    adresse.Nr = Guid.NewId();
    _CurrentAdresse = adresse;
    _AdressList.Add(adresse);

    // Ist abstrakter gelöst, da die Klasse, die Oberfläche nicht kennt.
    ucDatagrid.DataContext = null;
    ucDatagrid.DataContext = this;
    }
    }[/highlight]
    Nun zum eigentlichen Szenario...

    Die konkrete WPF-Oberfläche ist der Klasse nicht direkt bekannt. So kann mittels WPF-XAML wahlweise ein Datagrid mit der Liste von Adressen (_AdressList) oder einzelne Steuerelemente mit der der aktuellen Adresse (_CurrentAdresse) oder eine Kombination von Readonly-DataGrid und Steuerelementen dargestellt werden.

    Das PreExecute ermöglicht eine kundenspezifische Implementierung von NewAdresse, welche dann selbst die Erzeugung und Initialisierung übernehmen kann.

    Hier nun das Problem:
    Beim "InitializingNewItem" kann ich die Funktion nicht aufrufen, da ja schon die neue Instanz von Adresse erzeugt wurde. Hier bräuchte man ein anderes Event vom DataGrid (wie z.B. OnCreateNewItem), das vor dem "InitializingNewItem" aufgerufen wird und wo dann die in meinem Fall die "NewAdresse()" aufgerufen werden könnte.

    Folgendes habe ich schon probiert...
    Beim DataGrid habe ich das "PreviewKeyDown" Event abgefangen und falls in der letzten Zeile Pfeil runter (Key.Down) gedrückt wird, dann rufe ich die NewAdresse Methode auf. Dies funktioniert grundsätzlich auch, nur es ist mir noch nicht gelungen, den Focus auf die neue Zeile bzw. die erste Spalte der neuen Zeile zu setzen...

    [highlight=c#]ucGrid.DataContext = null;
    ucGrid.DataContext = BSO;
    ICollectionView collView = CollectionViewSource.GetDefaultView(ucGrid.ItemsSo urce);
    if (collView != null)
    {
    collView.MoveCurrentToLast();
    }[/highlight]

    ..dies funktioniert leider nicht. Da der Code im Callstack vom PreviewKeyDown des DataGrid aufgerufen wird.

    Hat jemand eine Idee ?

    Gruß
    Norbert
    Zuletzt editiert von Jürgen Thomas; 13.12.2009, 12:23. Reason: [highlight=c#] nachgetragen, bitte künftig selbst erledigen!

  • #2
    Also soweit ich mich erinnere konnte man im InitializingNewItem das erzeugte Item den EventArgs übergeben und dieses wird dann weiter verwendet.

    Der Ablauf wäre dann wie folgt:

    1. Benutzer fügt eine Zeile hinzu
    2. InitializingNewItem wird aufgerufen
    3. Du deligierst die Erzeugungsfunktion an die Kundenfunktion und bekommst ein Item zurück
    4. Du übergibst das Item an die EventArgs

    Ich hab leider gerade kein Visual Studio zuhause installiert, also kann ichs nicht verifizieren, aber zumindest beim DataGridView in Windows Forms gings so.

    Comment


    • #3
      Originally posted by fanderlf View Post
      Also soweit ich mich erinnere konnte man im InitializingNewItem das erzeugte Item den EventArgs übergeben und dieses wird dann weiter verwendet.

      Der Ablauf wäre dann wie folgt:

      1. Benutzer fügt eine Zeile hinzu
      2. InitializingNewItem wird aufgerufen
      3. Du deligierst die Erzeugungsfunktion an die Kundenfunktion und bekommst ein Item zurück
      4. Du übergibst das Item an die EventArgs

      Ich hab leider gerade kein Visual Studio zuhause installiert, also kann ichs nicht verifizieren, aber zumindest beim DataGridView in Windows Forms gings so.
      Danke für die schnelle Antwort, aber leider funktioniert es beim WPF DataGrid so nicht

      [highlight=c#]void ucGrid_InitializingNewItem(object sender, InitializingNewItemEventArgs e)
      {
      Adresse adresse = new Adresse();
      adresse.Name = "Test";
      // NewItem hat leider kein Set, sondern nur ein Get
      // Daher ist das nicht möglich
      e.NewItem = adresse;
      }[/highlight]

      Gruß
      Norbert
      Zuletzt editiert von Jürgen Thomas; 13.12.2009, 12:23. Reason: [highlight=c#] nachgetragen, bitte künftig selbst erledigen!

      Comment

      Working...
      X