Záměna prvku pole   zodpovězená otázka

VB.NET

CF 3.5, VS08 Pro

Dobrý den,

měl bych dotaz(prosbu) potřeboval bych setřídit data v DataTablu.

Jelikož CF nemá nějako třídící funkci jako listOf (.Sort) pro DT, nebo o ní nevím, zkoušel jsem si napsat něco vlastního.

Řádky tabulky jsem načetl do pole řádků, porovnal dle potřeby a chtěl jsem je naklopit zpět do tabulky.

    ''' <summary>
    ''' Třídění dat v DT
    ''' </summary>
    ''' <param name="dt">třízená DT</param>
    ''' <remarks></remarks>
    Private Sub SortDataTable(ByRef dt As DataTable)

        'Vytvoření pole řádků
        Dim r(dt.Rows.Count - 1) As DataRow

        'Načtení dat z tabulky do pole
        For i As Integer = 0 To dt.Rows.Count - 1
            r(i) = dt.NewRow
            r(i) = dt.Rows(i)
        Next

        'Setřízení 
        Array.Sort(r, AddressOf Me.CompareDtRow)

        'Naplnění dat zpět do tabulky
        For i As Integer = 0 To dt.Rows.Count - 1
            With dt.Rows(i)
                .Item("Name") = r(i).Item("Name")
                .Item("Type") = r(i).Item("Type")
                .Item("CZType") = r(i).Item("CZType")
                .Item("Revo") = r(i).Item("Revo")
                .Item("Lead") = r(i).Item("Lead")
            End With
        Next

    End Sub

    ''' <summary>
    ''' Porovnávací funkce
    ''' </summary>
    Private Function CompareDtRow(ByVal x As DataRow, ByVal y As DataRow) As Integer
        If x.Item("Type") > y.Item("Type") Then
            Return 1
        ElseIf x.Item("Type") < y.Item("Type") Then
            Return -1
        Else
            If x.Item("Name") > y.Item("Name") Then
                Return 1
            ElseIf x.Item("Name") < y.Item("Name") Then
                Return -1
            Else
                Return 0
            End If
        End If
    End Function

Podle toho co jsem vysledoval se data v poly srovnají jak mají, ale když je začnu nahrávat zpět do DT tak v průchodu druhým cylkem (i = 1) po '.Item("Type") = r(i).Item("Type")' se v poly (z pro mě nepochopitelných důvodů) zkopíruje obsah r(1) do r(2).

Setkal se s tím někdo, nebo neznáte nějaký lepší způsob na seřazení DataTablu ?

Ps.: Pro testovací účely mám pouze tři řádky v DT a ladím na Windows Mobile 6 Pro Emulator. Jedno vlákno.

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

Proč nesetřídíte data už v SQL dotazu, případně nenecháte třídění na ovládacím prvku (DataGridView)? Takto to bude extrémě neefektivní a pomalé.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Šlo by tuto odpověd trochu rozvést?

Data do DT loaduji z XML přez DataTable.ReadXml, To Xml mi příjde přes binární stream(to je dané), v DT bude mít teoreticky maximálně 256 řádků, takže o rychlost moc nejde.

Uživatel data upravuje (edituje, přidává, odebírá - DT.SELECT).

Datatable mám jako datasource Datagridu na kterém je zobrazuji.

GridView jsem bohužel nikdy nepoužil, ale jak vydím z nápovědy je to pouze pro zobrazení dat. Já bych je, ale potřebovat zesortovat právě v DT před opětovným vytvořením XML příkazem DT.WriteXML, nebo lépe po každé úpravě uživatelem.

Děkuji za odpověď

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

DataGridView je velice flexibilní komponenta, která umí uplně vše, co může být potřeba pro práci s daty. Například: Přidávání, odstraňování, úpravu, třídění dat, uspořádávání a změnu velikosti řádků a sloupců, různé styly pro různé buňky a mnoho dalšího. Takže o užitečnosti a použitelnosti není pochyb. Nepleťte si tuto komponentu s komponentou DataGrid, což je stará verze z Frameworku 1.x. Navíc pokud správně použijete databinding, nemusíte se vůbec starat o to, jak synchronizovat data mezi datovým zdrojem a uživatelským rozhraním (DataGridView).

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

V původním dotazu jsem uvedl, že se jedná o CompaktFramework 3.5.

Tam bohužel tato komponenta není je zde DataGrid.

DataGridView znám z plného Frameworku to je nepochybně skvělá komponenta, ale v CF tyto vymoženosti nejsou.

Musím pracovat s CF dataGridem, datatably.

Možnost by byla přes třídu dataview o níž psal Jaroslav Rajchl vytvořit novou setřízenou datatable '.ToTable' a tu pak ukládat jako Xml, ale třídou dataView jsem zatím nedotčen tak nevím jestli je to možné.

Děkuji za odpověď

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

V tom případě můžete zkusit použít LINQ to XML, což je způsob, jak nad XML daty provádět SQL dotazy (je to skutečně mimořádně masivní technologie). Pokud to ovšem jde v Compact Frameworku. Ukázky naleznete zde:

http://msdn.microsoft.com/en-us/vbasic/b...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ano LINQ to Xml třídy v CF jsou.

Děkuji za odpověď, tato technologie je opravdu velni rozsáhlá, ale je čas tak na to kouknu.

Původní problém se záměnou prvku v poly jsem vyřešil (nevím přesně kde byla chyba - opravoval jsem toho víc i mimo ukázku - v některých funkcích jsem nahradil předávání referencí za hodnotu a teď to chodí jak má).

Ještě jednou děkuji

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Mně vždycky říkali, že ještě větší umění než něco udělat je najít to hotové...:-)

Takže tady bych samozřejmě třídil už v Selectu, jak doporučil pan Linhart a pokud požadujete různé způsoby třídění již naplněného objektu DataTable, tak by to šlo např. přes DataView.

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