Entwickler-Ecke

WPF / Silverlight - DataGrid - Separater ComboBox-Inhalt in DataGrid einfügen


Kirk1701A - Mo 06.11.17 10:47
Titel: DataGrid - Separater ComboBox-Inhalt in DataGrid einfügen
Hi Leute,

ich bin an einem sog. Noten Wizard und muss mit ComboBoxen Fächer, Noten, Lehrer auswählen und diese in ein DataGrid einsetzen. Ausserdem muss ich den Inhalt in eine Textdatei speichern, was ich auch nicht hinbekomme.

Hier mein XAML:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
<Window x:Class="Noten_Organizer_Ver._1._1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Noten_Organizer_Ver._1._1"
        mc:Ignorable="d"
        Title="Noten Wizard" Height="630" Width="940" ResizeMode="CanMinimize" Background="#FFBDB7B7" WindowStartupLocation="CenterScreen" Icon="Wizard.ico">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="5*"/>
            <ColumnDefinition Width="35*"/>
            <ColumnDefinition Width="138*"/>
            <ColumnDefinition Width="75*"/>
            <ColumnDefinition Width="5*"/>
            <ColumnDefinition Width="75*"/>
            <ColumnDefinition Width="5*"/>
            <ColumnDefinition Width="150*"/>
            <ColumnDefinition Width="5*"/>
            <ColumnDefinition Width="150*"/>
            <ColumnDefinition Width="5*"/>
            <ColumnDefinition Width="100*"/>
            <ColumnDefinition Width="5*"/>
            <ColumnDefinition Width="100*"/>
            <ColumnDefinition Width="64*"/>
            <ColumnDefinition Width="6*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="20"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="25"/>
            <RowDefinition Height="25"/>
            <RowDefinition Height="396*"/>
            <RowDefinition Height="40"/>
            <RowDefinition Height="25"/>
            <RowDefinition Height="15"/>
            <RowDefinition Height="1"/>
        </Grid.RowDefinitions>
        <Button Name="Speichern" Content="Speichern" Grid.Column="13" Grid.Row="6" BorderBrush="Black" Click="Speichern_Click"/>
        <Button Name="Beenden" Content="Beenden" Grid.Column="11" Grid.Row="6" BorderBrush="Black" Click="MenuItem_Click_1"/>
        <Label Name="Fach_lbl" Content="Fach:" Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="1" FontWeight="Bold" FontSize="18" FontStyle="Italic"/>
        <ComboBox Name="Fach" BorderBrush="Black" Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="2" VerticalContentAlignment="Center" IsEditable="True">
            <ComboBoxItem Content="Deutsch"></ComboBoxItem>
            <ComboBoxItem Content="Englisch"></ComboBoxItem>
            <ComboBoxItem Content="IT-Systeme"></ComboBoxItem>
            <ComboBoxItem Content="Vernetzte Systeme"></ComboBoxItem>
            <ComboBoxItem Content="Anwendungsprogrammierung"></ComboBoxItem>
            <ComboBoxItem Content="Religion"></ComboBoxItem>
            <ComboBoxItem Content="Sozialkunde"></ComboBoxItem>
            <ComboBoxItem Content="BWP"></ComboBoxItem>
        </ComboBox>
        <Label Name="Note_lbl" Content="Note:" Grid.Column="5" Grid.Row="1" FontWeight="Bold" FontSize="18" FontStyle="Italic"/>
        <ComboBox Name="Note" BorderBrush="Black" Grid.Column="5" Grid.Row="2" VerticalContentAlignment="Center">
            <ComboBoxItem Content="1"></ComboBoxItem>
            <ComboBoxItem Content="2"></ComboBoxItem>
            <ComboBoxItem Content="3"></ComboBoxItem>
            <ComboBoxItem Content="4"></ComboBoxItem>
            <ComboBoxItem Content="5"></ComboBoxItem>
            <ComboBoxItem Content="6"></ComboBoxItem>
        </ComboBox>
        <Label Name="Lehrer_lbl" Content="Lehrer:" FontSize="18" FontStyle="Italic" FontWeight="Bold" Grid.Column="7" Grid.Row="1"/>
        <ComboBox Name="Lehrer" Text="Bitte wählen Sie aus..." BorderBrush="Black" Grid.Column="7" Grid.Row="2" IsEditable="True">
            <ComboBoxItem Content="Thiel"></ComboBoxItem>
            <ComboBoxItem Content="Yilmaz"></ComboBoxItem>
            <ComboBoxItem Content="Jaud"></ComboBoxItem>
            <ComboBoxItem Content="Bettio"></ComboBoxItem>
            <ComboBoxItem Content="Eichert"></ComboBoxItem>
            <ComboBoxItem Content="Gerstmayr"></ComboBoxItem>
            <ComboBoxItem Content="Zerchau"></ComboBoxItem>
        </ComboBox>
        <DatePicker Name="Datum" Grid.Column="9" Grid.Row="2" VerticalContentAlignment="Center" HorizontalContentAlignment="Stretch" Background="#FFBDB7B7" BorderBrush="Black"/>
        <Button Name="Note_eintragen" Content="Note eintragen" FontWeight="Medium" TextOptions.TextFormattingMode="Display" Grid.Column="13" Grid.ColumnSpan="2" Grid.Row="2" Click="Note_eintragen_Click"/>
        <RadioButton Name="Ex" Content="Ex" Grid.Column="11" Grid.Row="1" VerticalAlignment="Center" Margin="0,9,0,8" Height="14" Click="Ex_Click"/>
        <RadioButton Name="Schulaufgabe" Content="Schulaufgabe" Grid.Column="11" Grid.Row="2" VerticalAlignment="Top" Margin="0,6,0,0" Height="16" Click="Schulaufgabe_Click"/>
        <Label Name="schnitt" Content="Durchschnitt insgesamt:" Grid.Column="2" Grid.Row="6" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="11" Height="26" Width="126"/>
        <Label Name="notenschnitt" Content="Test" Grid.Column="3" Grid.Row="6" VerticalAlignment="Top" FontSize="11"/>
        <DataGrid Name="Liste" Grid.Column="1" Grid.ColumnSpan="14" Grid.Row="4" CanUserResizeRows="False" CanUserResizeColumns="False" RowDetailsVisibilityMode="Visible" BorderBrush="Black" Background="#FFE8E8E8" AlternatingRowBackground="Gray" AlternationCount="2">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Fach" Width="100"/>
                <DataGridTemplateColumn Width="50" Header="Note"/>
                <DataGridTemplateColumn Width="100" Header="Lehrer"/>
                <DataGridTemplateColumn Width="150" Header="Datum"/>
                <DataGridTemplateColumn Width="100" Header="Typ"/>
            </DataGrid.Columns>
        </DataGrid>
        <Menu Name="Menü" Background="#FF8F8F8F" Grid.Column="0" Grid.ColumnSpan="2">
            <MenuItem Header="Datei" Height="20" Width="40">
                <MenuItem Header="Fach hinzufügen" Command="Close" Click="MenuItem_Click_2"/>
                <MenuItem Header="Lehrer hinzufügen" Command="Close" Click="MenuItem_Click_3"/>
                <MenuItem Header="Info" Click="MenuItem_Click"/>
                <Separator />
                <MenuItem Header="Beenden" Click="MenuItem_Click_1"/>
            </MenuItem>
        </Menu>
    </Grid>
