Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Dva nacina za istu stvar

[es] :: .NET :: .NET Desktop razvoj :: Dva nacina za istu stvar

[ Pregleda: 2053 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
92.36.221.*



+13 Profil

icon Dva nacina za istu stvar01.08.2011. u 14:34 - pre 154 meseci
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?



 
Odgovor na temu

AMD guy
Miroslav
.NET developer

Član broj: 128930
Poruke: 1007

Sajt: www.its.edu.rs


+38 Profil

icon Re: Dva nacina za istu stvar01.08.2011. u 14:40 - pre 154 meseci
Ovo sam pronasao na brzinu
http://geekswithblogs.net/Sanj...he-index-of-a-given-using.aspx

http://i.imgur.com/V3feW.jpg
http://on.wsj.com/H9yjz6 -- India Graduates Millions, but Too Few Are Fit to Hire
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: Dva nacina za istu stvar01.08.2011. u 14:44 - pre 154 meseci
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.
 
Odgovor na temu

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
92.36.221.*



+13 Profil

icon Re: Dva nacina za istu stvar01.08.2011. u 14:46 - pre 154 meseci
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.


 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: Dva nacina za istu stvar01.08.2011. u 14:59 - pre 154 meseci
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]
 
Odgovor na temu

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
*.dynamic.telemach.ba.



+13 Profil

icon Re: Dva nacina za istu stvar01.08.2011. u 21:00 - pre 154 meseci
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 :)



 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: Dva nacina za istu stvar01.08.2011. u 21:27 - pre 154 meseci
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).
 
Odgovor na temu

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
*.dynamic.telemach.ba.



+13 Profil

icon Re: Dva nacina za istu stvar01.08.2011. u 21:34 - pre 154 meseci
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 :)



 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Dva nacina za istu stvar03.08.2011. u 18:08 - pre 154 meseci
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.
 
Odgovor na temu

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
*.dynamic.telemach.ba.



+13 Profil

icon Re: Dva nacina za istu stvar03.08.2011. u 23:29 - pre 154 meseci
Hvala na sugestijama.

FOR je odradio posao sasvim solidno :)
 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.zaslon-telecom.si.



+14 Profil

icon Re: Dva nacina za istu stvar09.08.2011. u 08:35 - pre 154 meseci
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.
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
109.175.58.*



+13 Profil

icon Re: Dva nacina za istu stvar09.08.2011. u 08:51 - pre 154 meseci
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 :)

 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Dva nacina za istu stvar

[ Pregleda: 2053 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.