| 

.NET C# Java Javascript Exception

3
Hallo, ich versuche gerade in einem DataGrid Daten zu verwalten. Ich finde jedoch das WPF Datagrid sehr kompliziert im Umgang.
Ich möchte in einem Fenster das Grid haben und nach dem Schließen des Fensters sollen die Veränderten Daten ausgelesen werden können; ich weiß jedoch nicht wie das gehen soll, da ich im Internet immer nur TUTs mit fest definierten Daten fand. Die Daten werden als List<T> am Konstruktor des Fensters an dieses übergeben und sollen über ein Property abgerufen werden können.
Das XAML sieht ungefähr so aus:
<Window x:Class="StundenplanMaker.LURManagingWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:[...]"

Title="Verwalten" Height="319" Width="471" WindowStartupLocation="CenterOwner" xmlns:my="clr-namespace:StundenplanMaker">

<Window.Resources>
<ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="Lehrer_Geschlechter_Enums">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:Lehrer_Geschlechter"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>

<Grid>
<TabControl Name="tabControl1">
<TabItem Header="Lehrer" Name="tabItem1" IsSelected="True">
<Grid>
<DataGrid AutoGenerateColumns="False" Margin="10,6,6,31" Name="dgLehrer"
SelectionMode="Single" SelectionUnit="CellOrRowHeader"
CanUserDeleteRows="True">
CanUserReorderColumns="False" CanUserSortColumns="False"
RowEditEnding="dgLehrer_RowEditEnding"
CellEditEnding="dgLehrer_CellEditEnding">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTextColumn Header="Vorname" Binding="{Binding Vorname}" />
<DataGridTextColumn Header="Kürzel" Binding="{Binding Kuerzel}" />
<DataGridTextColumn Header="Titel" Binding="{Binding Titel}" />
<DataGridComboBoxColumn Header="Geschlecht"
SelectedItemBinding="{Binding Geschlecht}"
ItemsSource="{Binding Source={StaticResource Lehrer_Geschlechter_Enums}}"
/>
</DataGrid.Columns>
</DataGrid>
<Button Content="Debug_OK" Height="23" HorizontalAlignment="Left" Margin="10,0,0,6" Name="button1" VerticalAlignment="Bottom" Width="75" Click="button1_Click" />
</Grid>
</TabItem>
<TabItem Header="Fächer" IsSelected="False" />
<TabItem Header="Räume" />
</TabControl>
</Grid>
</Window>

(siehe auch hier.)
Das enum sieht so aus:
/// <summary>
/// Gibt das Geschlecht der Lehrer an.
/// </summary>
[DataContract([...])]
public enum Lehrer_Geschlechter
{
/// <summary>
/// Gibt an, dass es sich um einen Mann handelt.
/// </summary>
Mann = 1,
/// <summary>
/// Gibt an, dass es sich um eine Frau handelt.
/// </summary>
Frau = 2
}

Die struct so:
/// <summary>
/// Repräsentiert einen Lehrer.
/// </summary>
[DataContract([...])]
public struct Lehrer
{
/// <summary>
/// Der Nachname des Lehrers.
/// </summary>
[DataMember(IsRequired = true)]
public string Name
{
get;
set;
}

/// <summary>
/// Der Vorname des Lehrers.
/// </summary>
[DataMember(IsRequired = true)]
public string Vorname
{
get;
set;
}

/// <summary>
/// Das Kürzel des Lehrers.
/// </summary>
[DataMember(IsRequired = true)]
public string Kuerzel
{
get;
set;
}

/// <summary>
/// Gibt Titel an, die der Lehrer besitzt.
/// </summary>
[DataMember(IsRequired = true)]
public string Titel
{
get;
set;
}

/// <summary>
/// Das Geschlecht des Lehrers.
/// </summary>
[DataMember(IsRequired = true)]
public Lehrer_Geschlechter Geschlecht
{
get;
set;
}

/// <summary>
/// Instanziert einen neuen Wertetyp der "Lehrer"-Struktur.
/// </summary>
/// <param name="pName">Der Nachname des Lehrers.</param>
/// <param name="pVorname">Der Vorname des Lehrers.</param>
/// <param name="pKuerzel">Das Kürzel des Lehrers.</param>
/// <param name="pGeschlecht">Das Geschlecht des Lehrers.</param>
/// <param name="pTitel">Gibt Titel an, die der Lehrer besitzt.</param>
public Lehrer(string pName, string pVorname, string pKuerzel, Lehrer_Geschlechter pGeschlecht, string pTitel)
{
this = new Lehrer()
{
Kuerzel = pKuerzel,
Geschlecht = pGeschlecht,
Vorname = pVorname,
Name = pName,
Titel = pTitel
};
}
}

Das Fenster so:
public partial class LURManagingWindow : Window
{
public LURManagingWindow(List<Lehrer> pLehrerList)
{
InitializeComponent();

this.dgLehrer.ItemsSource = /* ??? */;
}

/// <summary>
/// Verwaltet alle vom Benutzer hinzugefügten Lehrer. Sie werden von außen abgerufen.
/// </summary>
public List<Lehrer> LehrerList
{
get;
private set;
}
}
News:
18.09.2012
asdfghjkl5670 15 4
Wo weist Du denn den DataContext zu? Und ist das dann die List<T>, von der Du sprichst? Oder hast Du ein ViewModel, weil Du sagst: "Die Daten werden als List<T> am Konstruktor übergeben und sollen über ein Property abgerufen werden können."? Welcher Konstruktor?
ffordermaier 18.09.2012
2 Antworten
1
Wieso oft führen auch hier verschiedene Wege nach Rom. Du solltest Dich eher früher als später mal mit MVVM und Data Binding befassen. Außerdem gibt es einen sehr ausführlichen (aber auch anspruchsvollen und leider schon etwas älteren) Artikel zum DataGrid bei Code Project. Ich habe den Link gleich auf die Stelle gesetzt, wo es (nach der Einleitung) interssant wird, denn der Teil mit DataTable wirkt auf mich etwas angestaubt.

So, nun aber zu einer konkreten Lösung. Du solltest als ItemsSource eine ObservableCollection verwenden. Hier wurde schon mal die Frage beantwortet, wie man das mit dem DataGrid macht. Du solltest Dir außerdem diese ObservableCollection in Deiner Window-Klasse merken. Wenn das Fenster dann zugemacht wird, kannst Du dieses Event abfangen und dann auf die Collection zugreifen. Du solltest dann darin die geänderten Werte vorfinden.
18.09.2012
Matthias Hlawatsch 13,2k 4 9
0
Danke die Frage hat sich also geklärt; es trat jedoch ein neues Problem auf:
http://codekicker.de/fragen/DataGrid-InvalidOperationException-Navigation-Pfeiltasten-DataGrid
19.09.2012
asdfghjkl5670 15 4

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH