Chciałbym zmienić kolor konkretnego wiersza w moim datagridview. Wiersz należy zmienić na czerwony, gdy wartość kolumny kolumna 7 jest mniejsza niż wartość w kolumnie kolumna 10. Jakieś sugestie, jak to zrobić?
143
Chciałbym zmienić kolor konkretnego wiersza w moim datagridview. Wiersz należy zmienić na czerwony, gdy wartość kolumny kolumna 7 jest mniejsza niż wartość w kolumnie kolumna 10. Jakieś sugestie, jak to zrobić?
Musisz przejrzeć wiersze w datagridview, a następnie porównać wartości z kolumn 7 i 10 w każdym wierszu.
Spróbuj tego:
foreach (DataGridViewRow row in vendorsDataGridView.Rows)
if (Convert.ToInt32(row.Cells[7].Value) < Convert.ToInt32(row.Cells[10].Value))
{
row.DefaultCellStyle.BackColor = Color.Red;
}
Właśnie badałem ten problem (więc wiem, że to pytanie zostało opublikowane prawie 3 lata temu, ale może komuś pomoże ...), ale wydaje się, że lepszą opcją jest umieszczenie kodu wewnątrz
RowPrePaint
wydarzenia, aby nie muszą przejść każdy wiersz, tylko te, które zostaną pomalowane (więc będzie działać znacznie lepiej na dużej ilości danych:Dołącz do wydarzenia
Kod zdarzenia
źródło
Szukasz
CellFormatting
wydarzenia.Oto przykład.
źródło
Miałem również problem ze zmianą koloru tekstu - nigdy nie widziałem zmiany koloru.
Dopóki nie dodałem kodu, aby zmienić kolor tekstu wydarzenia
DataBindingsComplete
dlaDataGridView
. Potem zadziałało.Mam nadzieję, że pomoże to ludziom, którzy borykają się z tym samym problemem.
źródło
Coś podobnego do następującego ... zakładając, że wartości w komórkach są liczbami całkowitymi.
nieprzetestowane, więc przepraszamy za każdy błąd.
Jeśli znasz konkretny wiersz, możesz pominąć iterację:
źródło
Niektórzy ludzie lubią używać
Paint
,CellPainting
lubCellFormatting
zdarzenia, ale pamiętać, że zmiana stylu w tych zdarzeń powoduje wywołań rekurencyjnych. JeśliDataBindingComplete
go użyjesz , uruchomi się tylko raz. Argumentem zaCellFormatting
jest to, że jest wywoływana tylko w widocznych komórkach, więc nie musisz formatować niewidocznych komórek, ale formatujesz je wielokrotnie.źródło
Można zmienić
Backcolor
wiersz po wierszu używając swojego condition.and to wywołanie funkcji po zastosowaniuDatasource
odDatagridView
.Oto funkcja do tego. Po prostu skopiuj to i umieść później
Databind
źródło
źródło
To jest moje rozwiązanie do zmiany koloru na dataGridView z bindingDataSource:
źródło
Jeśli utworzysz powiązanie z (kolekcją) konkretnych obiektów, możesz pobrać ten konkretny obiekt za pośrednictwem właściwości DataBoundItem wiersza. (Aby uniknąć sprawdzania magicznych ciągów w komórce i używania „rzeczywistych” właściwości obiektu)
Przykład szkieletu poniżej:
DTO / POCO
Powiązanie z datagridview
następnie program obsługi zdarzeń i pobieranie konkretnego obiektu (zamiast DataGridRow i / lub komórek)
źródło
Zazwyczaj lubię używać do tego zdarzenia zdarzenia GridView.RowDataBound.
źródło
Działa na Visual Studio 2010. (Próbowałem i działa!) Pomaluje cały wiersz.
datagridview
.CellClick
wydarzenie i umieść w nim następną linię kodu.źródło
Nie wspomniałeś, jak zmienia się wartość. Użyłem podobnej funkcji, gdy użytkownik wprowadza wartość. tj. wchodzenie i wychodzenie z trybu edycji.
Korzystanie ze zdarzenia CellEndEdit datagridview.
W podobny sposób możesz dodać logikę do usuwania powiadomień o błędach.
jeśli w twoim przypadku, jeśli dane są ładowane programowo, to zdarzenie CellLeave może być użyte z tym samym kodem.
źródło
Za pomocą tego kodu zmieniasz tylko kolor tła wierszy, w których wartość kolumny jest równa null, pozostałe wiersze są nadal kolorami domyślnymi.
źródło
Tylko uwaga na temat ustawienia
DefaultCellStyle.BackColor
... nie możesz ustawić dla niego żadnej przezroczystej wartości opróczColor.Empty
. To jest wartość domyślna. To fałszywie implikuje (przynajmniej dla mnie), że kolory przezroczyste są w porządku. Oni nie są. Każdy wiersz ustawiony na przezroczysty kolor rysuje tylko kolor wybranych wierszy.Spędziłem o wiele za dużo czasu, uderzając głową o ścianę w tej sprawie.
źródło
Wylądowałem tutaj, szukając rozwiązania w przypadku, gdy nie używam wiązania danych. Nic mi nie pomogło, ale w końcu dostałem:
źródło
Jeśli jesteś drugim najgłupszym programistą na świecie (ja jestem najgłupszy), wszystkie powyższe rozwiązania wydają się działać: CellFormatting, DataSourceChanged i RowPrePaint. Wolę RowPrePaint.
Zmagałem się z tym (zbyt długo), ponieważ musiałem zastąpić moje SelectionBackColor i SelectionForeColor zamiast BackColor i ForeColor, gdy zmieniałem wybrany wiersz.
źródło
źródło