Combobox a vytvoření zdroje dat pro datasource, DisplayMember a ValueMember v C#   zodpovězená otázka

C#, WinForms

Mám databázi a tam tabulku ve které do jednoho sloupce ukládám hodnoty ("P", nebo "V")

Ve WinForm mám vytvořený formulář kde mám pro toto pole vytvořený Combobox.

Potřebuji tento combobox nastavit tak, aby se při rozevření zobrazoval výběr mezi dvěma možnostmi a to: "Příjem" a nebo "Výdej".

Potom když v comboboxu vyberu "Příjem" tak by to bylo jako bych vybral "P" a pokud vyberu "Vydej" tak jako že jsem vybral "V".

Stejně tak naopak, když procházím tabulkou, tak pokud by byla v tabulce hodnota "V" tak v comboboxu se zobrazí "Výdej" a podobně je to i s "P".

Do vlastnosti SelectedValue jsem vložil BindingSource z datové tabulky.

Nyní tedy potřebuji v kódu jazyce C# vytvořit NĚCO kde byly uložené hodnoty "Příjem" se kterou by souvisela hodnota "P" a dále by tam byla hodnota "Výdej" se kterou by souvisela hodnota "V"

Z tohoto bych udělal další BindingSource a ten bych navázal do vlastnosti DataSource a do vlastnosti DisplayMember bych navázal to NĚCO které by představovalo hodnoty ("Příjem" a "Výdej")

a do vlastnosti ValueMember by navázal NĚCO ze kterého by byly vybrány hodnoty ("P","V")

Tak jsem dospěl k tomu, že vlastně potřebuji poradit jak mám vytvořit to NĚCO co bych pak mohl použít jako zdroj pro BindingSource.

Asi by to byla nějaká strukturovaná konstanta se zadanými dvěma sloupci a se dvěma řádky ????

Nevím co by bylo pro tento účel nejvhodnější.

Jediné řešení které bych zatím zvládl, ale pro tento účel to nechci použít je to, že bych v databázi vytvořil další tabulku, která by měla výše zmiňované dva sloupce a vyplněné dva řádky.

Tuto tabulku bych pak použil pro BindigSource vlastnosti DataSource v Comboboxu.

Ale to je doufám zbytečné. Něco podobného bych rád vytvořil přímo v kódu aplikace v jazyce C#.

Děkuji za radu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dictionary ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Toto se tu již několikrát řešilo, když budete pořádně hledat, najdete.

Pokud jste si jistý, že tyto hodnoty nepotřebujete měnit, tak přece není nic jednoduššího, než to, že si ten Combobox naplníte ručně, nebo použijte Radiobuttony pro výběr.

Jinak bych se rozhodně nebránil tomu, vytvořit si na to tabulku, z které by se to tahalo. Pak máte možnost za běhu programu tyto položky ovlivňovat, tzn., že když se rozhodnete, že chcete např. Příjem ještě obohatit nějakým atributem, třeba "příjem ze zaměstnání", "příjem za fakturu", apod., jednoduše to přidáte jako další položku do tabulky a v ComboBoxu se Vám pak automaticky změna projeví. Když to budete mít "natvrdo", pak s tím za běhu už nehnete.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji za radu.

Kdybych věděl jak mám Combobox naplnit ručně tak, aby se při použití se zobrazila nabídka

Příjem

Výdej

Ale po volbě se do databáze uložily hodnoty:

1

-1

tak by to bylo OK, jenže jsem nikde nenašel jak to do comboboxu zapsat.

Pokud vím tak ruční naplnění Comboboxu se prování přes vlastnost Items.

Netuším jak tam vložit hodnoty pro zobrazení a hodnoty pro uložení ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

je opravdu lepší si udělat tabulku, kde budou tyto hodnoty zadány, protože pak si je můžete upravovat.

viz.

http://www.dotnetportal.cz/forum/tema/24...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

sorry nebyl jsem přihlášen...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nebo když si naplníte Combobox ručně přes Items, můžete při ukládání do DB použít vlastnost SelectedIndex, protože každá položka má svůj index (počítáno od nuly)

takže když Combobox naplníte při načtení stránky:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ComboBox1.Items.Add("Příjem")
        ComboBox1.Items.Add("Výdej")

    End Sub

pak bude SelectedIndex u položky "Příjem" rovna 0 a "Výdej" bude 1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Prvku ComboBox nastavte vlastnosti ValueMember a DisplayMember a naplňte ho objekty, které obsahují odkazované vlastnosti. Pro odlišení Příjem/Výdej můžete také použít výčtový typ (enum).

Kód pro ilustraci:

public enum Typ
{
   Prijem = 1,
   Vydej = -1
}

public class TypItem
{
   public Typ Typ { get; private set; }
   public string Oznaceni { get; private set; }

   public TypItem(Typ typ, string oznaceni)
   {
      this.Typ = typ;
      this.Oznaceni = oznaceni;
   }
}

ComboBox1.ValueMember = "Typ";
ComboBox1.DisplayMember = "Oznaceni";

ComboBox1.Items.Add(new TypItem(Typ.Prijem, "Příjem"));
ComboBox1.Items.Add(new TypItem(Typ.Vydej, "Výdej"));
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback