[ 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 ] @
Ovo sam pronasao na brzinu
http://geekswithblogs.net/Sanj...he-index-of-a-given-using.aspx
[ 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 :)