Autor Beitrag
Red
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 01.07.15 13:47 
Ich beiß mir hier die Zähne an folgender Aufgabe aus:
Ich hab einen Datareader, der eine Combobox befüllen soll. Hier hab ich 2 Spalten - die Id und die Bezeichnung.
Für den User würde die Anzeige der Bezeichnung reichen, wobei beide Spalten besser wären. Die Id brauch ich für die Auswertung der Selektion. Die Combobox wird korrekt angezeigt.

Meine 2 Fragen:
Wie erhalte ich die Id (=S1SHK) aus der selektierten Zeile, nachdem die selektierte Zeile kein Einzelwert ist?
Kann ich beim "betanken" der Combobox die Vorauswahl nur durch den Index als Zeilenzähler vornehmen, oder geht es auch direkt über die Id "S1SHK"?


Mein bisheriger Ansatz sieht folgendermaßen aus:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
    <Window.Resources>
        <DataTemplate x:Key="cbxProduktionsketteTemplate">
            <StackPanel Orientation="Horizontal">
                <Border BorderThickness="1" Width="200" BorderBrush="Gray" Padding="0">
                    <TextBlock Text="{Binding Path=S1SHK}"/>
                </Border>
                <Border BorderThickness="1" Width="200" BorderBrush="Gray" Padding="0">
                    <TextBlock Text="{Binding Path=S1BEZ}"/>
                </Border>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>

    <ComboBox x:Name="cbxProduktionskette" HorizontalAlignment="Left" Margin="60,0,0,0" BorderThickness="1"  VerticalAlignment="Top" Height="20" Width="200" Background="Yellow" 
        ItemTemplate="{StaticResource cbxProduktionsketteTemplate}" Style="{DynamicResource ComboBoxStyleGelb}" SelectionChanged="cbxProduktionskette_SelectionChanged"
        <ComboBox.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Background="LightYellow" Orientation="Vertical"/>
            </ItemsPanelTemplate>
        </ComboBox.ItemsPanel>
    </ComboBox>

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
while (myReader.Read())
{
    temptbl.Add(new cbxProduktionskettenzeile() 
    {
        S1SHK = myReader.GetString(0).ToString(), 
        S1BEZ = myReader.GetString(1).ToString()
    });
}

cbxProduktionskette.ItemsSource = temptbl; 


private void cbxProduktionskette_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    //MessageBox.Show(cbxProduktionskette.SelectedValue); "Kann nicht von "object" in "string" konvertiert werden."
}

public class cbxProduktionskettenzeile
{
    public string S1SHK { get; set; }
    public string S1BEZ { get; set; }
}

Besten Dank für eure Unterstützung ...

Moderiert von user profile iconTh69: XML-Tags hinzugefügt
Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 01.07.15 16:18 
Hallo Red,

hier siehst du jetzt wohl, daß es mit dieser Vorgehensweise bei WPF schwer wird, weiterzukommen.
Wie in Binding aktualisiert nicht schon geschrieben, rate ich dir zu MVVM, so daß du dann im ViewModel mit den konkreten Daten und Typen arbeiten kannst (anstatt über die WPF-Controls, welche nur object als ItemsSource kennen, d.h. du per Casting arbeiten müßtest).
Red Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 02.07.15 14:19 
Hallo Th69,

in meinem ersten Beitrag lag der Pferdefuß im MVVM, da hier explizit OnPropertyChanged angegeben werden musste.

Aber sollte es jemanden interessieren, hier der von dir angesprochene funktionierende CAST:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
private void cbxProduktionskette_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var selectedKombi = cbxProduktionskette.SelectedItem as cbxProduktionskettenzeile;
    MessageBox.Show(selectedKombi.S1SHK);
}


Moderiert von user profile iconTh69: C#-Tags hinzugefügt