Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C#] - Wyszukiwanie w dataGridView

tiger1990 05 Lis 2012 18:00 3540 13
  • #1 05 Lis 2012 18:00
    tiger1990
    Poziom 12  

    Witam,

    Mam formatkę na której jest dataGridView z kilkoma kolumnami, wypełniona danymi.
    Chciałbym zrobić do niej wyszukiwanie - w tym celu wstawiłem sobie textBoxa z akcją na TextChanged. I teraz moje pytanie:
    1. Jak ustawić wskaźnik tabeli na danym wierszu tabeli?
    2. Jak zrobić wyszukiwanie takie że np w tabeli w jakieś kolumnie po której będę wyszukiwał mam słowo "listopad" a w textBoxie wpisze słowo "pad" i się na tym zatrzyma.
    3. systemowe dataGridView ma zaimplementowane sortowanie gdy naciśnie się na header kolumny. Chciałbym wyszukiwać po tej kolumnie która jest zaznaczona jako sortowana - przypuszczam ze do tego potrzebuje znać columnName - jak je wyciągnąć po naciśnięciu na headera? Od razu powiem, że kolumny wstawiam z poziomu kodu nie designera.

    //EDIT:
    Reasumując, chciałbym zrobić wyszukiwanie po tej kolumnie, która jest obecnie zaznaczona jako sortowana ( jeżeli nie to po pierwszej ), i szukać do pierwszego skojarzenia.

    wielkie dzięki za pomoc,
    Irek

    0 13
  • Pomocny post
    #2 05 Lis 2012 18:29
    marcinj12
    Poziom 40  

    Ja do takiego "szybkiego filtrowania" napisałem sobie takę metodę, może coś z niej wykorzystasz lub przerobisz:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Filtruje ona DataGridView do którego podłączone jest źródło danych (zwykle: DataTable) za pomocą pośredniczącego komponentu bindingSource. Dzięki temu do jednej tabeli można podpiąć kilka niezależnie filtrowanych komponentów i nie będą sobie one wzajemnie przeszkadzać.
    Podobny efekt można osiągnąć ustawiając dataTable.DefaultView.RowFilter, jednak wtedy filtrowanie dotknie wszystkie komponenty połączone z tabelą.
    Kod w zasadzie buduje kryterium filtrowania ze wszystkich widocznych kolumn tabeli podpiętej do dataGridView, konwertując pola nie-tekstowe do stringa. Całość jest podpięta i wywoływana w zdarzeniu Change dla textboxa.

    Może nie jest to jakieś super wydajne czy dopracowane rozwiązanie, ale na moje potrzeby wystarczy.

    0
  • #3 05 Lis 2012 18:57
    tiger1990
    Poziom 12  

    Rozumiem że to:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod



    zwraca true gdy "typStringa" z zawiera sie w jakiej kolwiek wartości z danej kolumny?

    2. Jeżeli chciałbym wyszukiwać po konkretnej kolumnie mogę zrobić tak?

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    3. Wiesz może jak podczepić metode on Click do kolumny która jest dodawana z poziomu kodu?

    Irek

    0
  • #4 05 Lis 2012 19:26
    marcinj12
    Poziom 40  

    tiger1990 napisał:
    Rozumiem że to:

    dgvCol.ValueType.Equals(typString)

    zwraca true gdy "typStringa" z zawiera sie w jakiej kolwiek wartości z danej kolumny?
    Zwraca true, gdy typ danych w kolumnie jest zdefiniowany jako string.

    tiger1990 napisał:
    Jeżeli chciałbym wyszukiwać po konkretnej kolumnie mogę zrobić tak?
    foreach (DataGridViewColumn dgvCol in dataGridView.Columns[indeks])

    Możesz ,ale nie ma sensu bo będziesz wykonywał "pętlę" po jednym elemencie. Ja podałem uniwersalne rozwiązanie przeszukujące wszystkie kolumny w tabeli - jeżeli chcesz wyszszukiwać tylko w jednej kolumnie, możesz zrezygnować z pętli foreach i sprawdzania, czy kolumna jest widoczna - za dgvCol podstawiasz tą konkretną kolumnę.

    tiger1990 napisał:
    3. Wiesz może jak podczepić metode on Click do kolumny która jest dodawana z poziomu kodu?
    Kolumna DataGridView nie ma zdarzenia Click - w zasadzie oprócz Dispose nie obsługuje żadnych zdarzeń. Zdarzenie Click możesz zdefiniować dla DataGridView - dynamicznie w kodzie tak samo jak każde inne, tzn. pisząc:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    i dwa razy tabulator.

    0
  • #5 05 Lis 2012 19:57
    tiger1990
    Poziom 12  

    Jeżeli rozumiem, to u Ciebie to działa tak, ze masz dataTable na którego nakładasz filtr... i dopiero wtedy wrzucasz do dataGridView. U mnie jest inaczej:
    mam w textBoxie tekst i a w Gridzie dane i chciałbym aby selected row zatrzymał się na pierwszym dobrym polu. W sumie to nie wiem jak mam porównać... tzn u Ciebie pojawia się coś takiego jak "LIKE".

    Dam pseudo kod - może to pomoże:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #6 05 Lis 2012 20:01
    marcinj12
    Poziom 40  

    No dobrze, ale skąd bierzesz dane do wyświetlenie w tym gridzie?

    0
  • #7 05 Lis 2012 20:06
    tiger1990
    Poziom 12  

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Dane są z dataTable

    EDIT:
    Tylko że ja nie chce robić filtru tylko wyszukiwanie czyli chciałbym aby wszystkie dane były w tabelce a wyszukany wiersz ( pierwsza opacja ) była zaznaczona - dlatego chciałbym robić operacje na dataGridView a nie na dataTable

    0
  • #8 05 Lis 2012 20:20
    marcinj12
    Poziom 40  

    No, czyli masz dataTable - możesz, jak pisałem, użyć do filtrowania dataTable.DefaultView.RowFilter, on też działa z LIKE. Albo połączyć dataGridView2.DataSource przez komponent bindingSource i wtedy użyć ten kod bez żadnych przeróbek.
    Spróbuj na początku zrobić filtrowanie na sztywno wybranej kolumny, może wtedy załapiesz o co chodzi:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    tiger1990 napisał:
    EDIT:
    Tylko że ja nie chce robić filtru tylko wyszukiwanie czyli chciałbym aby wszystkie dane były w tabelce a wyszukany wiersz ( pierwsza opacja ) była zaznaczona - dlatego chciałbym robić operacje na dataGridView a nie na dataTable

    Aaaa, to zmienia postać rzeczy - myślałem, że chodziło o filtr. Czyli chcesz tylko pozaznaczać kolorem wiersze pasujące do wzorca?

    0
  • #9 05 Lis 2012 20:23
    tiger1990
    Poziom 12  

    (:

    Filtrowanie już mam i robie to na bazie danych - tzn podczepiam warunki pod where,
    bo po co wczytywać wszystkie dane i nie wyświetlać połowy, jak można wczytać po prostu połowę.

    0
  • Pomocny post
    #10 05 Lis 2012 20:36
    marcinj12
    Poziom 40  

    tiger1990 napisał:
    bo po co wczytywać wszystkie dane i nie wyświetlać połowy, jak można wczytać po prostu połowę.
    Choćby po to, że zapytanie do bazy - powtarzane po każdym wciśnięciu klawisza - może zająć więcej czasu niż przefiltrowanie danych już wyciągniętych.
    A co do zaznaczania w datagridview, to można tak:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #11 05 Lis 2012 20:41
    tiger1990
    Poziom 12  

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    To mi zrobi porównanie - coś takiego jak "like" ? Jak to działa?

    0
  • Pomocny post
    #12 05 Lis 2012 20:44
    marcinj12
    Poziom 40  

    tiger1990 napisał:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    To mi zrobi porównanie - coś takiego jak "like" ? Jak to działa?
    To są zwykłe operacje na stringu - IndexOf zwraca pozycję jednego napisu wewnątrz drugiego - czyli działa jak LIKE. Dodatkowo dodałem parametr ignorujący wielkość liter.

    0
  • #13 05 Lis 2012 21:54
    tiger1990
    Poziom 12  

    Udało mi się to napisać - wrzucam - może komuś się kiedyś przyda.
    Program działa tak, że gdy naciskamy na header kolumny nazwa jest łapana do zmiennej i wyszukiwanie działa właśnie po tej kolumnie.

    Wyszukiwanie kończy się na pierwszym podobnym wyniku. Wtedy zaznaczana jest cała kolumna - natomiast stara podświetlona jest odznaczana.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Mam jeszcze jedno pytanie.
    Z boku dataGridView jest taki pointer ( mały trójkącik ) który wskazuje aktualny wiersz. Da się go przesunąć? Bo w wyszukiwaniu zaznaczam wybrany wiersz, a fajnie było by gdyby pointer też przesunął się razem z zaznaczeniem.

    Irek

    0
  • #14 05 Lis 2012 22:09
    marcinj12
    Poziom 40  

    Indeks sortowanej kolumny możesz prościej uzyskać przez odwołanie się do:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    (dobrze przedtem sprawdzić, czy w ogóle jest włączone sortowanie po jakiejś kolumnie).

    Trójkąt wskazuje aktualnie wybrany wiersz - nie koniecznie musi on być równy aktualnie zaznaczonemu. Wystarczy zrobić coś takiego:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0