</Window>


Ich sende bewusst keinen C#-Code, weil noch kein relevanter Code vorhanden ist. Lediglich Beenden, Datei(oben links alles, was drin ist) funktionieren.

Vielen Dank für eure Hilfe.

Euer Kirk


Christian S. - Mo 06.11.17 11:14

Hallo,

wir helfen Dir gerne, Deine Sachen selber zu lösen. Aber wir werden für Dich nicht Deine Aufgaben erledigen.
Also: zeige Eigeninitiative und wir helfen weiter, wo es hakt. :zustimm:

Grüße
Christian


Kirk1701A - Mo 06.11.17 11:22

Hi Christian,

mir ist schon bewusst, dass ich meine Aufgaben selber lösen muss. :!: Aber manche Sachen (siehe oben) sind zu spezifisch, um diese richtig googlen zu können. Ich habe bestimmt 1 Monat nach einer gescheiten Antwort gesucht :lupe: :les: :eyecrazy: :autsch: :lupe: :les: und nichts gescheites* gefunden. Überall wird erklärt, wie man ComboBoxen in ein DataGrid setzt und nicht den Inhalt in ein DataGrid schreibt. Und wenn ich was gefunden habe, ist es entweder auf Englisch (fließtext) oder zu kryptisch geschrieben. :?: Ich werde schon wirklich die Eigeniniziative zeigen, aber dazu brauche ich ein paar Gedankenstöße. :idea: :idea: :gruebel:


