Dynamiczne wyświetlanie kolumn w DataGrid na podstawie zapytania

0

Witam,

Czy da się wyświetlić dane z kolumnami wyszczególnionymi w zapytaniu do DataGrid lub ListView. Koszystam z SQLIte oraz rozszerzenia SQlite net

Np. mam query:

select PersonName from Persons

innym razem:

select EventName, EventDate from Events

Potrzebuję tego, ponieważ chciałem zrobić coś na wzór dynamicznych raportów, wczytywanych w pliku xml do tej samej kontrolki DataGrid lub ListView.

0

Da się kontrolki można "bindować" (wiązać z kolekcjami, obiektami). Tu masz przykład do DataGrid'a - https://www.dotnetperls.com/datagrid-wpf

0

Może spróbuję wytłumaczyć dokładniej o co mi chodzi. Chciałem utworzyć coś na wzór dynamicznych raportów. Uzywam SQLite oraz dodatku SQlite.NET.
Miałem taki pomysł żeby wczytywać zapytanie raportu z pliku XML. Raport może pokazywać dane z którejkolwiek tabel/tabeli. Chcę w najprostszy sposób wyświetlić dane z tego zapytania w DataGrid lub ListView. Zazwyczaj nie było z tym problemów bo "mapowałem" query na obiekty z modelu bazy,np coś takiego:


using (var db = new SQLiteConnection(new SQLite.Net.Platform.Generic.SQLitePlatformGeneric(), "zakupy.db"))
        {
            listPerson = db.Table<Persons>().Where(x => x.Property == "P" && x.Status == 0).ToList();
        } 
lstPersons.DataContext = listPerson;

Natomiast teraz próbowałem zrobić coś takiego:

using (var db = new SQLiteConnection(new SQLite.Net.Platform.Generic.SQLitePlatformGeneric(), "zakupy.db"))
        {
            var cc = db.Query<Table>("SELECT * from Events");
            lstPersons.DataContext = cc.ToList();
        }

Jednak po "zbindowaniu" w DataGrid wyświetla się tylko coś takiego:
screen

0

Zamiast DataContext użyj właściwości ItemsSource.

0

Wtedy dostaję coś takiego:
scren

Czyli dane z bazy tam są, ale nie mogę się do nich dobrać

0

No to prawidłowy wynik jeżeli mapujesz swoje zapytanie do klasy Table, która reprezentuje obiekt graficzny tabeli czyli tego- https://msdn.microsoft.com/en-us/library/system.windows.documents.table(v=vs.110).aspx . A właśnie to robisz tą o to instrukcją:

 var cc = db.Query<Table>("SELECT * from Events");

Jeżeli chcesz to dobrze mapować to ta metoda jest przeciążona, gdzie możliwym jest dodanie parametru klasy mapującej wyniki zapytania na odpowiedni obiekt - http://www.rbdocumentation.com/html/19d38743-7935-a894-7551-513c6686bd50.htm

Poszukaj tutoriali w Internecie bo robisz coś na ślepo i myślisz, że się uda, a to tak się nie da. Do bindingu w WPF wykorzystuje właściwość ItemsSource kontrolek tak jak pisałem.

0

Staram się nie robić na ślepo, dlatego pytam. Ale chyba nie dostanę prostej podpowiedzi. Pisałem już że akurat wiem jak się binduje (item source i data context). Ok teraz wiem też że głupotą było mapowanie na <Table>. Ale moje pytanie jest nadal aktualne. Nadal nie wiem jak uzyskać z zapytania listę, którą będę mógł zbindować. Ta przeciążona metoda wymaga parametru w postaci odpowiedniego obiektu? Problem w tym że nie wiem jaki.

0

Ok, udało mi się osiągnąć to co chciałem w taki sposób ( Skorzystałem dodatkowo z paczki SQLitePCL)

            string ConString = "zakupy.db";
            DataTable dt = new DataTable();
            using (SQLiteConnection con = new SQLiteConnection(ConString))
            {
                try
                {
                    using (var statement = con.Prepare(passedquery))
                    {
                        for (int i = 0; i < statement.ColumnCount; i++)
                        {
                            dt.Columns.Add(statement.ColumnName(i));
                        }
                        while (statement.Step() == SQLiteResult.ROW)
                        {

                            DataRow dr;
                            dr = dt.NewRow();

                            for (int i = 0; i < statement.ColumnCount; i++)
                            {
                                dr[i] = statement[i];
                            }
                            dt.Rows.Add(dr);
                        }
                    }
                }

                catch(SQLitePCL.SQLiteException)
                {

                    MessageBox.Show("Nieprawidłowe zapytanie");
                }             
            }
            dtgCustomReport.DataContext = dt.DefaultView;
        

1 użytkowników online, w tym zalogowanych: 0, gości: 1