none
CTYP FormView.DataItem

    Dotaz

  • Zdravím a prosím o pomoc.

    Mám data ve FormView a potřebuji je dále zpracovat.

    Pokud přiřadím záznam do proměnné Object, nebo příslušné datové třídy, jsem schopen získat konkrétní hodnotu pomocí tečky a názvu pole:

    Dimdr = fv.DataItem
    dim hodnota as string = dr.nazevPole

    Já bych ale potřeboval obecně přistupovat k polím tak, jak to je možné u dataRow:

    dim hodnota = dr("nazevPole")

    Bohužel ale nejsem schopen object přetypovat, nebo převést na dataRow.

    Obecně mi jde o to, že název pole mám ve stringu a potřebuji získat jeho hodnotu.

    Díky za pomoc
    Mirek

    14. srpna 2015 14:42

Odpovědi

  • Dobrý den,

    děkuji za odpověď a vysvětlení. Již mi kolega na EN fóru poradil řešení reflexí.

    dr.GetType().GetProperty("jmenoSloupce").GetValue(dr)

    Tento kód funguje přesně jak potřebuji. DataRow opravdu nepotřebuji.
    V projektu řeším situaci, kdy vedle tabulky s daty existuje tabulka s metadaty, kde je řada dalších vlastností vztahujících se k jednotlivým sloupcům. A já pak potřebuji procházet tabulku metadat a zpracovávat výstup včetně dat konkrétního záznamu.

    Ještě jednou díky
    Mirek


    12. září 2015 7:24

Všechny reakce

  • protected void FormView1_DataBound(object sender, EventArgs e)
    {
        if (FormView1.DataItem != null)
        {
                  DataRowView dr = ((DataRowView)FormView1.DataItem);
                    string nazevPole = dr["nazevPole"].ToString();

    }

    }  

    31. srpna 2015 5:28
  • Díky moc za radu.

    Přetypování na DataRowView jsem zkoušel, ale bohužel nefunguje.
    Možná v handleru FormView_DataBound, ale já to potřebuji "rozebrat" v obecném handleru Button_Click vně FromView.


    Mirek
    31. srpna 2015 7:05
  • Zdravím,

    obecně nemůžete v .NET přetypovat cokoliv na cokoliv. Pokud je zdrojový datový typ ve FormView nějaká konkrétní třída (což evidentně je, pokud na její vlastnosti přistupujete přes tečku), pak z toho jednoduše DataRow neuděláte.

    Pokud potřebujete přístup přes stringové názvy memberů, pak by bylo potřeba použít reflexi (viz System.Reflection namespace). Nepřepokládám ale, že by to byl váš scénář.

    Co vlastně chcete konkrétně dělat, že k tomu potřebujete typ DataRow?


    Robert Haken, Microsoft MVP ASP.NET/IIS, HAVIT, s.r.o., www.havit.cz, http://knowledge-base.havit.cz

    11. září 2015 20:43
    Moderátor
  • Dobrý den,

    děkuji za odpověď a vysvětlení. Již mi kolega na EN fóru poradil řešení reflexí.

    dr.GetType().GetProperty("jmenoSloupce").GetValue(dr)

    Tento kód funguje přesně jak potřebuji. DataRow opravdu nepotřebuji.
    V projektu řeším situaci, kdy vedle tabulky s daty existuje tabulka s metadaty, kde je řada dalších vlastností vztahujících se k jednotlivým sloupcům. A já pak potřebuji procházet tabulku metadat a zpracovávat výstup včetně dat konkrétního záznamu.

    Ještě jednou díky
    Mirek


    12. září 2015 7:24
  • Dobry den, Ano, to je právě ona reflexe. Nicméně v běžném kódu je to technika spíše obskurní, která svědčí zpravidla o nevhodném uspořádání. Proto jsem se snažil dopátrat, co řešíte. Odkud získáváte jméno sloupce?

    Robert Haken, Microsoft MVP ASP.NET/IIS, HAVIT, s.r.o., www.havit.cz, http://knowledge-base.havit.cz

    12. září 2015 9:47
    Moderátor
  • Rád použiji jinou, vhodnější techniku. Jména sloupců získávám z tabulky metadat.
    12. září 2015 10:02
  • Musel bych znát scénář podrobněji, takhle z útržků se to těžko domýšlí a hádá.

    Tak jinak: Kde vzniká instance dr?

    Výše zmíněná reflexe je možnou cestou, ale scénáře pro její použití jsou hodně specifické, takže by měla vždy spustit kontrolku "code smell".


    Robert Haken, Microsoft MVP ASP.NET/IIS, HAVIT, s.r.o., www.havit.cz, http://knowledge-base.havit.cz

    16. září 2015 12:33
    Moderátor
  • Nejprve díky za vaši trpělivost.

    dr je FormView.DataItem - tedy záznam, který právě prohlížím, nebo edituji.
    Používám LinqToSQL jako DataSource.
    Ke každému sloupci mám řadu informací (i název sloupce) v tabulce metadat. Potřebuji tedy procházet v cyklu tabulku metadat a zpracovávat ji. V určitém okamžiku potřebuji vzít hodnotu z daného sloupce tabulky vlastních dat (dr).

    Snad je to trochu srozumitelné.

    Mirek

    16. září 2015 12:52