IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Pavel Klus
Člen
Avatar
Pavel Klus:22.1.2021 13:25

Ahojte. Mám třídu která získá DataTable z databáze. Protože potřebuji vracet seznam nekonkrétních objektů. Beru si PropertyInfo[] ze získaného objektu. Pak si přes to získávám z konkrétního řádku tabulky data a ukládám je zpět do objektu. Nakonec si každou položku uložím do seznamu. Vloží se jedna položka tak je to Ok. Pak další, ale přepíše to i tu starší položku. Pak mám v celém seznamu jen jednu položku.

public object[] GetData(object item)
{
    DataTable table = GetData();
    object[] items = new object[table.Rows.Count];

    if (table.Rows.Count > 0)
    {
        PropertyInfo[] props = item.GetType().GetProperties();

        for (int i = 0; i < table.Rows.Count; i++)
        {
            DataRow row = table.Rows[i];

            foreach (var prop in props)
            {
                string value = row[prop.Name].ToString();
                prop.SetValue(item, value);
            }

            items.SetValue(item, i);

        }
    }

    return items;
}

public List<object> GetData(object item)
{
    DataTable table = GetData();
    List<object> items = new List<object>();

    if (table.Rows.Count > 0)
    {
        PropertyInfo[] props = item.GetType().GetProperties();

        for (int i = 0; i < table.Rows.Count; i++)
        {
            DataRow row = table.Rows[i];

            for (int j = 0; j < props.Length; j++)
            {
                string value = row[props[j].Name].ToString();
                props[j].SetValue(item, value);
            }

            items.Add(item);

        }
    }

    return items;
}

Zkusil jsem: Zkoušel jsem to dávat do listu, do pole. Použil jsem object, dynamic. Ale v tom to asi nebude. Nevím proč se mi kopíruje objekt do ostatních objektů. Možná jsem něco přehlédl nebo to takto nelze použít. Už si nad tím lámu hlavu celý včerejší den a část dněšku.

Chci docílit: Snažím se do jedné metody poslat objekt (může být různý) a získat k domu z databáze data dle propertyinfo abych nemusel ke každému objektu vytvářet nové metody. Omlouvám se nejsem moc zdatný ve vyjadřování. Taky trochu začátečník. Možná z konkrétního kusu kódu to vyzní lépe.

Odpovědět
22.1.2021 13:25
Jsem zvědav.
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Pavel Klus
Tadeáš Burda :22.1.2021 14:57

Caw, tym seznamem myslis "items"??...Lebo ak to vidim dobre tak doteho seznamu ukladas len ten objekt "item" stale dokola...Natej metode z List<> to vidis ze tam stale pridavas items.Add(item), ten isty objekt dokola

 
Nahoru Odpovědět
22.1.2021 14:57
Avatar
Pavel Klus
Člen
Avatar
Odpovídá na Tadeáš Burda
Pavel Klus:22.1.2021 15:58

Ten item se vždy změní dle dalšího řádku v dataTable. Když to kontroluji za běhu. Přidá ho do listu. Při dalším dalším řádku je item jiný. A vloží se do listu. Ale přepíše to i ten původní item v listu jsou už dva itemy, ale uplně stejné. Pak se načte další item je zase jiný dle řádku. A vloží se do listu. už jsou tam 3 itemy, ale ten nový přepíše zase ty dva původní. Tak už jsou tam 3 stejné itemy a takhle stále dokola.

Do toho itemu se vkládají nová data z těch proprertyInfo. Tak by neměl být problém že je stejný. Ale asi se pletu.

Nahoru Odpovědět
22.1.2021 15:58
Jsem zvědav.
Avatar
Pavel Klus
Člen
Avatar
Pavel Klus:22.1.2021 16:15

Koukám na to krok za krokem. A když se vloží první item do listu a pak se přes to foreach načítá další řádek. Tak se to souběžně mění postupně i na těch vložených itemech v listu. To mi hlava nebere.

Nahoru Odpovědět
22.1.2021 16:15
Jsem zvědav.
Avatar
Pavel Klus
Člen
Avatar
Pavel Klus:22.1.2021 16:25

Tak už jsem to asi pochopil. Bude to tím že je to ten samý objekt. Nevytváří se nový? Jen se mění data proto se to mění i v tom listu? Akorát nevím jak to vyřešit. Díky Tadeáši.

Nahoru Odpovědět
22.1.2021 16:25
Jsem zvědav.
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Pavel Klus
Tadeáš Burda :22.1.2021 17:49

Jo tes mna to napadlo ze to bude tim...Musis si spravit klony teho itemu a tim menit vlastnosti

 
Nahoru Odpovědět
22.1.2021 17:49
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Pavel Klus
Tadeáš Burda :22.1.2021 17:58

Konkretne bude problem asi vtem SetValue(item, value) kde vlastne stale nastavujes hodnotu tej istej referncii...Pak to ulozis do zeznamu cez items.Add(item), ale to vlastne len vytvoris novu referenciu(odkaz) na ten isti object, takze proste 3x odkazujes na to iste...Ked chces aby to vytvorilo vzdy novy obejct tak pred tim SetValue musis spravit kopiu teho obejctu a vlozit tam tu, ne ten povodny...Dufam ze sem pomohel :D

 
Nahoru Odpovědět
22.1.2021 17:58
Avatar
Pavel Klus
Člen
Avatar
Pavel Klus:22.1.2021 18:47

Jop děkuji určitě. Už jsem to vyřešil. Sice nebyl takový plán. Ale snad to nebude tak špatný.

Tady to požaduje pouze jeden objekt a pak to skládá dohromady list.

public static List<ContiUser> GetUsers(this ContiUserConnect connect)
{
    List<ContiUser> users = new List<ContiUser>();
    DataTable table = connect.GetData();

    for (int i = 0; i < table.Rows.Count; i++)
    {
        DataRow row = table.Rows[i];
        users.Add((ContiUser)connect.GetData(row, new ContiUser()));
    }

    return users;
}

Tady to je ta původní metoda.

public object GetData(DataRow row, object item)
{
    PropertyInfo[] props = item.GetType().GetProperties();

    foreach (var prop in props)
    {
        string value = row[prop.Name].ToString();
        prop.SetValue(item, value);
    }

    return item;
}

A už to funguje tak jak potřebuji.

Nahoru Odpovědět
22.1.2021 18:47
Jsem zvědav.
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Pavel Klus
Tadeáš Burda :22.1.2021 18:56

No hlavne ze to ide :-)

 
Nahoru Odpovědět
22.1.2021 18:56
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.