C# WPF comboboxban több oszlop adatbázisból

C# WPF comboboxban több oszlop adatbázisból
2013-05-24T15:31:33+02:00
2013-05-26T13:22:18+02:00
2022-11-29T03:00:33+01:00
iolah2
Sziasztok!
Van egy adatbázisom nagy táblákkal (Entity Framework-el). WPF-ben Comboboxban szeretném, hogy amikor lenyítom akkor a táblázat Cikkszám, Rajzszám, Név elemét lássam egymás mellett és ha választok, csak a külön beállítottat(pl.: Cíkkszám) írja a comboBoxomba, továbbá jegyezze meg a tábla elem ID-jét is. Ezt hogy érdemes Entity Framework-ős(.edmx,.Designer.cs)-el megcsinálni?
Köszi

Tehát röviden: adatbázisból célom hogy a combobox megmutassa a tábla elemeinek 3 tulajdonságát, s ha választok, jegyezze meg a választott elem azonosíítóját(4. tulajdonság) és kiírja a kiválasztott tulajdonságot(a 3-bol, előre megadottan)
Mutasd a teljes hozzászólást!
Csatolt állomány
Ennek az EF-hez nincs közvetlen köze.

Csinálj egy ViewModel-t, ami tartalmazza az ID-t és a ComboBox-ban megjelenítendő szöveget. Ezt töltsd fel EF-ből (de akár statikus is lehetne, vagy XML-ből jövő adatok, vagy akármi).

Utána ezt lehet bind-olni a ComboBox-hoz.

