DataGridView a dynamické property na tříde Datasource – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

DataGridView a dynamické property na tříde Datasource – .NET – Fórum – Programujte.comDataGridView a dynamické property na tříde Datasource – .NET – Fórum – Programujte.com

 

VladislavK0
Super člen
2. 8. 2013   #1
-
0
-

Potřebuji nakopnout tím správným směrem. (platforma WinForms)

Můj program založeny na EF obsahuje tabulku "Akce" pro jednoduchost sloupce pouze typické Id(int) a Nazev(nvarchar) tuto tabulku plní konečný uživatel různými texty (typu AKCE) no a já mám za úkol seznam těchto akcí zobrazit v datagridu vedle jiných pevně daných hodnot.

Někde v UI mam datagrid, který je prostřednictví DataSource připojený na MyClass<List> a vlastni MyClass má několik v DesingTime vytvořených Propert typicky public string Jmeno{ get; set; } takže pokud tento datagrid zobrazím tak vidím n řádku se jménem.

Tak ale každý z těch lidí vykoná nějakou akci (k té akci má přístup právě přes množinu jemu povolených akcí z tabulky AKCE) no a já potřebuji do toho DGV dogenerovat pravě seznam sloupců těch akcí kdy HeaderText bude Akce.Nazev a v daném řádku bude hodnota (konkrétního uživatele) např kolikrát danou akci spustil.

Našel jsem toho spoustu třeba toto http://www.codeproject.com/Articles/21107/Dynamic-Properties-Implementation-Using-C-Generics vypadat dobře a určitě to někdy použiji ale můj problém to neřeší.

Nějaký nápad??

Rad zodpovím konkretizující dotazy

Nahlásit jako SPAM
IP: 37.48.38.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
Matěj Andrle
~ Anonymní uživatel
1347 příspěvků
2. 8. 2013   #2
-
0
-

Zaprvé jsem z tvého chaotického výtahu nepochopil, jakou datovou strukturu to vlastně nyní máš. Jestli databázi - tak by jsi mohl napsat jakou. Dále bych vřele doporučoval navrhnout si v MSSMS MS SQL databázi (08/12) - a použil bych na ní LINQ - LINQ to SQL... Pak tedy generace bude spočívat pouze ve volání a parametrizaci funkcé navrhnuté databáze... Vytvořit funkce v MSSMS není nic těžkého. Dále bych být tebou neřešil kdo co může mimo dtabáze. Tedy vytvoř si UML databází a propoj je tak... Tedy kdo co může, kdo co má, kdo co měl,... Propojování a vymyšlení návrhu je již o něco těžší - ale řešit to mimo dotazovací jazyk je holá blbost... Otázkou je - jak dobře ovládáš dotazovací jazyky? A konkrétně LINQ?

Nahlásit jako SPAM
IP: 78.136.150.–
Matěj Andrle
~ Anonymní uživatel
1347 příspěvků
2. 8. 2013   #3
-
0
-

funkcé - funkcí

Nahlásit jako SPAM
IP: 78.136.150.–
VladislavK0
Super člen
2. 8. 2013   #4
-
0
-

No asi je to opravdu chaoticky napsané protože já neřeším LINQ a ani nic kolem databáze.

Já řeším problem jak zobrazit v datagridview MOJI CLASSu, která má z designtime definované property (tyto se normálně zobrazí včetně jim odpovídajících hodnot) ale co se nezobrazí jsou v době realtime vzniknuvší nové dynamické property v té MOJI CLASSe a které chci zobrazit prostrednicvim stejného bindingu ve stejnem datagridview.

Na DTB úplně zapomeň ta s tím nemá vůbec nic společného.

Nahlásit jako SPAM
IP: 37.48.38.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
VladislavK0
Super člen
2. 8. 2013   #5
-
0
-

Jen dodám, tuším že řešeni bude někde z oblasti System.Reflection 

  1. PropertyBuilder
  2. MethodBuilder

Já si neodpověděl, já to jenom tuším a hlavně otázka jstli kdy pomoci těchto tří zbuilduju novou propertu tak jestli mi sní bude pracovat ten uvedeny datagridview

Nahlásit jako SPAM
IP: 37.48.38.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
Matěj Andrle
~ Anonymní uživatel
1347 příspěvků
2. 8. 2013   #6
-
0
-

Ale teď jsem ti napsal, jak to zobrazíš. Navrhni si databázi a udělej jí funkce. Pomocí UML si navrhni vztahy mezi jednotlivými částmi. Pomocí LINQ pak vytáhneš potřebná data v potřebném formátu... Data z dotazu se do DataGridView dosadí přes DataSource... DataGridView.DataSource... Nebo si ještě v UML navrhni binding - víc není co řešit. Navíc bych se vyhnul spravující třídě - udělal bych to jako vlastní Control. Aby rovnou žádal vztah s databázovým stromem... (Binding/jiný most) A navrhnuté funkce se navíc na povrchu tváří jako metody v CIL - takže stačí přidat DataSet - a můžeš pracovat jako z kódu...

Nahlásit jako SPAM
IP: 78.136.150.–
Matěj Andrle
~ Anonymní uživatel
1347 příspěvků
2. 8. 2013   #7
-
0
-

