none
DataGrid alle Daten auslesen RRS feed

  • Frage

  • Hallo!

    Es geht um eine WPF-Anwendung (XAML) mit C#.

    Diese soll Daten aus einer Datenbank im Internet empfangen, in einem DataGrid übersichtlich anzeigen und der Nutzer kann die Daten verändern.

    Auf Befehl des Nutzers hin werden die Daten dann ins Internet zu der Datenbank zurückgesendet.

    Die Kommunikation mit der Datenbank (über PHP) läuft schon prima. Ich habe jetzt jeden Datensatz als Liste vorliegen

    und konnte auch schon die Werte dem DataGrid zuweisen:

    data.Add(new WebsiteWert() { Id = 1, Beschreibung = "MenuProjekte", Deutsch = "Projekte" , Englisch = "Projects"});
                //...
    
                dgUsers.ItemsSource = users;


    public class WebsiteWert
        {
            public int Id { get; set; }
    
            public string Beschreibung { get; set; }
    
            public string Deutsch { get; set; }
            public string Englisch { get; set; }
        }

    Nun müssen die Daten zur Sychronisierung wieder an den Server geschickt werden.

    Und dafür müssen die Daten wieder in die Listen umgewandelt werden.

    Ich habe bis jetzt nur Wege gefunden, die Werte der aktuellen Zelle, Zeile, Spalte auszulesen, ich benötige jedoch die gesamten Daten.

    Donnerstag, 2. April 2015 21:56

Antworten

Alle Antworten

  • Hallo,
    wenn Data eine List<WebsiteWert> ist, kannst du ItemsSource einfach wieder zurück casten:

    var data = dgUsers.ItemsSource as List<WebsiteWert>;

    Oder aber du implementierst direkt eine richtige Datenbindung mit einer ObservableColelction<T>. Das würde sich rein technisch aber kaum unterscheiden.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Donnerstag, 2. April 2015 22:21
    Moderator
  • Vielen Dank,

    so hatte ich das ursprünglich auch versucht, ich habe aber das

     as List<WebsiteWert>

    vergessen und mich dann von dem Fehler abschrecken lassen.

    Donnerstag, 2. April 2015 23:03
  • Leider funktioniert der Code nicht wie gewünscht.

    In dem Datagrid werden die Daten per TextBox editiert.

    An den Server werden aber immer noch die unbearbeiteten Daten gesendet.

    Weiß jemand, wie ich die aktuellen Daten auslesen kann?

    Freitag, 3. April 2015 11:42
  • Hallo,
    die aktuellen Daten bekommst du wieder aus ItemsSource. So wie ich es dir gezeigt habe.

    Der Fehler muss irgendwo anders liegen.

    (Ich gehe mal davon aus, dass du mit "bearbeiten durch TextBox" das bearbeiten direkt im DG meinst.)


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Freitag, 3. April 2015 11:47
    Moderator
  • List<WebsiteWert> data = new List<WebsiteWert>();
    data = dgUsers.ItemsSource as List<WebsiteWert>;
    

    So werden die Daten ausgelesen.

    XAML-Code für DataView:

    <DataGrid Name="dgUsers" AutoGenerateColumns="False">
                <DataGrid.Columns>
    
                    <DataGridTextColumn Header="Beschreibung" Binding="{Binding Beschreibung}" />
    
                    <DataGridTemplateColumn Header="Deutsch">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Deutsch}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="Englisch">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Englisch}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
    Nun, nachdem der Text in einem TextBox verändert wird, sind die Daten in der Liste immer noch die Gleichen, welche vorher in das DataGrid geladen werden.

    Freitag, 3. April 2015 12:09
  • Das Problem ist, das das CellTemplate nur dem Anzeigen der Werte dient. Um einen Wert zu bearbeiten musst du das CellEditingTemplate überschreiben. Dort müsstest du dann ein TwoWay-Binding einbauen:

    {Binding Deutsch, Mode=TwoWay}
    Allerdings würde ich dir sowieso empfehlen DataGridTextColumn zu verwenden. Diese bieten bereits alles nötige um Strings zu bearbeiten. (Man muss einen Doppelklick auf eine Zelle machen, um diese zu bearbeiten.)

    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Freitag, 3. April 2015 12:19
    Moderator
  • Ich bin jetzt erst mal bei den TextBoxen geblieben.

    Doch auch mit dem TwoWay Mode funktioniert es nicht.

    public partial class MainWindow : Window
        {
            List<WebsiteWert> data = new List<WebsiteWert>();
            public MainWindow()
            {
                InitializeComponent();
                data = NoscioAccess.get();  //Daten empfangen
                dgUsers.ItemsSource = data; //Daten anzeigen
            }
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                data = dgUsers.ItemsSource as List<WebsiteWert>; //Daten auslesen
                MessageBox.Show(data[0].Deutsch);                //Test: Geänderte Datensatz anzeigen
                NoscioAccess.set(data);                          //Daten senden
            }
        }

    XAML-Code:

    <DataGrid Name="dgUsers" AutoGenerateColumns="False">
                <DataGrid.Columns>
    
                    <DataGridTextColumn Header="Beschreibung" Binding="{Binding Beschreibung, Mode=TwoWay}" />
    
                    <DataGridTemplateColumn Header="Deutsch">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Deutsch, Mode=TwoWay}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="Englisch">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Englisch, Mode=TwoWay}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

    Hier noch der Code zu dem WebsiteWert-Datentyp:

    class WebsiteWert
        {
            public string Beschreibung { get; set; }
            public string Deutsch { get; set; }
            public string Englisch { get; set; }
        }

    Hab ich die Bindings richtig gesetzt und lese ich die Daten richtig aus, oder wo liegt sonst mein Fehler?

    Irgendwie steh ich grad auf der Leitung :(


    Freitag, 3. April 2015 13:04
  • Das Problem ist, das das CellTemplate nur dem Anzeigen der Werte dient.

    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Freitag, 3. April 2015 13:24
    Moderator