Announcement

Collapse
No announcement yet.

WPF DataTable in einem DataGrid ausgeben

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

  • WPF DataTable in einem DataGrid ausgeben

    Hallo Zusammen,

    ich habe ein DataGrid in einer WPF-Form (VS 2010) erstellt und möchte jetzt aus einem DataTable die Daten anzeigen lassen. Ich habe folgendes Beispiel aus dem Internet versucht darzustellen, allerdings bekomme ich leere Zeilen

    [highlight=csharp]
    private void SpaltenFuellen()
    {
    DataTable dataTable = new DataTable();

    DataColumn dc = new DataColumn();
    dataTable.Columns.Add(new DataColumn("Spalte 1"));
    dataTable.Columns.Add(new DataColumn("Spalte 2"));
    dataTable.Columns.Add(new DataColumn("Spalte 3"));
    dataTable.Columns.Add(new DataColumn("Spalte 4"));

    DataRow dataRow = dataTable.NewRow();

    dataRow["Spalte 1"] = 1;
    dataRow["Spalte 2"] = "foo";
    dataRow["Spalte 3"] = 5.689;
    dataRow["Spalte 4"] = DateTime.Now;

    dataTable.Rows.Add(dataRow);


    dataGrid1.ItemsSource = dataTable.DefaultView;

    }
    [/highlight]

    Woran könnte das liegen? Ich finde in den Beispielen immer wieder diese Vorgehensweise, jedoch kommen bei mir immer nur eine leere Zeile.

    Auch habe ich über die Properties für das DataGrid die Spalten hinzugefügt, es erscheinen zwar die Header der Spalten aber es ist nur eine leere Zeile vorhanden.

    Vielen Dank für Eure Unterstützung.

    Gruß Lerando

  • #2
    OK, ich vereinfache nur die Frage:

    Wie kann ich einfach in ein DataGrid in WPF eine Spalte mit einer Zeile und einem Wert befüllen?

    Ich finde absolut kein Beispiel im Internet, wo ich diese einfache vorgehensweise nachvollziehen kann.

    Vielen Dank für Eure Unterstüztung.

    Gruß Lerando

    Comment


    • #3
      Hallo Lerando,

      verwende besser Datenbindung anstatt per Schleife die UI selbst befüllen zu wollen. Das erspart dir all diese Probleme.

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

      Comment


      • #4
        Originally posted by gfoidl View Post
        Hallo Lerando,
        verwende besser Datenbindung anstatt per Schleife die UI selbst befüllen zu wollen. Das erspart dir all diese Probleme.
        mfG Gü
        Gerade mit dem Binden habe ich erhebliche Probleme, ich verstehe es nicht. Im Internet gibt es (nach meine Ansicht) kein einfaches Beispiel. In WinForms kann ich Datenbindungen in der Form erstellen und einfach zuordnen, aber wie kann ich das in WPF?? Und das für einen Anfänger?

        Es gibt viele Beispiele, nur sind die meistens mit DBs. Ich möchte z. B. ein DataSet (o. ä.) binden können, wo gibt es ein einfaches Beispiel?
        Von mir aus, eine Textbox an ein DataSet/DataTable/Column binden.

        DataSet hat nur eine Tabelle und nur eine Spalte. Hast Du zufällig ein Beispiel??

        Vielen Dank für Deine Antwort.

        Grüße Lerando

        Comment


        • #5
          Hallo Lerando,

          ich hab kein Beispiel, aber Data Binding Overview wird das doch recht gut erklärt.
          DataSet u. Co sind meist nicht die erste Wahl, besser wäre die Verwendung von eigenen Klassen, welche die eigene Domäne besser darstellen. Also maßgeschneiderte Klassen für das Problem, anstatt einem allgemeine Sammelkontainer.

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

          Comment


          • #6
            Vielen Dank. Das hilft mir weiter.

            Grüße Lerando

            Comment


            • #7
              Hier eine Art von Lösung:

              DataGrid habe ich in dem WPF-Fenster erstellt und über die Eigenschaften(Properties) in der Auflistung die Spalte "Name" als DataGridTemplateColumn erstellt.

              Eintrag in XAML::
              [highlight=xml]
              <DataGrid AutoGenerateColumns="False" Height="203" HorizontalAlignment="Left" Margin="41,127,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="410">
              <DataGrid.Columns>
              <DataGridTemplateColumn Header="Name">
              <DataGridTemplateColumn.CellEditingTemplate>
              <DataTemplate />
              </DataGridTemplateColumn.CellEditingTemplate>
              <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>

              <!-- EINGEFÜGT -->
              <TextBox Text="{Binding Name}"/>

              </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
              </DataGridTemplateColumn>
              </DataGrid.Columns>
              </DataGrid>
              [/highlight]

              Klasse für die Source::
              [highlight=csharp]
              using System.ComponentModel;
              namespace TestWPF
              {
              public class BindingGrid : INotifyPropertyChanged
              {
              private string _name = "";
              public string Name
              {
              get { return _name; }
              set
              {
              if (_name != value && _name != null)
              {
              _name = value;
              OnPropertyChanged(_name);
              }
              }
              }
              public event PropertyChangedEventHandler PropertyChanged;
              protected void OnPropertyChanged(string propertyName)
              {
              var v = PropertyChanged;
              if(v!=null)
              v(this,new PropertyChangedEventArgs(propertyName));
              }
              }
              }
              [/highlight]

              Methode für das DataGrid::
              [highlight=csharp]
              private void SpaltenFuellen()
              {
              ObservableCollection<BindingGrid> items = new ObservableCollection<BindingGrid>();

              items.Add(new BindingGrid() {Name = "Ein Name",});

              dataGrid1.ItemsSource = items;

              }
              [/highlight]

              Nochmals Danke für die Unterstützung.

              Grüße Lerando

              Comment


              • #8
                OnPropertyChanged(_name);

                ist nicht richtig. Du mußt den Namen verwenden, auf den das XML zugreift, also nicht den Inhalt der Property sondern deren Name:

                OnPropertyChanged("Name");


                if (_name != value && _name != null)

                ist auch nicht richtig. Du willst wahrscheinlich.

                if (_name != value && value != null)

                Edit meint: Die Abfrage würde ich aber lieber weglassen. Stell Dir vor es steht da irgendwas, und von irgendwo würde null zugewiesen.
                Dann hättest Du weiterhin den alten Inhalt, und das dürfte sehr verwirren.
                Zuletzt editiert von Günther Weber; 05.06.2013, 21:39.
                Günther

                Comment


                • #9
                  @Günther Weber::: Vielen Dank für den Hinweis.

                  Gruß Lerando

                  Comment


                  • #10
                    Hallo,

                    BTW: ab .net 4.5 gibt es für INotifyPropertyChanged, speziell für OnPropertyChanged(string) einen netten Trick der die neue Caller Information (C# and Visual Basic) nutzt.

                    Somit kann geschrieben werden:
                    [highlight=c#]
                    protected void OnPropertyChanged([CallerMemberName] string caller = "")
                    {
                    if (this.PropertyChanged != null)
                    this.PropertyChanged( this, new PropertyChangedEventArgs(caller));
                    }

                    private T _field;
                    public T MyProperty
                    {
                    get { return _field; }
                    set
                    {
                    if (_field == value) return;

                    _field = value;
                    this.OnPorpertyChanged();
                    }
                    }
                    [/highlight]
                    Den Rest übernimmt der Compiler.

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

                    Comment


                    • #11
                      Ist das nicht für VS2012???

                      Ich bekomme es nicht hin.

                      Gruß Lerando
                      Zuletzt editiert von gfoidl; 11.06.2013, 14:45. Reason: Fullquote entfernt.

                      Comment


                      • #12
                        Hallo,

                        Originally posted by gfoidl
                        BTW: ab .net 4.5
                        mfG Gü
                        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                        Comment

                        Working...
                        X