Laden...

WPF DataGrid - Column mit bestimmter Auswahl

Erstellt von userid4106 vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.632 Views
U
userid4106 Themenstarter:in
457 Beiträge seit 2006
vor 12 Jahren
WPF DataGrid - Column mit bestimmter Auswahl

Hallo,

ich bekomme aus einer Datenbank eine Tabelle die ich an mein Datagrid klemme. Eine Spalte stellt einen Integer dar. Dabei darf der Benutzer nur zwischen den Werten 1, 2 oder 3 auswählen. Wie schaffe ich es, an dieser Stelle eine Art ComboBox einzubauen, die nur diese drei Werte anzeigt und zulässt?

1.552 Beiträge seit 2010
vor 12 Jahren

Hallo Second Sun,

Durch kurze Google Suche nach "WPF datagrid combobox" und durch Anklicken des ersten Links hättest du ein super Tutorial gefunden: ComboBox in DataGrid
Du musst nur einen dementsprechenden IValueConverter für das SelectedItem einbauen der dir den Fremdschlüssel der Tablle (denn ich nehme an dass einer Exisitiert, sonst rechtfertigt sich die Auswahl nicht) in das Dazugehörige Object konvertiert und dann wieder zurück.
FK(int) => konvertieren => Anzeige als String
Nach auswahl
String => konvertieren => FK(int)

Mit dem Entity Framework ginge dies etwas einfacher

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

M
27 Beiträge seit 2010
vor 12 Jahren

Hallo zusammen,

seit .Net 4.0 ist das DataGrid aus dem WPF Toolkit in das .Net 4.0 Framework gewandert und bietet jetzt die Funktionalität DataGridComboBoxColumn zu definieren.

Mit dem SelectedValuePath-Parameter und dem SelectedValueBinding-Parameter kannst du jetzt direkt die Fremdschlüssel updates durchführen

Gruß

U
userid4106 Themenstarter:in
457 Beiträge seit 2006
vor 12 Jahren

Hey,

jo.. ist ne ganz coole Sache:-) ABER... Jetzt habe ich eine DataTable mit 6 Spalten. Davon soll eine diese ComboBox haben. Wie kann ich dann das mit einander verbinden?

M
27 Beiträge seit 2010
vor 12 Jahren

Es gibt da mehrere Möglichkeiten:

  1. Du benutzt XAML für das Layout der DataGridColumns
<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Left" Name="dg_view" VerticalAlignment="Top">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Title" Binding="{Binding Path=Title}"/>
                <DataGridComboBoxColumn Header="Category" DisplayMemberPath="Title"  SelectedValuePath="Id" SelectedValueBinding="{Binding Path=CategoryId}" x:Name="dgcbc" />
            </DataGrid.Columns>
        </DataGrid>
  1. Du erstellst die DataGridColumns im Code
DataGrid dg = new DataGrid();
DataGridComboBoxColumn dcbc = new DataGridComboBoxColumn();
dcbc.DisplayMemberPath = "Title";
dg.Columns.Add(dcbc);
U
userid4106 Themenstarter:in
457 Beiträge seit 2006
vor 12 Jahren

Das Problem ist, dass AutoGenerateColumns immer auf false ist. Ich lasse aber in der Lösung die Spalten automatisch generieren. Hast du dafür zufälligerweise auch ne Lösung parat^^?

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo Second Sun,

du kannst die Spalten ja auch einfach selbst definieren.
So wie MotS das in seinem Beispiel gezeigt hat.
Mach einfach 5 normale TextColumns und eine ComboBoxColumn und das Problem ist gelöst.

Mit den AutoGenerateColumns lässt man entweder immer alles generieren oder man macht alles selber. Ein Zwischending gibt es da sinnvollerweise nicht

Gruß
Michael

1.552 Beiträge seit 2010
vor 12 Jahren

Ich verwende eigentlich nie AutoGenerateColumns , da ich als PK immer eine ID als Identity habe und dementsprechend auch alle FK als ID gespeichert sind. Wenn das dann der User zu sehen bekommt kann er ja nichts damit anfangen. Auch lässt sich dann nicht mehr die ComboBoxColumn erstellen.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

U
userid4106 Themenstarter:in
457 Beiträge seit 2006
vor 12 Jahren

