[ wex-alpha @ 01.08.2011. 14:34 ] @
| Imam datagridview koji je bind sa datatable. Zadatak je jednostavan.
Ako jedna od celija (int) sadrzi manje od 5, onda odaberi celiju i promjeni joj boju.
Posto sam koristi LINQ u projektu, pomislio sam da i za takvu stvar ga koristim.
Samo da bih otkrio da je mnogo teze :(
Naime, LINQ nacin u pocetku radi, ali sa dodavanjem/brisanjem novih stavki u bazu, tj. datagridview(DVG), index kljucevi se vise ne poklapaju. Recimo da dodam 10 stavki u DGV, onda ide jedan na jedan, jer je i u bazi 10 id kljuceva. Ako obrisem iz baze deset stavki, pa ih opet dodam onda nema poklapanja vise. Jer, DGV ima 10 stavki i njegov indeks krece od 0-10, a id iz baze je 10-20. Problem je taj da treba da dobijem trenutni DGV index reda iz upita
Kako dobiti DGV.IndexOf koristeci LINQ?
LINQ kod koji ne radi:
Code:
DataTable dt2 = novo.eto();
BindingSource bSource = new BindingSource();
bSource.DataSource = novo.eto();
dataGridView1.DataSource = bSource;
var query = from order in dt2.AsEnumerable()
where order.Field<int?>("stanje") < 5 // nullable type
select new
{
STANJE = order.Field<int>("stanje"),
ID = order.Field<int>("id"),
};
foreach (var proradivise in query)
{
if (proradivise.STANJE < 5)
{
this.dataGridView1.Rows[proradivise.ID - 1].DefaultCellStyle.BackColor = Color.Red;
//Umjesto proradivise.ID, treba mi trenutni DGV.IndexOf
}
else
{
this.dataGridView1.Rows[proradivise.ID-1].DefaultCellStyle.BackColor = Color.Green;
}
}
Ovo sam rijesio koristeci jednostavnu for petlju i radi, ali me zanima kako to odraditi sa LINQ-om?
|
[ AMD guy @ 01.08.2011. 14:40 ] @
[ Shadowed @ 01.08.2011. 14:44 ] @
Zasto ne bi citao vrednost u svakom row-u i kada je manje od 5 promenis boju u crveno?
Code:
foreach (DataRow row in dataGridView1.Rows)
{
if ((int?)row["Stanje"] < 5)
row.DefaultCellStyle.BackColor = Color.Red;
else
row.DefaultCellStyle.BackColor = Color.Green;
}
Mozes ovo i konvertovati u linq ako hoces.
[ wex-alpha @ 01.08.2011. 14:46 ] @
Citat:
Shadowed: Zasto ne bi citao vrednost u svakom row-u i kada je manje od 5 promenis boju u crveno?
Code:
foreach (DataRow row in dataGridView1.Rows)
{
if ((int?)row["Stanje"] < 5)
row.DefaultCellStyle.BackColor = Color.Red;
else
row.DefaultCellStyle.BackColor = Color.Green;
}
Mozes ovo i konvertovati u linq ako hoces.
To sam na kraju i uradio. Ali kopka me taj nacin sa LINQ-om.
[ Shadowed @ 01.08.2011. 14:59 ] @
Pa, nesto kao:
DataGridView1.Rows.ForEach(r => (int?)r["Stanje"] < 5 ? r.DefaultCellStyle.BackColor = Color.Red : r.DefaultCellStyle.BackColor = Color.Green);
Edit: typo
[Ovu poruku je menjao Shadowed dana 01.08.2011. u 22:25 GMT+1]
[ wex-alpha @ 01.08.2011. 21:00 ] @
Slicno je kao i moj LINQ, ali ne vidim gdje si dobio DGV.IndexOf?
To ce raditi u prvoj iteraciji, ali kad se budu dodavale vrijednosti u DGV i dodavali novi kljucevi, onda DGV nece biti sinhroniziran. Zbog toga DGV.IndexOf is a must.
Ili ja ne vidim nesto ocigledno :)
[ Shadowed @ 01.08.2011. 21:27 ] @
Hm, probaj. Naravno, ovo trebas pozvati kod svakog add/edit.
Kad ne koristis WPF.. :) U njemu bi samo bind-ovao back color sa stanjem i zavrsio pos'o (uz pravljenje konvertora).
[ wex-alpha @ 01.08.2011. 21:34 ] @
Nisam se odlucio za WPF za ovaj projekat. Mozda je greska... mozda nije, vidjet cemo :)
Sto je kod mene cest slucaj, kad radim WPF isti psujem te hvalim WinForms. Kad radim WinForm isti slucaj... psujem WinForm a hvalim WPF :)
[ ravni @ 03.08.2011. 18:08 ] @
mozda je najbolje da obradis event cellformatting i u njemu pitas da li je to ta kolona, i ako jeste postavis backcolor na odgovarajucu boju. to ce da radi optimalno i u slucaju da ima puno redova.
[ wex-alpha @ 03.08.2011. 23:29 ] @
Hvala na sugestijama.
FOR je odradio posao sasvim solidno :)
[ Boris B. @ 09.08.2011. 08:35 ] @
Možda ti je taj FOR završio posao, ali ipak je Ravni-jevo rešenje IMHO najbolje. Takve stvari (prezentacijska logika) je najbolje odraditi on-demand i u što užem scope-u. Preformatiranje GridRow ćelija mislim da ne treba raditi u databound načinu jer nikada ne znaš kad će Grid interno da uništi-rekreira ćelije.
[ wex-alpha @ 09.08.2011. 08:51 ] @
Citat:
Boris B.: Možda ti je taj FOR završio posao, ali ipak je Ravni-jevo rešenje IMHO najbolje. Takve stvari (prezentacijska logika) je najbolje odraditi on-demand i u što užem scope-u. Preformatiranje GridRow ćelija mislim da ne treba raditi u databound načinu jer nikada ne znaš kad će Grid interno da uništi-rekreira ćelije.
U pravu si :)
Copyright (C) 2001-2024 by www.elitesecurity.org. All rights reserved.