DataColumn

giovedì 18 maggio 2006 - 13.24

LeonDom Profilo | Senior Member

Ragazzi ho questo problema, che non riesco a risolvere.....

Creo una nuova colonna:

Dim im as double
Dim dcImpMax As DataColumn
dcImpMax = New DataColumn("Importo Max", Type.GetType("System.Double"))
dcImpMax.Expression = "sTotLoo"
If dcImpMax.Expression = "IMPORTO_LOO" < "20,00" then
im = "100,00"
Else
im = "200,00"
End If
dcImpMax.Expression = im
dsSQL.Tables(0).Columns.Add(dcImpMax)

Mi estraggo dei dati in una DataGrid, e devo aggiungere un'altra colonna in base ad un importo che mi viene restituito nella DataGrid.... avevo pensato di fare così.... ma non va come vorrei, nel senso che la IF mi restituisce sempre 100 nella colonna appena creata....

Sapete se si può fare questa cosa?


LeonDom

alx_81 Profilo | Guru

Cosa intendi per "sTotLoo" e "IMPORTO_LOO", cosa sono per te???
Perchè la proprietà expression serve per impostare il filtro su righe, calcolare valori o creare colonne aggregate..

Alx81 =)

http://blogs.dotnethell.it/suxstellino

LeonDom Profilo | Senior Member

sTotLoo è l'alias di un SUM() di SQLServer.... , ho sbagliato a scrivere il codice.... sorry... te lo riposto meglio....

Dim im as double
Dim dcImpMax As DataColumn
dcImpMax = New DataColumn("Importo Max", Type.GetType("System.Double"))
dcImpMax.Expression = "sTotLoo"
If dcImpMax.Expression = "sTotLoo" < "20,00" then
im = "100,00"
Else
im = "200,00"
End If
dcImpMax.Expression = im
dsSQL.Tables(0).Columns.Add(dcImpMax)

Grazie, per la tua risposta....


LeonDom

alx_81 Profilo | Guru

Nella expression puoi mettere l'espressione che permette di eseguire operazioni su di un datatable..


ad esempio con l'expression "campo1 > 100", filtri le righe per quella condizione..
quello che fai tu non può funzionare..

a te cosa serve precisamente?

descrivimi meglio quello che hai, da dove prendi i dati e cosa ci vuoi fare, perchè così non capisco.. scusami..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

LeonDom Profilo | Senior Member

Allora.... io devo estrarre i dati da SQL e fin qui

da questi dati che ho in una datagrid.... devo creare altre colonne e passargli dei valori in base a dei parametri che già ho....

quello che scrivi tu è giusto ma se devo mettere una condizione, tipo IF?

cioè se è > 100 mi deve mettere nella colonna il valore 200 se è < a 200 mi deve mettere nella colonna il valore 100............

ho provato con il codice che ho postato ma non va!!!


LeonDom

alx_81 Profilo | Guru

Ok.. allora puoi fare in un modo più semplice..
all'evento ItemDataBound della DataGrid, devi fare il seguente giochino:

Dim DR as DataRowView = DirectCast(e.Item.dataitem,DataRowView)

' aquesto punto hai la riga corrente

If Int32.Parse(DR("sTotLoo").ToString()) > 100 Then
e.item.Cells(indice_di_posizione_della_cella_in_cui_vuoi_scrivere).Text = "200"
End If

If Int32.Parse(DR("sTotLoo").ToString()) < 200 Then
e.item.Cells(indice_di_posizione_della_cella_in_cui_vuoi_scrivere).Text = "100"
End If



Alx81 =)

http://blogs.dotnethell.it/suxstellino

alx_81 Profilo | Guru

Cmq fammi sapere se sei riuscito..
ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

LeonDom Profilo | Senior Member

Grazie Axl testo e riposto!!!
LeonDom

LeonDom Profilo | Senior Member

Non funziona.... l'evento ItemDataBound si verifica quando vado a chiamarmi direttamente la cella della datagrid o sbaglio?

a me servirebbe farlo automaticamente al caricamento della datagrid....

avevo pensato di ciclarmi i record in questo modo:

Dim Row as DataRow
For Each Row in DsSQL.Tables("Results").Rows

im = Row("Imp") 'prendo i campi che mi servono

'Eseguo le operazioni che devo fare e rimetto nella row corrispondente il valore

'Tipo una cosa del genere ---->>>> miaDataGrid.Items(i).Cells(i).Text = "Valore"

Next

E' possibile fare una cosa del genere?

LeonDom

alx_81 Profilo | Guru

L'ItemDataBound si verifica ogni volta l'item del datagrid (e quindi la Riga) fa il bound..
io l'ho usato spesso.. per esempio, testavo il valore di una cella per cambiare il valore di un'altra..
e ha sempre funzionato...
prova a postare quello che hai scritto.. perchè secondo me è l'evento giusto per te.. =)
Alx81 =)

http://blogs.dotnethell.it/suxstellino

LeonDom Profilo | Senior Member

Private Sub dGridData_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs)

Dim DR as DataRowView = DirectCast(e.Item.dataitem,DataRowView)

If Int32.Parse(DR("sTotLoo").ToString()) >= 20 Then
e.item.Cells(8).Text = "20"
End If

If Int32.Parse(DR("sTotLoo").ToString()) < 20 Then
e.item.Cells(8).Text = "10"
End If

End Sub

Ma non scrive nulla....


LeonDom

alx_81 Profilo | Guru

Hai provato un po' di debug?

tipo, stampare il valore di DR("sTotLoo")?

oppure vedere se effettivamente la 8 è la cella che ti serve? (partono da 0)
--------------------------------------------------------------------------------------------------------------------

Altra cosa..
potrebbe essere che la tua cella 8 non sia un boundcolumn ma un template, generato con una label al suo interno...
in quel caso devi fare

e.items.cells(8).controls(0).text = "valore"..
ok?

Alx81 =)

http://blogs.dotnethell.it/suxstellino

LeonDom Profilo | Senior Member

Ho provato ma niente...
LeonDom

alx_81 Profilo | Guru

posta aspx, ci dobbiamo arrivare in fondo
Alx81 =)

http://blogs.dotnethell.it/suxstellino

LeonDom Profilo | Senior Member

Ti ho allegato la pagina .aspx con cui provo..... ti ho tolto tutta la roba che non ci serve....

non so se è indicativo ma in questo momento utilizzo Macromedia Studio 8 e quando cerco di mettere: Handles dGridData.ItemDataBound

.....
Messaggio di errore del compilatore: BC30506: La clausola Handles richiede una variabile WithEvents.
......

Non riesco a farglielo riconoscere....

Non so se possa dipendere da questo, ma io la butto lì......
LeonDom

alx_81 Profilo | Guru

Guarda.. molto probabilmente è quello..
nella dichiarazione del datagrid fai:

Protected WithEvents MioDataGrid as DataGrid

così ti prende l'evento.. sennò nulla, il compilatore non genera nemmeno le modifiche..
prima di farmi guardare l'aspx, prova
Alx81 =)

http://blogs.dotnethell.it/suxstellino

LeonDom Profilo | Senior Member

Se metto la dichiarazione come mi hai detto tu, mi da questo errore:

BC30260: 'dGridData' è già dichiarato come 'Protected Dim dGridData As System.Web.UI.WebControls.DataGrid' in questo class.

Ma non riesco a trovarla, dove c..... la dichiara la dGridData Macromedia?

....sto impazzando ed alla fine sarà per questa C....
LeonDom

alx_81 Profilo | Guru

Di solito nei files aspx.vb sono all'inizio..
in una REGION..

non puoi fare una find del contenuto sui file del progetto?

Alx81 =)

http://blogs.dotnethell.it/suxstellino

LeonDom Profilo | Senior Member

Non ho un file di codebehinsd.... e non c'è una region...


LeonDom

alx_81 Profilo | Guru

cerca la variabile dGrid* nei tuoi aspx, da qualche parte c'è =)
Alx81 =)

http://blogs.dotnethell.it/suxstellino

LeonDom Profilo | Senior Member

da quello che mi sembra non c'è dichiarazione, ma la prende dall'ID dell'html della DataGrid e bisogna inserire lì l'evento appropriato!!!

LeonDom

alx_81 Profilo | Guru

Mi sembra strano..
non riesci a postare tutto l'aspx e quello che tu dici di vedere come dichiarazione??
Alx81 =)

http://blogs.dotnethell.it/suxstellino

LeonDom Profilo | Senior Member

Infatti è così un ex collega che utilizza molto più di me Macromedia, mi ha detto che gran parte degli eventi si gestiscono in questo modo, mettendo l'evento direttamente nella DataGrid con MAIUSC + F5 ed inserendo quello appropriato.....

Sto provando anche a fare in questo modo:
'Dichiaro la DataColumn
Dim dc As DataColumn
dc = New DataColumn("Imp", Type.GetType("System.Double")
dc.ReadOnly = False
dc.Expression = "sTOTLOO" 'questa è l'alias della SUM() di SQLServer
dsSQL.Tables(0).Columns.Add(dc)

Dim im as double
Dim Row as DataRow
For Each Row in DsSQL.Tables("Results").Rows
im = Row("Imp")
if im < 10 then
Row("Imp") = "10,01"
Else
Row("Imp") = "50,01"
End If
Next

Ma l'errore restituito è
System.Data.ReadOnlyException: Column 'Imp' is read only. at System.Data.DataRow.set_Item(DataColumn column, Object value) at System.Data.DataRow.set_Item(String columnName, Object value) at ASP.TMKG_L_ADM_compensi_aspx.btnImgExcel_Click(Object sender, ImageClickEventArgs e)


Sento che ci sono.... sono vicino!!!!

LeonDom

alx_81 Profilo | Guru

Tu segui il metodo che credi più appropriato, ma anche la documentazione consiglia di utilizzare il metodo che ti ho consigliato. Io proverei a far partire quell'evento..
comunque, vedi tu..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

LeonDom Profilo | Senior Member

Tentando di far partire l'evento aggiungendo nella dichiarazione HTML onItemBound la restituzione dell'errore è la seguente:

System.NullReferenceException: Object reference not set to an instance of an object. at ASP.TMKG_L_ADM_compensi_aspx.dGridData_ItemDataBound(Object sender, DataGridItemEventArgs e) at System.Web.UI.WebControls.DataGrid.OnItemDataBound(DataGridItemEventArgs e) at System.Web.UI.WebControls.DataGrid.CreateItem(Int32 itemIndex, Int32 dataSourceIndex, ListItemType itemType, Boolean dataBind, Object dataItem, DataGridColumn[] columns, TableRowCollection rows, PagedDataSource pagedDataSource) at System.Web.UI.WebControls.DataGrid.CreateControlHierarchy(Boolean useDataSource) at System.Web.UI.WebControls.BaseDataList.OnDataBinding(EventArgs e) at System.Web.UI.WebControls.BaseDataList.DataBind() at ASP.TMKG_L_ADM_compensi_aspx.btnImgExcel_Click(Object sender, ImageClickEventArgs e)



LeonDom

alx_81 Profilo | Guru

è strano, ripeto.. non te lo so spiegare.. uso visual studio e non ho mai incontrato il problema..
mi spiace tanto..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

LeonDom Profilo | Senior Member

Ti ringrazio veramente tanto per pazienza..... continuerò a provare!!!!
LeonDom
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5