Ich muss nochmal stören:-(

Also ich hab AutoGenerateColumns jetzt doch auf false gesetzt. Damit habe ich dann mehrere Fliegen mit einer Klappe geschlagen.

Stehe jedoch immer noch vor einem Problem...

Also ich habe ja meine DataTable in der bsp. das Feld 3 als ComboBox angezeigt werden soll. Klappt soweit auch schon ABER die Combobox soll fest im Programm verankert 3 Werte zur Verfügung stellen. Sprich, wenn ich auf die Box drauf klicke dann öffnen sich nach unten drei Werte(1-3). Wie bekomme ich die da zu verrecken rein und wie kann ich den aktuell angezeigten Wert auf den Wert der aktuellen Row setzen?!

Ich verzweifel lanngsam ein bisschen...

1.552 Beiträge seit 2010
vor 12 Jahren

Wie bekomme ich die da zu verrecken rein und wie kann ich den aktuell angezeigten Wert auf den Wert der aktuellen Row setzen?!

Ich denke in meinem ersten Post habe ich einen Link gepostet der genau dies erklärt.
Stichworte: ItemsSource, SelectedItem

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

M
27 Beiträge seit 2010
vor 12 Jahren

Wie xxMUROxx schon geschrieben hat musst du die 3 Werte einfach der Combobox als Itemsource übergeben.

U
userid4106 Themenstarter:in
457 Beiträge seit 2006
vor 12 Jahren

Also das mit den Items in der ComboBox funktioniert soweit ganz gut. Ich hab irgendwie ein wenig zu kompliziert gedacht.

Allerdings verzweifel ich gerade bei dem aktuell ausgewähltem Item. Denn das funktioniert nicht so wie ich es gerne hätte. Ich hab zwar schon mit dem SelectedValuePath und den üblichen Verdächtigen rumgespielt aber es will einfach kein Standardwert angezeigt werden.

Hier mal mein Code:


            <DataGrid x:Name="DataGrid_Fahrzeuge" Background="{x:Null}" AlternatingRowBackground="#00000000" RowBackground="#00000000" BorderBrush="#FF595959" HorizontalGridLinesBrush="#FF595959" VerticalGridLinesBrush="#FF595959" Foreground="White" ColumnHeaderStyle="{DynamicResource DataGridColumnHeaderStyle1}" RowHeaderStyle="{DynamicResource DataGridRowHeaderStyle1}" SelectionMode="Single" IsTextSearchEnabled="True" CanUserReorderColumns="False" IsTabStop="True" Height="480" Width="852" AutoGenerateColumns="False" >
            	<DataGrid.Columns>
                        <DataGridComboBoxColumn x:Name="BoxTyp" ItemsSource="{StaticResource TypList}" DisplayIndex="1" Header="TRAILERBRUECKE" SelectedItemBinding="{Binding [TRAILERBRUECKE]}"/>
            	</DataGrid.Columns>
            </DataGrid>


SelectedItemBinding="{Binding [TRAILERBRUECKE]}"

Dies ist die Spalte aus der DataTable.


            DT_Fahrzeuge = (DataTable)e.Result;
            DataGrid_Fahrzeuge.ItemsSource = DT_Fahrzeuge.DefaultView;

Wo liegt der Fehler?

1.552 Beiträge seit 2010
vor 12 Jahren

Woher soll das Programm denn wissen was dein Standardwert ist? Das musst du ihm schon mitteilen welcher dies ist. Denn du sagst du möchtest zwischen 1,2,3 wählen können. Jedoch wird ein Integer mit 0 initialisiert und dieser Wert ist nicht in der ComboBox als mögliches Feld definiert und somit zeigt die ComboBox nix an. Wenn du den anfänglichen Wert auf ein Element setzt welches in der ComboBox vorhanden ist, dann hast du auch keine Probleme damit dass dir die ComboBox keinen anfänglichen Wert anzeigt.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

U
userid4106 Themenstarter:in
457 Beiträge seit 2006
vor 12 Jahren

Die Frage ist doch, WIE setze ich denn den aktuellen Wert??!!

Es soll doch einfach nur der Wert der aktuellen DataRow als aktueller Wert angezeigt werden. Gott, das kann doch nicht so schwer sein mit dieser WPF Rotze...

1.552 Beiträge seit 2010
vor 12 Jahren

Du setzt doch irgendwelche Daten als ItemsSource, so wie ich es sehe sind es Fahrzeuge. Ist es wirklich so schwer beim erstellen eines Objectes des Typ Fahrzeug den Standardwert zu setzen?

Gott, das kann doch nicht so schwer sein mit dieser WPF Rotze...

Ich verstehe deine Enttäuschun, versuche aber trotzdem dich gewählter auszudrücken. Ich denke in kurzer Zeit wirst du anders über WPF denken...

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

U
userid4106 Themenstarter:in
457 Beiträge seit 2006
vor 12 Jahren

Ne, ich setze keine Fahrzeuge sondern so ne Art Kennung für die Fahrzeuge. Diese Kennung ist als Integer in der DataTable hinterlegt.

Der Benutzer soll aber nur zwischen 3 Kennungen auswählen können. Diese sind im Programm hart hinterlegt und kommen aus keiner DataTable.

Situation ist jetzt, wir haben bereits Daten in der Tabelle:

      Name     Kennung  

Row1 Bla1 1
Row2 Bla2 0
Row3 Bla3 2

Und die schon vorhandene Kennung wird nicht als aktuelles Item ausgewählt.

Ach, und was mir gerade noch aufgefallen ist...
Ich habe ja bereits die Items in der ComboBox und sie werden mir angezeigt. Nun wähle ich eine andere Kennung in der Box aus und Verlasse die Box wieder. Nach dem Verlassen ist die Box allerdinngs wieder leer. Woran kann das denn liegen?

U
userid4106 Themenstarter:in
457 Beiträge seit 2006
vor 12 Jahren

Oh man..... Ich hab das Problem gelöst... Es hat ein Konverter gefehlt:-( So viel Zeit für so eine kleine Sache vergeudet...
ein int ist eben kein string;-)

1.552 Beiträge seit 2010
vor 12 Jahren

Klar, wenn du in der DB einen int hast, aber einen String anzeigen willst, der nicht mit dem int übereinstimmt brauchst du einen Converter. Aber das ist auch etwas was ich im ersten Post bereits angesprochen habe.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

U
userid4106 Themenstarter:in
457 Beiträge seit 2006
vor 12 Jahren

Jo, Tatsache^^ Besten Dank;-)