Nézd meg Dante kolléga WPF tutorial-jának első 3 leckéjét arról, hogy hogyan működik a ViewModel!
Mutasd a teljes hozzászólást!

  • Akkor a ViewModel a legjobb hozzá? Akkor köszi. Hogyan érdemes utána Bindolni? Azaz Az itemsSource és egyebek közül, mihez melyiket csatoljam, mit használjak közülük.
    Illetve Issyncronizedwith kell valamihez?
    Köszi
    Mutasd a teljes hozzászólást!
  • Legalábbis én így csinálnám.

    Nézd meg a tutorialt! ItemsSource-nak add meg az ObservableCollection<Model>-edet, ahol a Model tartalmazza az ID-t és a szöveget!

    Így mindent szépen elszeparálsz.
    Mutasd a teljes hozzászólást!
  • Ha az ID-t csak tudni szeretném, de nem akarom láthatónak, akkor hogy érdemes az ObservableColl-est megcsinálni, vagy mit érdemes az egészen változtatni(Az ID másik mezőhöz kell, de megtekinteni nem szeretném)
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Szia, írtam hozzá a következő DataTemplate-et. De a DisplayMemberPath-ra és a másikra azt írja ezzel együtt nem használható. Mint látható, három oszlopban akarom megjeleníteni lenyitáskor, de választáskor csak egy adatot szeretnék kiírni és az Id-t eltárolni
    Köszi
    <Window.Resources>
    <DataTemplate x:Key="Alkatresz1">
    <Grid Height="50" Width="150" ShowGridLines="True">
    <Grid.ColumnDefinitions>
    <ColumnDefinition/>
    <ColumnDefinition/>
    <ColumnDefinition/>
    <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Column="1" Width="50" Text="{Binding Név}" Style="txtStyle"/>
    <TextBlock Grid.Column="0" Width="50" Text="{Binding Cikkszám}" Style="txtStyle"/>
    <TextBlock Grid.Column="2" Width="50" Text="{Binding Rajzszám}" Style="txtStyle"/>
    <TextBlock Grid.Column="3" Width="50" Text="{Binding AlkID}" Style="txtStyle"/>
    </Grid>
    </DataTemplate>
    </Window.Resources>

    <ComboBox x:Name="cikkSzam" Width="120" Canvas.Left="75" Canvas.Top="0"
    ItemsSource="{Binding MyAlkReszCollection}"
    ItemTemplate="{StaticResource Alkatresz1}"
    DisplayMemberPath="Név"
    SelectedValuePath="AlkID"
    >
    Mutasd a teljes hozzászólást!
  • egymást kizáró attributumokat adtál meg.

    Mivel van egy template-d ami megmutatja az osztályod minden publikus tulajdonságát ezért nem használhatod a DisplayMemberPath-ot.

    A template-ben szép adatkötéssel hozzáférsz amihez szeretnél.
    Amennyiben nem használsz template-t, de az adott osztálynak csak egy tulajdonságát szeretnéd kiírni akkor kell a DisplayMemberpath-ot használni.

    Jelen esetben kiírná a név tulajdonságot ha az ItemTemplate-t törlöd (szokj le az ékezetekről változóneveknél)

    Továbbá szerintem sokkal jobban jársz, ha a SelectedValuepath-ot sem adod meg.
    Hozz létre egy publikus tulajdonságot a privát változóval
    public MyAlkResz SelectedAlkatresz {get set - onpropertychanged}

    <Combobox ... SelectedItem={Binding SelectedAlkatresz}..>

    Ez esetben a SelectedAlkaltresz tartalmazni fogja a kiválasztott elemet.
    Az AlkID pedig könnyen kiszedhető belőle
    Mutasd a teljes hozzászólást!
  • A Template-et ahhoz probáltam használni, hogy egyszerre(3, most 4) oszlopot jelenítsen meg amikor lenyitom, de csak egy érték kell a mezőbe, helyette akkor mit érdemes használnom.
    Az ékezetek tudtommal nem zavarják a c#-ot és az SQL-t csak ha angol billentyűzetem van, nem
    köszönöm
    Mutasd a teljes hozzászólást!
  • nekem mindegy mit szoksz meg.
    Csak tanács, hogy a változóid legyenek angolok

    amit szeretnél azt szvsz csak elég bonyolúltan lehet megoldani.
    Ezek közül az egyszerűbb verzió


    public class Person { public string Name { get; set; } public int Age { get; set; } public Person(string name, int age) { Name = name; Age = age; } } public partial class MainWindow : Window { public ObservableCollection<Person> PersonCollection {get;set;} public Person SelectedPerson { get; set; } public MainWindow() { InitializeComponent(); PersonCollection = new ObservableCollection<Person>() { new Person("kati", 18), new Person("pisti",24), new Person("judit", 15) }; DataContext = this; } }


    <Grid> <Grid.Resources> <DataTemplate x:Key="MyTemplate"> <Grid> <Grid> <Grid.Style> <Style TargetType="Grid"> <Setter Property="Visibility" Value="Collapsed"/> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ComboBoxItem}, Path=IsSelected}" Value="{x:Null}"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> </Style.Triggers> </Style> </Grid.Style> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Name}" Foreground="Red"/> </StackPanel> </Grid> <Grid> <Grid.Style> <Style TargetType="Grid"> <Setter Property="Visibility" Value="Visible"/> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ComboBoxItem}, Path=IsSelected}" Value="{x:Null}"> <Setter Property="Visibility" Value="Collapsed"/> </DataTrigger> </Style.Triggers> </Style> </Grid.Style> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Name}"/> <TextBlock Text="{Binding Age}"/> </StackPanel> </Grid> </Grid> </DataTemplate> </Grid.Resources> <ComboBox Height="20" VerticalAlignment="Top" ItemTemplate="{StaticResource MyTemplate}" ItemsSource="{Binding PersonCollection}"/> </Grid>

    magyarra lefordítva az alapján, hogy egy elem kiválasztott-e vagy sem változtatja a láthatóságát
    Mutasd a teljes hozzászólást!
  • Köszi, remélem ez jó lesz.
    Egy kérdésem lenne most: van 55740 elemem az alkatrészekben, így az ObservableCollection-t használó combobox elég lassan nyílik meg(legalábbis debug-gal). Ezen hogy érdemes/lehet-e gyorsítani?
    Mutasd a teljes hozzászólást!
  • ha mindet be akarod rakni, akkor sehogy

    logikusan átgondolva, senki se fog 50e elemet átnézni
    próbáld kissebb csoportokra bontani
    Az hogy ez alkatrészenkénti csoportosítás, vagy 50 elemenként csinálod igazából tőled függ
    Mutasd a teljes hozzászólást!
  • Szia
    Bocsi a sok kérdésért. Lenne még egy fontos kérdésem.
    A "verzió" jól működik amit küldtél, a gondom annyi lenne, hogy adatkötéssel a háttérből szeretném megadni
    1) Cikkszám, vagy Rajzszám legyen a kiválasztott mezőbe írva,
    2) közben az azonosítóját hogy kérjem le(AlkId)
    3) A megjelenítésnél a grid oszlopait különböző sorrendben szeretném rendezni(azaz a grid.column-ot is a háttérfájlból beállítani)
    Küldöm a kinézetet:

    <Window.Resources>

    <DataTemplate x:Key="MyTemplate">
    <Grid>

    <Grid>
    <Grid.Style>
    <Style TargetType="Grid">
    <Setter Property="Visibility" Value="Collapsed"/>
    <Style.Triggers>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ComboBoxItem}, Path=IsSelected}" Value="{x:Null}">
    <Setter Property="Visibility" Value="Visible"/>
    </DataTrigger>
    </Style.Triggers>
    </Style>
    </Grid.Style>
    <StackPanel Orientation="Horizontal">
    <TextBox Text="{Binding Cikkszám}" Foreground="Red"/>
    </StackPanel>
    </Grid>

    <Grid>
    <Grid.Style>
    <Style TargetType="Grid">
    <Setter Property="Visibility" Value="Visible"/>
    <Style.Triggers>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ComboBoxItem}, Path=IsSelected}" Value="{x:Null}">
    <Setter Property="Visibility" Value="Collapsed"/>
    </DataTrigger>
    </Style.Triggers>
    </Style>

    </Grid.Style>
    <Grid ShowGridLines="True">
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="50"/>
    <ColumnDefinition Width="200"/>
    <ColumnDefinition Width="60"/>

    </Grid.ColumnDefinitions>

    <TextBlock Text="{Binding Cikkszám}" Grid.Column="0"/>
    <TextBlock Text="{Binding Név}" Grid.Column="1"/>
    <TextBlock Text="{Binding Rajzszám}" Grid.Column="2"/>

    </Grid>
    </Grid>

    </Grid>
    </DataTemplate>
    </Window.Resources>
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd