Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 11 odgovora
  • 3.141 pregleda

Najnovija ↓

Dva nacina za istu stvar 01.08.2011. u 15:34 · pre 185 meseci #1
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?


Potpis

[IMG]http://img233.imageshack.us/img233/5078/thumbnailte1.th.jpg[/IMG]


They say I look like daddy :D
Re: Dva nacina za istu stvar 01.08.2011. u 15:44 · pre 185 meseci #3
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.
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Dva nacina za istu stvar 01.08.2011. u 15:46 · pre 185 meseci #4
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.

Potpis

[IMG]http://img233.imageshack.us/img233/5078/thumbnailte1.th.jpg[/IMG]


They say I look like daddy :D
Re: Dva nacina za istu stvar 01.08.2011. u 15:59 · pre 185 meseci
izmenjeno 1 put, poslednji put Shadowed 01.08.2011. u 22:25
  1. Shadowed01.08.2011. u 22:25zapis iz teksta poruke
#5
Pa, nesto kao:

DataGridView1.Rows.ForEach(r => (int?)r["Stanje"] < 5 ? r.DefaultCellStyle.BackColor = Color.Red : r.DefaultCellStyle.BackColor = Color.Green);


Edit: typo
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Dva nacina za istu stvar 01.08.2011. u 22:00 · pre 185 meseci #6
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 :)


Potpis

[IMG]http://img233.imageshack.us/img233/5078/thumbnailte1.th.jpg[/IMG]


They say I look like daddy :D
Re: Dva nacina za istu stvar 01.08.2011. u 22:27 · pre 185 meseci #7
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).
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Dva nacina za istu stvar 01.08.2011. u 22:34 · pre 185 meseci #8
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 :)


Potpis

[IMG]http://img233.imageshack.us/img233/5078/thumbnailte1.th.jpg[/IMG]


They say I look like daddy :D
Re: Dva nacina za istu stvar 03.08.2011. u 19:08 · pre 185 meseci #9
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.
Sviđa mi se1
Re: Dva nacina za istu stvar 09.08.2011. u 09:35 · pre 185 meseci #11
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.
Potpis
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
Re: Dva nacina za istu stvar 09.08.2011. u 09:51 · pre 185 meseci #12
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 :)
Potpis

[IMG]http://img233.imageshack.us/img233/5078/thumbnailte1.th.jpg[/IMG]


They say I look like daddy :D
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme