Filtrowanie zawartości datagridview wg kolumny z datami

0

Witam wszystkich
Mam problem z przefiltrowaniem datagridview wg kolumny zawierającej daty za pomocą wpisanej daty w textboxie.
Kod procedury:

private void ShowFilteredGrid(string filtr)
{
  DataTableCollection tables = dsImport.Tables;
  DataView view = new DataView(tables(["Baza"]);
  BindingSource source = new BindingSource();
  try
  {
    if (string.IsNullOrEmpty(filtr))
    {
      source.RemoveFilter();
    }
    else
    {
      sourceFilter = filter;
    }
    dgvImportExcel.DataSource = source;
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message, MessageBoxButtons.OK);
  }
}

Zdarzenie _TextChanged textboxa wywołuje sprawdzenie poprawności daty i tworzy łańcuch filtra i wywołuje powyższą metodę:
filtr = "Okres = #" + textBox1.Text + "#"
gdzie, Okres to kolumna z datami, niestety wywala mi wyjątek typu:
"Nie można zinterpretować tokenu '=' w pozycji 11"
Nadmienię, że filtr dla kolumny tekstowej i z liczbami działa prawidłowo:
filtr = "Rejon like '%" + textBox2.Text + "%'"
filtr = "Ilosc = ' " + textBox3.Text + " ' "
W przypadku daty wysypuje się na składni filtru.
Propozycje?

0

Jako że długość Okres = # = 9, to index 11 jest w textBox1.Text, a tam jaka jest dokładnie wartość?

0
1a2b3c4d5e napisał(a):

Jako że długość Okres = # = 9, to index 11 jest w textBox1.Text, a tam jaka jest dokładnie wartość?
Oryginalna nazwa kolumny to Okr.Rozl. więc 11 wskazuje znak '='
Kolumna okres zawiera daty w formacie dd.mm.rrrr
Takie same wpisuje w textboxa, czyli chcę przefiltrować dgv z datami 01.08.2013 i tak jest w łańcuchu filtra w podglądzie breakpointa.
Ogólnie chciałbym się dowiedzieć czy konstrukcja łąńcucha z datą jest poprawna.

0
RootX93 napisał(a):
1a2b3c4d5e napisał(a):

Jako że długość Okres = # = 9, to index 11 jest w textBox1.Text, a tam jaka jest dokładnie wartość?
Oryginalna nazwa kolumny to Okr.Rozl. więc 11 wskazuje znak '='
Kolumna okres zawiera daty w formacie dd.mm.rrrr
Takie same wpisuje w textboxa, czyli chcę przefiltrować dgv z datami 01.08.2013 i tak jest w łańcuchu filtra w podglądzie breakpointa.
Ogólnie chciałbym się dowiedzieć czy konstrukcja łąńcucha z datą jest poprawna.

Jakiej składni filtra należy użyć do wybrania konkretnej daty w datagridview?
Czy taka jest poprawna: "Kolumna = #dd.mm.rrrr#" czy inna?

0

hmm, udało mi się uzyskać efekt filtrowania dat korzystając z tej składni:

OkrRozl = '12.12.2018 11:37:02' OR OkrRozl = '12.06.2021 11:37:02'

Cały przykład

public partial class Form1 : Form
{
	private List<DateTime> Dates = new List<DateTime>();

	public Form1()
	{
		InitializeComponent();
		var rnd = new Random();
		for (int i = 0; i < 10; i++)
		{
			Dates.Add(DateTime.Now.AddMonths(-rnd.Next(1, 45)));
		}
	}

	private void button1_Click(object sender, EventArgs e)
	{
		BindingSource source = new BindingSource();

		var dt = new DataTable();
		dt.Columns.Add("OkrRozl");

		foreach (var date in Dates)
		{
			var row = dt.NewRow();
			row["OkrRozl"] = date;
			dt.Rows.Add(row);
		}

		source.DataSource = new DataView(dt);
		source.Filter = textBox1.Text;
		dataGridView1.DataSource = source;
	}
}

screenshot-20220612113825.pngscreenshot-20220612113832.png
screenshot-20220612113842.png

0

Dzięki za Twoje rozwiązanie.
Pytanie brzmi, czy filtrowanie danych z datagridview wg podanej w textboxie daty za pomocą składni, którą podałem jest możliwa i czy ta podana przeze mnie jest prawidłowa. Podane przez Ciebie rozwiązanie jest jak mniemam jednym z kilku możliwych (np. linq). Nie wiem, które będzie najlepsze. Docelowo filtr wyświetlanych danych będzie składany dynamicznie z wielu kontrolek textbox i combobox, które będą wpływały na zawartość datagridview w locie i działa to w przypadku kolumn tekstowych i liczbowych a dla dat jakoś nie. Dlaczego? Gdzie jest błąd w składni filtru dla daty? Moje próby rozwiązania problemu opierają się na Filtrowanie DataGridView przedziałem czasowym od ->do
lecz nie znalazłem rozwiązania.

0

Ok, problem rozwiązany.
Problemem jak się okazuje jest mogłoby się powiedzieć banalny.
Ponieważ dane są ładowane z arkusza Excela, gdzie w tabeli znajduje się kolumna o nazwie 'Okr.Rozl.' i tak jest przez ExcelDataReader ładowana do tabeli a potem do DataSource dla DataGridView, problemem okazuje się występowanie kropek w nazwie kolumny.
Problem znika w następujących przypadkach:

  1. Usunięciu kropek z nazwy kolumny w Excelu lub
  2. Sprawdzeniu po załadowaniu do tabeli Importu czy w nazwach nie występują kopki i zmianie ich na np #, lub
  3. Umieszczeniu w filtrze nazwy z kropkami w nawiasach klamrowych filtr = "[Okr.Rozl.] = ' " + DatatxtBox.Text + " ' "
    Tyle sprawdziłem na tą chwilę.
    Temat uważam za zakończony.
    Pozdrawiam

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