Zmiana koloru rekordu w Datagridview

0

Mam problem ze zmianą koloru wiersza w DataGridView. Napisałem funkcję w MySql-u, która sprawdza dla wskazanego id-a ile godzin minęło zostało wprowadzonych między dwiema datami określonymi przez datapicker (ustawiony short format)

CREATE DEFINER=`test`@`%` FUNCTION `ileWTygodniu`(id INT, dataPoczatkuTygodniu DATETIME, dataKoncaTygodnia DATETIME) RETURNS float
BEGIN
	
    DECLARE liczbaGodzin DOUBLE; 
    SET liczbaGodzin = (SELECT ROUND((SUM(TIME_TO_SEC(TIMEDIFF(dataZakonczenia, dataRozpoczecia))) / 3600), 1) 
	 	FROM test
	 	WHERE dataRozpoczecia >= dataPoczatkuTygodniu
			AND dataZakonczenia <= dataKoncaTygodnia
	 		AND idMieszk = id);
            
	IF (liczbaGodzin IS NULL) THEN
		RETURN 0;
	ELSE 
		RETURN liczbaGodzin;
	END IF;
END

Funkcja zwraca poprawnie wartość do TextBoxa-a, ale na podstawie wartości zwracanej chciałbym, aby mi zaznaczało wiersze w DataGridView, jeżeli wartość zwracana będzie mniejsza od 10. Wykorzystałem do tego zdarzenie "CellFormatting"

id = Convert::ToInt32(dataGridview1->Rows[e->RowIndex]->Cells[0]->Value);
double ile = sprawdzIle(idMieszk, DataOd, DataDo, konfiguracjaPolaczenia());

if (ile < 10)
{
	dataGridview1->Rows[e->RowIndex]->DefaultCellStyle->BackColor = Color::Red;
}
double ile(int id, System::Windows::Forms::DateTimePicker^ dataOd, System::Windows::Forms::DateTimePicker^ dataDo, String^ konfiguracja)
{
	double ileGodzin = 0;

	MySqlConnection^ polaczenie = gcnew MySqlConnection(konfiguracja);
	polaczenie->Open();

	DateTime^ dataOd = Convert::ToDateTime(dataOd->Text);
	DateTime^ dataDo = Convert::ToDateTime(dataDo->Text);

	
	MySqlCommand^ zapytanie = gcnew MySqlCommand("SELECT ile(" + id + ", '" + dataOd + "', '" + dataDo + "');", polaczenie);

	try
	{

		ileGodzin = Convert::ToDouble(zapytanie->ExecuteScalar());

		return ileGodzin;
	}
	catch (Exception^ komunikat)
	{
		MessageBox::Show(komunikat->Message);
		return 1;
	}

	polaczenie->Close();

}

Wszystko niby działa, tzn. rekordy są formatowane, ale trwa to długo, a jak przewinę listę w datagdrdview to mi wywala program z komunikatem, mówiącym o przekroczonym czasie. Mógłby mi ktoś podpowiedzieć jak poprawnie zrobić takie formatowanie? Lista w datagridview zawiera ok. 50 pozycji.

0

To mi wygląda na C++, a to jest dział C#

1

I dla każdego rekordu odpalasz te funkcję?
Niech zapytanie o dane dla grida zwróci w jakieś te wartość i to wykorzystaj do formatowania.

0
AdamWox napisał(a):

To mi wygląda na C++, a to jest dział C#

Piszę to VisualC++. Nie ma takiego działu. Jest C++, ale jak kiedyś napisałem w tamtym dziale, to ktoś mi zwrócił uwagę, że to nie C++ ;)

0
jacek.placek napisał(a):

I dla każdego rekordu odpalasz te funkcję?
Niech zapytanie o dane dla grida zwróci w jakieś te wartość i to wykorzystaj do formatowania.
Tak. Zrobiłem w ten sposób, że przy ładowaniu formy wczytują mi się dane z bazy do siatki. Następnie użyłem zdarzenia CellFormatting, aby dla każdego rekordu wywołać funkcję.

0

Wydaje mi się, że @jacek.placek bardziej czepia się tego twojego zapytania. Wywołujesz tą funkcje dla każdego wiersza. Skoro masz już wyciągnięte dane to czemu nie dorzucisz kolumny, która zwróci ci te godziny? Jak już będziesz miał komplet danych to możesz zrobić tak, przykład:

foreach (DataGridViewRow row in vendorsDataGridView.Rows) 
     if (Convert.ToInt32(row.Cells[7].Value) < Convert.ToInt32(row.Cells[10].Value)) 
     {
         row.DefaultCellStyle.BackColor = Color.Red; 
     }

Lub

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
    if (Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[7].Text) < Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[10].Text)) 
    {
        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
    }
}

Wydaje mi się, że twoje zapytanie do bazy danych utrudnia ci te kolorowanie.
PS.
Nie wiem jak to będzie w C++, wybacz...

0

Funkcje SQL ileWTygodniu uzyj w zapytanie sql o dane i dostaniesz kolumnę z ilością godzin. W gridzie w cellformatting sprawdzaj te ilość godzin.

Cos w stylu

Select idMiszkania, ..., ileWTygodniu(data rozpoczęcia,dataZakonczenia) as ilGodzin from test ...

Dostaniesz kolumnę ilGodzin. Możesz ja zrobić niewidoczna i od jej wartość i formatować.

0

Dziękuję za pomoc. Zrobiłem tak jak AdamWox i jacek.placek sugerował. Zmieniłem w bazie i zwróciłem dodatkową kolumnę, na podstawie której koloruję wiersze.

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