Wyszukiwanie danych na DataGridView

Dzisiaj pokażę Wam jak w prosty sposób przeszukać dane znajdujące się na kontrolce DataGridView. Nasza aplikacja pozwoli na wyszukanie kolejnych wystąpień szukanego tekstu od góry do dołu w wybranej kolumnie.

Pierwszym krokiem, jest zapełnienie DataGridView danymi i dynamiczne wyświetlenie listy kolumn. W tym celu w metodzie Load głównego okna wywołujemy metody InitData():

private void InitData()
{
    _movies = new List<Movie>();
    _movies.Add(new Movie() { MovieID = 1, Title = "Harry Potter i Kamień Filozoficzny", Director = "Chris Columbus", Description = "W dzień swoich jedenastych urodzin Harry Potter, żyjący ze swoimi krewnymi, rodziną Dursleyów, dowiaduje się, że jest czarodziejem, a jego rodzice nie zginęli w wypadku samochodowym..." });
    //(...)
    dgvData.AutoGenerateColumns = false;
    dgvData.DataSource = _movies;
}

oraz GetColumnsList():

private void GetColumnsList()
{
    for (int i = 0; i < dgvData.Columns.Count; i++)
    {
        cmbColumns.Items.Add(dgvData.Columns[i].HeaderText);
    }
}

Najważniejszym elementem naszego programu jest metoda Search wyszukująca kolejne wystąpienia tekstu w wybranej przez nas kolumnie. W tym celu potrzebujemy kilku zmiennych, które będą przechowywały stan naszego aktualnego wyszukiwania, oto one:

private string _searchText = string.Empty;
private int _searchColumnID = 0;
private int _searchRowID = 0;

_searchText będzie przechowywała bieżący wyszukiwany tekst,
_searchColumnID to numer aktualnie wybranej kolumny do przeszukiwania.

Te dwie zmienne posłużą nam do sprawdzenia czy w trakcie przeszukiwania nie zostały zmienione kryteria wyszukiwania. Trzecia zmienna (_searchRowID) będzie przechowywała numer wiersza, od którego będziemy rozpoczynać przeszukiwanie.

Teraz trochę kodu. Na początek zdarzenie obsługujące naciśnięcie przycisku Szukaj:

if (cmbColumns.SelectedIndex >= 0 && txtSearch.Text != string.Empty)
{
    if (txtSearch.Text != _searchText || cmbColumns.SelectedIndex != _searchColumnID)
    {
        _searchText = txtSearch.Text;
        _searchRowID = 0;
        _searchColumnID = cmbColumns.SelectedIndex;
    }
    Search();
}
else
{
    MessageBox.Show("Proszę wprowadzić tekst oraz wybrać kolumnę do przeszukania");
}

Pierwszy warunek sprawdza czy został wprowadzony tekst i czy została wybrana kolumna, którą będziemy przeszukiwali i jeśli nie to wyświetlamy użytkownikowi stosowny komunikat. Drugi sprawdza czy kryteria wyszukiwania zostały zmienione. Jeśli tak to to aktualizujemy nasze zmienne przechowujące bieżące kryteria i zerujemy numer wiersza, od którego będziemy rozpoczynali przeszukiwanie.

Teraz zostaje nam tylko wywołanie metody szukającej. Jej kod poniżej:

private void Search()
{
    int columnID = cmbColumns.SelectedIndex;
    string searchText = txtSearch.Text.ToUpper();
    bool found = false;

    for (int i = _searchRowID; i < dgvData.Rows.Count; i++)
    {
        string columnText = dgvData.Rows[i].Cells[columnID].Value.ToString().ToUpper();
        if (columnText.Contains(searchText))
        {
            found = true;
            if (i <= dgvData.Rows.Count - 1)
            {
                _searchRowID = i + 1;
            }
            else
            {
                _searchRowID = 0;
            }
            dgvData.Rows[i].Selected = true;
            dgvData.FirstDisplayedScrollingRowIndex = i;
            break;
        }
    }

    if (!found)
    {
        MessageBox.Show("Nie znaleziono szukanego tekstu");
        _searchRowID = 0;
    }
}

Na wstępie deklarujemy zmienną found, w której będziemy przechowywali informację o tym czy tekst został znaleziony. Całe wyszukiwanie odbywa się w pętli for, w której iterujemy wiersze komponentu DataGridView poczynając od ostatnio przeszukiwanego (_searchRowID) do ostatniego. W przypadku kiedy tekst znajdujący się w naszej kolumnie (columnText) zawiera tekst wyszukiwany (_searchText) ustawiamy naszą zmienną found, aktualizujemy numer wiersza, od którego rozpoczniemy następne wyszukiwanie, zaznaczamy bieżący wiersz, ustawiamy go jako pierwszy wyświetlany na komponencie DataGridView i opuszczamy pętlę for poleceniem break.

Ostatnim krokiem jest sprawdzenie czy tekst został znaleziony. Jeśli nie to wyświetlamy użytkownikowi odpowiedni komunikat i zerujemy numer wiersza, od którego będziemy rozpoczynali kolejne wyszukiwanie.

Jak pewnie zauważyliście szukany tekst oraz tekst z kolumny konwertowane są na duże listery – metoda ToUpper() typu string – a wyszukiwanie odbywa się za pomocą użycia metody Contains() typu string. Ma to na celu wyszukiwanie bez rozróżniania wielkości liter oraz dowolnego położenia szukanego tekstu.

To wszystko. Mam nadzieję, że ten prosty algorytm okaże się komuś przydatny.

Poniżej znajduje się cała aplikacja razem z kodem źródłowym (.NET 2.0).

DataGridViewSearch
DataGridViewSearch
DataGridViewSearch.zip
38.7 KiB
Pobrano 320 razy
Szczegóły...

Tagi:, ,

Nie ma jeszcze komentarzy.

Dodaj komentarz

Uzupełnij * Time limit is exhausted. Please reload the CAPTCHA.