Aby jsi mě pochopil - z LINQ vyřešíš staickou část. A přes DataSet/Binding/... vyřešíš dynamickou...

Nahlásit jako SPAM
IP: 78.136.150.–
VladislavK0
Super člen
2. 8. 2013   #8
-
0
-

Nemám databazi - ten program vůbec nemá databázi, vstupem je stream a výstupem XML  - vím že link mohu použít i na DTB ale no raději kousek kodu 

// z cizího zdroje získám pokaždé jiný seznam Akci zpracovat se dá nasledovně
Dictionary<int,string> seznamAkci=new Dictionary<int,string>();
seznamAkci.Add(1,"Akce1");
seznamAkci.Add(12,"Akce12");
seznamAkci.Add(22,"Akce22");

// dále mám poměrně složitou třídu v aplikačním modelu, jen výtah
public class AkceCloveka
{  // staticka properta
   public string Jmeno{ get; set; }
   // mnozina dynamickych propert
   ComplexProperty<object> seznam=new ComplexProperty<object>();

   public AkceCloveka(string jmeno)
   {
	Jmeno=jmeno;
   }
	
   public void ZpracujData(byte[] data)
   {
	if(data[x]==1)// je to Akce1
	}
	   if(data[x+1]==t1) // je to typ INT32
		seznam.Add("Akce1",new SimpleProperty<int32>(data[xxxx]));
           else if(data[x+1]==t2) // jeto jiny typ treba char
		seznam.Add("Akce1",new SimpleProperty<char>(data[xxxx]));
	}
	// atak dale
    }
}

Takto získám jeden řádek seznamu pro databinding, ac presto ze getType().GetProperties() mi vrati všechny takto vytvořené property vcetne toho Jmena tak zcela logicky DGV mi to nezobrazi.

Jeste kousek kodu 

List<AkceCloveka> seznamAkciLidi=new List<AkceCoveka>();

AkceCloveka ac1=Ne AkceCloveka("Franta");
ac1.ZpracujData(byte[]);

seznamAkci.Add(ac1);

AkceCloveka ac2=Ne AkceCloveka("Peapa");
ac2.ZpracujData(byte[]);

seznamAkci.Add(ac2);

datagridView.DataSource=seznamAkciLidi;

Jde o to ze mi intelisence v RUNTIME zobrazi na seznamAkciLidi[0].Jmeno ale i SeznamAkci[0].Akce1 i se spravnou hodnotou.

Ale tato technika pro dynamické vytváření propert si nerozumi s DGV a zcela chapu že to nemuže umět zobrazit.

proto jsem  v prvni větě toho vlakna napsal 

Potřebuji nakopnout tím správným směrem.

a ze stejného důvodu jsem se zmínil namespace Reflection

každopádně dík za snahu

Nahlásit jako SPAM
IP: 37.48.38.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
Matěj Andrle
~ Anonymní uživatel
1347 příspěvků
2. 8. 2013   #9
-
0
-

Ne, ne, ne.

Jako první udělej mapu akcí. Dictionary<string/int/..., Action/...> Tedy do slovníku dosadíš název/číslo/... akce a tak se zbavíš větvení a kdo ví čeho. Navíc to v horním objektu chyť do try bloku - a v catch přidej krom prázdného catch { Neznámý Error! } také NoDictionaryKeyFound Error - či jak je to správně pojmenované - a tam dáš uživateli zprávu - catch(JakýTypVýjimky) { Neznámá akce! }. To je tedy první věc - používej na takovéto věci mapy. Dále návhr přidělování a spol. je naprosto nechutný. Vytvoř objekt akce. Udělej mu enum akcí. A v něm pak spravuj akce. (Spíše bude statický.) Dále vezmi jiný objekt - vykonavatele - a dej mu pole akcí. Atd. - prostě OOP. Výpis bych tedy neřešil přes zmíněný DataGridView, ale je to spíše strom - TreeView. + další Control, který po najetí na položku ze stromu - vypíše podrobnosti o položce. Objektu vykonavatel pak ještě přidáš odpadový objekt akce - to co už proběhlo. Tak nějak nechápu co je to za vstup - smím vědět?

Nahlásit jako SPAM
IP: 78.136.150.–
VladislavK0
Super člen
2. 8. 2013   #10
-
0
-

Kdo jsi ???

Nemuzu mapu mapu akci typu enum ja je znam az v runtime ....

A pochop program jiz delší dobu bezi ...

Jen takova hloupa myšlenka - zakaznik chce vidět (a editovat) na obrazovce to co už je dávno odeslaný ve formatu XML k dalšímu zpracování.

Sorry ale na tvé vstupy již nebudu reagovat - myslím si že nevidíš ten problém kde je, vlastni DGV se mi fakt nechce psát.

Nahlásit jako SPAM
IP: 37.48.38.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
Matěj Andrle
~ Anonymní uživatel
1347 příspěvků
3. 8. 2013   #11
-
0
-

Kdo jsi ty???? Ty se dozvíš hodnoty - nemusíš kvůli tomu zakopat  OOP...

Nahlásit jako SPAM
IP: 78.136.150.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 16 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý