Benutzer mit den meisten Antworten
DataGrid alle Daten auslesen

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.
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- Als Antwort markiert DasKänguru Donnerstag, 2. April 2015 23:03
- Tag als Antwort aufgehoben DasKänguru Freitag, 3. April 2015 11:41
- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Freitag, 3. April 2015 11:47
- Als Antwort markiert Aleksander Chalabashiev Donnerstag, 16. April 2015 08:04
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- Als Antwort markiert DasKänguru Donnerstag, 2. April 2015 23:03
- Tag als Antwort aufgehoben DasKänguru Freitag, 3. April 2015 11:41
- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Freitag, 3. April 2015 11:47
- Als Antwort markiert Aleksander Chalabashiev Donnerstag, 16. April 2015 08:04
-
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.
- Als Antwort markiert Aleksander Chalabashiev Freitag, 3. April 2015 08:36
- Tag als Antwort aufgehoben Tom Lambert (Koopakiller)Moderator Freitag, 3. April 2015 11:43
-
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 -
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.
-
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 -
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 :(
- Bearbeitet DasKänguru Freitag, 3. April 2015 13:10
-
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