Euer Kirk



* etwas, das ich anwenden, und verstehen kann


Ralf Jansen - Mo 06.11.17 13:08

Zitat:
Überall wird erklärt, wie man ComboBoxen in ein DataGrid setzt und nicht den Inhalt in ein DataGrid schreibt


Weil man das ja auch nicht tut :wink:

Controls wie Comboboxen oder DataGrids zeigen die Daten an die in deinem Programm definiert sind. Man ändert die Datenstrukturen hinter den Controls um die Anzeige der Controls zu beeinflussen man manipuliert nicht direkt die Controls. Idealerweise (ist schwer ohne Erfahrung ich weiß) designst du die Vorgänge in deiner Anwendung ohne eine UI vor Augen zu haben. Wenn du die Datenstrukturen hast und die Funktionen diese zu manipulieren dann mußt du diese Struktur nur noch passenden an die UI Controls binden und es wird ~automatisch~ das richtige passieren und angezeigt werden.

Wenn du also etwas in einem DatagGrid ändern willst dann ändere die Datenstruktur dahinter und aktualisiere dann einfach die Ansicht des DataGrids. Wenn du Databinding einsetzt so wie in WPF vorgesehen dann passiert dieser Schritt des aktualisierens auch automatisch.


Kirk1701A - Mo 06.11.17 15:05

Hi Leute,

geht es auch, wenn ich den Inhalt an eine .txt Datei sende und dann (in der selben Funktion) von der .txt Datei ins DataGrid schreiben lasse?
Ich habe eine halbwegs befriedigende Seite gefunden, bei der es erklärt wird. Ich habe es ausprobiert, aber es funktioniert leider nicht (ich verlange nicht, dass Ihr den Code prüft :wink: ).
WPF Combobox: Binding auf Selected Item??? [https://www.mycsharp.de/wbb2/thread.php?threadid=67049]

Kann auch sein, dass wir aneinander vorbeigesprochen haben. Ich habe mehrere ComboBoxen und muss den ausgewählten Inhalt an ein DataGrid senden.

Euer Kirk

Moderiert von user profile iconTh69: URL-Titel hinzugefügt.


Ralf Jansen - Mo 06.11.17 15:37

Zitat:
geht es auch, wenn ich den Inhalt an eine .txt Datei sende und dann (in der selben Funktion) von der .txt Datei ins DataGrid schreiben lasse?


Gehn würde das, Sinn macht es nur nicht wenn du eigentlich keine Datei brauchst sondern nur für diesen Vorgang benutzt.


Kirk1701A - Mo 06.11.17 16:05

Hi Leute,

ich brauche so oder so eine .txt Datei, weil ich den DataGrid-Inhalt irgendwo speichern muss und mir eine .txt Datei vorgeschrieben wurde. Muss man das über Bindings machen, oder geht das anders?

Euer Kirk


Ralf Jansen - Mo 06.11.17 16:13

Dann wäre der richtigste Weg eine Datenstruktur im Speicher zu haben die deine Daten beschreibt.
Dann kannst du a.) diese Datenstruktur aus einer Datei lesen/schreiben und b.) diese Datenstruktur an ein Control binden.
Hat den wichtigen Nebeneffekt das die Probleme (anzeigen, persistieren) getrennt bleiben. Zerlege also dein Problem in kleinere Probleme die einzeln leicht zu lösen sind (Teile und herrsche [https://de.wikipedia.org/wiki/Teile-und-herrsche-Verfahren])


Kirk1701A - Mo 06.11.17 16:16

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
und b.) diese Datenstruktur an ein Control binden.

Meinst du die ComboBoxControl?


Ralf Jansen - Mo 06.11.17 16:22

Bei Control meine ich ComboBox, DataGrid usw. Wenn ich von Datenstruktur spreche meine ich irgendwelche Klassen die deine Daten halten. Nichts was irgendwo irgendwas mit der Anzeige zu tun hat.