Slect in datagrid

martedì 15 ottobre 2013 - 11.08
Tag Elenco Tags  .NET 3.5  |  Windows 7  |  Visual Studio Express

pieroalampi Profilo | Expert

Salve ripropongo in modo diverso un problema:
ho raggruppato facendo una select più dati in una datagridview
con il seguente codice

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
cio vuol dire che se ho più occorrenze nella griglia tipo

r1
r1
r1
r2
r3
r5
r7
r7
r7
il risultato sarà r1,r2,r3,r5,r7, adesso pero non riesco a calcolare i valori che affiancano queste righe tipo

r1 10
r1 10
r1 20
r2 30
r3 10
r5 8
r7 1
r7 1
r7 1
praticamente dovrei ottenere la somma delle celle che hanno lo stesso testo tipo r1=40, r2=30,r3=10,r5=8,r7=3
bisognerebbe ciclare la grid all'interno del For Each n In BarCodeIngrid ma non riesco a prendere il numero di riga corrente... currentrow non funziona fare un For Each row As DataGridViewRow In Me.DataGridViewReport.Rows mi ricalcola tutto moltiplicando le righe per il doppio, come potrei fare????
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

0v3rCl0ck Profilo | Guru

linq rimane la risposta al tuo problema :)

scritto con la linq fluent interface:

var records = new List<Tuple<string, int>> { Tuple.Create("r1", 10), Tuple.Create("r1", 5), Tuple.Create("r2", 7), Tuple.Create("r2", 3), Tuple.Create("r2", 5), Tuple.Create("r3", 6), Tuple.Create("r3", 6), Tuple.Create("r3", 6), }; var results = records.GroupBy(t => t.Item1).Select(t => new { Item1 = t.Key, SumItem2 = t.Sum(x => x.Item2) }); foreach (var result in results) { Console.WriteLine("{0} = {1}", result.Item1, result.SumItem2); }

e scritto in linq expression:

var records = new List<Tuple<string, int>> { Tuple.Create("r1", 10), Tuple.Create("r1", 5), Tuple.Create("r2", 7), Tuple.Create("r2", 3), Tuple.Create("r2", 5), Tuple.Create("r3", 6), Tuple.Create("r3", 6), Tuple.Create("r3", 6), }; var results2 = from record in records group record by record.Item1 into groupedRecords select new { Item1 = groupedRecords.Key, SumItem2 = groupedRecords.Sum(r => r.Item2) }; foreach (var result in results2) { Console.WriteLine("{0} = {1}", result.Item1, result.SumItem2); }

ciao
-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com

pieroalampi Profilo | Expert

ok ora lo provo per ora grazie, poi ti dico
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

pieroalampi Profilo | Expert

anche se ancora non l'ho provato ma mi viene strano da capire cosa posso mettere al posto di r1,r2,r3 perché questi valori li devo chiudere in una variabile che di volta in volta cambia a secondo delle necessità, posso arrivare anche a r3000,
poi
tradotto in vb sarebbe


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
[/code]ma il t2 accetta solo integer ed il prezzo è double, ci asto impazzendo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

0v3rCl0ck Profilo | Guru

lascia perdere la mia tuple che era solo per farmi dei dati di esempio, da quello che ho visto dal tuo codice di prima hai un datagrid, e sulla falsa riga del tuo codice dovresti riuscire a fare una cosa così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

scusa il mio vb.net... sicuramente si può anche scrivere in linq expression senza le lambda che forse in vb.net è più pulito che con la fluent interface.

-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com

pieroalampi Profilo | Expert

mi da errore su DataGridViewReport.Rows.GroupBy
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

1156x94 32Kb

0v3rCl0ck Profilo | Guru

>mi da errore su DataGridViewReport.Rows.GroupBy
>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA
>

hai fatto l'Imports di System.Linq ?

Imports System.Linq

io ho provato in un piccolo console project in vb.net e mi funziona, ovviamente tu devi sostituire la mia List con il tuo datagrid:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com

pieroalampi Profilo | Expert

no guarda ho modificato cosi il codice, ma non capisco cosa mi somma, perché il risultato è errato

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

praticamente mi considera il valore come una int e non raccoglie tutto quello che trova dopo la virgola
come faciccio a trasformare il SumPrezzo in double?

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

0v3rCl0ck Profilo | Guru

al posto di:

FormatCurrency(x.Cells("R_Prezzo").Value.ToString))


metti:

Convert.ToDecimal(x.Cells("R_Prezzo").Value))


-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com

pieroalampi Profilo | Expert

grazie mille funziona, questa parte la devo riguardare su qualche libro di cosa parliamo esattamente ?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

pieroalampi Profilo | Expert

alla fine se serve a qualcuno lo mettiamo qui sto codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

0v3rCl0ck Profilo | Guru

>grazie mille funziona, questa parte la devo riguardare su qualche
>libro di cosa parliamo esattamente ?

Convert, è una delle classi .net che permette di fare conversione tra tipi base (int, decimal, string, datetime, ...), nel tuo caso avresti anche potuto utilizzare un semplice cast esplicito se eri sicuro che .Value contenesse un decimal, e quindi fare:

(decimal)x.Cells("R_Prezzo").Value

Convert: http://msdn.microsoft.com/en-us/library/system.convert.aspx
Casting: http://msdn.microsoft.com/en-us/library/ms173105(v=vs.110).aspx


-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com

pieroalampi Profilo | Expert

no ok quello lo so è che non ci arrivavo parlo della select nel datagridview, ovviamente dire che ci sarei arrivato è da asini perché di fatto mi hai aiutato tu!!!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

0v3rCl0ck Profilo | Guru

la groupby e la select sono operazioni Linq e puoi trovare tanti esempi pratici in questa guida msdn: http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b


-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5