Announcement

Collapse
No announcement yet.

Grid mit Textbox syncronisieren

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

  • Grid mit Textbox syncronisieren

    Hallo zusammen,

    ich habe (WPF, C#, .net 4.0) ein Grid und eine Textbox und möchte nun, das in der Textbox das angezeigt wird, was in der aktuellen Zelle des Grid angezeigt wird. Änderungen sollen direkt im Grid, aber auch in der Textbox möglich sein und direkt angezeigt werden. Das ganze ist vom Aufbau her so ähnlich wie Excel.
    Das Grid bekommt seine Daten von einer Datatable.

    Ich bekomme es einfach nicht hin.
    Hat jemand einen Tipp für mich?
    Attached Files

  • #2
    bisher sieht mein Code für die Synchronisation so aus:

    [highlight=c-sharp]
    // Synchronisation GridZelle mit Textbox
    private void grdView_SelectedCellsChanged(object sender, GridViewSelectedCellsChangedEventArgs e)
    {
    if (e.AddedCells.Count != 0)
    {
    GridViewCellInfo ci = e.AddedCells[0];
    Binding b = new Binding((ci.Column as GridViewDataColumn).DataMemberBinding.Path.Path)
    {
    Mode = BindingMode.TwoWay,
    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
    Source = ci.Item
    };
    txtValue.SetBinding(TextBox.TextProperty, b);
    };
    }

    // Synchronisation TextBox mit Grid-Zelle
    private void TextBox_Loaded(object sender, RoutedEventArgs e)
    {
    TextBox t = sender as TextBox;
    var column = t.ParentOfType<GridViewCell>().Column as GridViewDataColumn;
    Binding b = new Binding()
    {
    Mode = BindingMode.TwoWay,
    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
    Path = column.DataMemberBinding.Path
    };
    t.SetBinding(TextBox.TextProperty, b);
    }
    [/highlight]

    Comment


    • #3
      Hallo,

      ich denke das sollte über Element-Binding rein über XAML möglich sein. Also eine Bindung an die aktive Zelle des Grid und als Path die Text-Eigenschaft.


      mfG Gü
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment


      • #4
        Könnte man nicht auch an die gleiche Property des ViewModels binden? Aber ich glaub dann hat man das Problem, dass das Objekt selbst INotifyPropertychanged implementieren muss, oder? Aber normalerweise sollte das sowieso auf allen Objekten implementiert sein die man an eine Oberfläche bindet (sind ja vor allem Business Objekte)

        Comment


        • #5
          Eher Offtopic:

          Hallo Florian,

          schau dir mal Probleme und Lösungen mit Model-View-ViewModel an. Dort gehts über die DLR. Interessanter Ansatzt der mir aber nich so recht gefällt.


          mfG Gü
          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

          Comment


          • #6
            Um Binding hab ich mich bisher immer schön drücken können, weshalb ich davon kaum Ahnung habe.

            Wenn ich auf eine Zelle klicke, bekomm ich immer folgende Meldung (der Spaltenname Variiert dabei):

            System.Windows.Data Error: 40 : BindingExpression path error: 'R 2' property not found on 'object' ''DataRow' (HashCode=41346859)'. BindingExpression:Path=R 2; DataItem='DataRow' (HashCode=41346859); target element is 'TextBox' (Name='txtValue'); target property is 'Text' (type 'String')

            Comment


            • #7
              Der große Vorteil von WPF ist doch das sehr sehr mächtige DataBinding. Ich würde gar nicht erst versuchen mich darum zu drücken. Sehr viele Mechanismen im .NET Framework basieren auf dem Binding Mechanismus. Also ich würd eher versuchen mich in die Technik einzuarbeiten, anstatt davor wegzurennen und irgendwas handgestricktes zu produzieren.

              Comment


              • #8
                ich hab mich hier jetzt mal dran entlang gehangelt:

                http://wesaday.wordpress.com/tag/model-view-viewmodel/

                Meine Daten bekomme ich im Grid angezeigt, aber syncron bekomm ich es noch nicht wirklich.

                Comment


                • #9
                  Also, vielleicht weiß da ja jemand was zu.

                  ich habe ein PropertyChangeEvent, das reagieren soll, wenn eben ein Property verändert wird.
                  Mein Property sieht so aus:
                  [highlight=c#]
                  public DataTable FileData
                  {
                  get
                  {
                  return _fileData;
                  }
                  set
                  {
                  _fileData = value;
                  OnPropertyChanged("FileData");
                  }
                  }
                  [/highlight]

                  _fileData ist eine DataTable und das Property FileData ist als ItemSource an das Grid gebunden.

                  Wenn ich nun etwas an der DataTable ändere (damit meine ich ich geb irgendwo Daten ein) dann habe ich erwaretet, dass das Property damit auch geändert wird und mein Event gefeuert wird.
                  Dem ist aber nicht so. Es wird kein Event gefeuert und damit bleibt auch die syncronisierung aus

                  Hat jemand ne Idee?

                  Comment


                  • #10
                    Hallo,

                    so wie die Eigenschaft da steht wird das Ereginis nur dann ausgelöst wenn ein neuer Wert FileData zugewiesen wird.

                    Mit dem DataTable kenn ich mich nicht aus, aber schau mal ob dieser ein Ereignis in dieser Hinsicht hat -> dieses wäre dann weiter zuleiten.

                    Anstatt dem DataTable verwende ich lieber meine eigenen (Business-) Objekte.
                    Zumal dort diese dann Objekte im OOP-Sinn sind und keine Active-Records. Letzere machen vieles schwieriger. Meine persönliche Meinung.


                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      Ja, das DataTable hat Events, die gefeuert werden, wenn die Row oder Column geändert wird.
                      Aber die werden bei mir auch irgendwie nie ausgelösst.
                      Werd jetzt noch ein wenig weitersuchen und mich dann schreiend in die Ecke setzen

                      Comment

                      Working...
                      X