Problema con ObjectDataSource

mercoledì 30 luglio 2008 - 18.07

toyo86 Profilo | Junior Member

ciao a tutti...
vi espongo il mio problema..
sto sviluppando un sito web asp.net per la tesi e sto cercando di capire se esiste un metodo per fare questo:
ho una dropdowlist di valori che corrispondono alla colonna DescCausale della tabella TabellaMovCausale
e poi ho una datagridview in cui visualizzare dati da un altra tabella (TabellaMovMag). nella datagridview voglio filtrare i risultati in base a quello che seleziono nella dropdowlist però ho un problema:
il valore della dropdownlist non ce lho nella TabellaMovMag che voglio visualizzare..ho però la sua chiave (ma non posso fare la selezione in base a quella altrimenti la dropdowlist diventerebbe incomprensibile..)
mi chiedevo quindi come posso collegare due ObjectDataSource e farli dipendere uno dall'altro..cosi seleziono con la prima dropdownlist il mio campo DescCausale, attivo ObjectDataSource1 che utilizza quel dato per produrre la query che mi ritorna l'id del dato (nome e id sono univoci) e scatenare un qualche evento (ma in che modo) in cui il secondo ObjectDataSource prenda il valore restituito dal primo e lo utilizzi come filtro per la datagridview..
spero di essere stato chiaro..
ho anche provato a guardare ma non trovo informazioni riguardo a come impostare le proprietà avanzate nella finestra Configura Origine Dati di ObjectDataSource2...
grazie..

paoval72 Profilo | Senior Member

Ciao, sono un po' de coccio e so' pure solo le 8!
Vorrei capire:
1) le due tabelle hanno una qualche chiave o un qualche campo che le colleghi?
2) che elemento usi per riempire la ddl e la dgview?


PV

toyo86 Profilo | Junior Member

allora..cè un campo in comune ed è IdCausale. in pratica l id della causale è un numero e vorrei recuperarlo dalla selezione fatta nella dropdownlist (selezione fatta in base al nome della causale). la ddl la popolo con le descrizioni delle causali prelevate dalla tabella Causali mentre la datagridview la popolo con i dati provenienti dalla TabellaMovimenti..quindi devo filtrare i dati da visualizzare in base all id associato alla tabella causali..

paoval72 Profilo | Senior Member

Se ho capito bene, la mia idea è:
1) carico i dati sulla dropdownlist, associando prima del bind i due valori

dropdownlist.DataSource = mia source; //Dataset, datatable... dropdownlist.DataTextField = "Testo"; //il testo di ogni riga che appare nella ddl dropdownlist.DataValueField = "ID"; //l'id per ogni riga della ddl dropdownlist.DataBind(); //classica associazione

2) Al momento della scelta sulla ddl posso seguire 2 strade per recuperare il valore scelto:
a) Uso ajax (o javascript): e qui al momento non sono ancora ferratissimo
b) Sfrutto l'evento selectedindexchanged per recuperare l'id e fare una .select(...) sul source della GridView e riassocio quel che mi ritorno alla stessa griglia. Difetto: c'è l'effetto del postback che potrebbe dare graficamente fastidio all'utente

Ciao,

PV

toyo86 Profilo | Junior Member

allora..non mi è ben chiaro cosa intendi..
allora io carico questi valori nella mia ddl

174x479 14Kb

ho impostato la proprietà
datavaluefield su IdCausale mentre DataTextField su DescCausale (cioè quello che vedi dall'immagine..)
questi due dati li prendo dalla "TabellaCausali".
adesso ho una datagrid recuperata dalla "TabellaMovMag" fatta cosi

647x383 42Kb

dove noti il campo MovCausali che corrisponde al campo IdCausale;
io non riesco a capire come si fa a visualizzare i campi della "TabellaMovMag" dove il valore del campo MovCausali è uguale al valore associato alla selezione del dropdonlist...
grazie..

paoval72 Profilo | Senior Member

Ok, quindi avevo capito bene e avevi già fatto la parte che ho scritto.
Per la seconda parte (quella del filtro), ti propongo la prima soluzione che mi è venuta in mente:
1) Prima di tutto, metto in un viewstate il source (dataset o datatable) della griglia al momento del bind della griglia stessa. La ddl deve avere l'autopostback = true
es:

Viewstate["miaSource"]= miasource; //dove miasource è il source della griglia

2) Registro l'evento SelectedIndexChanged, seleziono le righe della griglia in base all'id della ddl e riassocio i dati alla griglia.

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

Ovviamente restano da gestire le eccezioni (ad esempio una select che nopn restituisce righe)

Spero che fosse questo quello che cercavi. Questa è solo una soluzione.
Ciao
Paolo

toyo86 Profilo | Junior Member

sono riuscito a risolvere..alla fine bastava impostare qualche proprietà...
un altra domanda..
se nella query che eseguo nel DataSet associato all ObjectDataSource ho un parametro (diciamo FIliali) che dev'essere uguale alle selezioni in una listbox (impostata in selectionmode multiple)..come posso fare?cioè ho bisogno di passare piu parametri..tutti quelli selezionati..finora non ho scritto praticamente codice..tutto visuale escluso settare visible e qualcos altro..
stesso problema ce lho con le CheckBoxList..
grazie..

paoval72 Profilo | Senior Member

Per avviare la multiselezione usi un button oppure hai impostato il postback della lista a true?

PV

toyo86 Profilo | Junior Member

per ora ho un pulsante che mi rende visibile il datagridview risultante.perchè avendo a che fare con 600 000 dati da filtrare non posso ricaricarlo con postback automatici ad ogni impostazione..pensavo bastasse mettere la listbox su multiple selection ma in realtà passa solo l'indice piu basso della selezione..

paoval72 Profilo | Senior Member

Ok per il bottone, mi hai evitato un javascript!

Io farei così:
1) registro l'evento click del bottone;
2) dentro l'evento mi costruisco la stringa della select, proprio come sul DB.

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

Il .Select ti permette anche il sorting: "nome colonna + DESC" per l'ordinamento discendente, "nome colonna + ASC" per quello ascendente. (es: dsW.Tables[0].Select(where,"NomeCampo DESC");

Ciao,
PV

toyo86 Profilo | Junior Member

scusami se insisto ma sono un po di coccio..e sopratt ho una fretta assurda (mi manca una settimana a fine stage..)
non riesco proprio a capire..
ti spiego la mia situazione nel migliore dei modi..
allora ho bisogno di filtrare dei dati di una tabella di sql server tramite spunte e selezioni..
allora finora ho fatto quasi tutto in maniera visuale..ho messo due calendari da cui estraggo le date selezionate per limitare il periodo..
poi una dropdownlist dove seleziono la causale di magazzino da visualizzare..fin qua tt ok..adesso vorrei avere una listbox che mi rappresenta le filiali e in pratica devo visualizzare i dati filtrati secondo i parametri precedenti e poi ovviamente secondo le filiali selezionate..ho impostato la selezione multipla sulla listbox ma mi prende solo il primo indice..una cosa..non riesco a usare il codice che mi hai postato..si arrabbia quando fa ilbind perchè nella mia query del dataadapter associato alla gridview ho utilizzato una sintassi del tipo
filiale=@filiale e poi nell'objectdatasource ho associato i parametri mancanti ai controlli (calendari, ddl..)..se provo a fare il bind come mihai suggerito non me lo fa oppurep resituisce errori..forse sbaglio a inserire il codice nei punti giusti..ma avendo fatto tutto con drag&dropdrop mi risulta un po difficile aggiungere codice "a caso.."

paoval72 Profilo | Senior Member

Non ti preoccupare: non è facile capirsi in poche righe scritte.
Mi puoi postare un po' di codice?

PV

toyo86 Profilo | Junior Member

allora..questo è il codice asp.net relativo alla listbox
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

poi qua riporto il codice della gridview sempre asp.net

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

questa gridview è riempita tramite un bjectdatasource
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

collegato a un dataset aggiungo nella cartella App_Code
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

cioè questo:

578x373 12Kb


passiamo ora al codice c#

using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class StatsI : System.Web.UI.Page { private int giacenza = new int(); private int id; public DateTime dataInizio = new DateTime(); public DateTime dataFine = new DateTime(); public int CausaleMov; public string NomeFile; protected void Page_Load(object sender, EventArgs e) { giacenza = -2147483648; } protected void Button1_Click(object sender, EventArgs e) { GridView1.Visible = true;//rendo visibile la tabella risultante //GridView2.Visible = false; Button4.Visible = false;//nascondo il bottone Button2.Visible = false;//nascondo il bottone Button3.Visible = false;//nascondo il bottone Button5.Visible = false;//nascondo il bottone Calendar1.Visible = false;//nascondo il calendario Calendar2.Visible = false;//nascondo il calendario DropDownList1.Visible = false;//nascondo la dropdownlist Label1.Visible = false;//nascondo il label Label2.Visible = false;//nascondo il label Label3.Visible = false;//nascondo il label Button6.Visible = true;//visualizzo il bottone indietro // LinkButton1.Visible = false; ListBox1.Visible = false; //DropDownList2.Visible = false; ListBox2.Visible = false; Button8.Visible = false; nascondi(1);//mi nascondo //Response.Redirect("StatsI.aspx?CausaleMov="+id+""); } protected void Button2_Click(object sender, EventArgs e) { //seleziona data inizio button2 Calendar1.Visible = true;//rendo visibile il calendario Button3.Visible = true;//rendo visibile il pulsante nascondi Button4.Visible = true;//rendo visibile l'altro pulsante seleziona Calendar2.Visible = false;//nascondo l'altro calendario nascondi(5);//tolgo il pulsante nascondi data fine nascondi(2);//tolgo me stesso } protected void Button3_Click(object sender, EventArgs e) { //nascondi data inizio button3 Calendar1.Visible = false; Button2.Visible = true;//ritorno a visualizzare il pulsante seleziona data inizio nascondi(3);//nascondo me stesso } protected void Button4_Click(object sender, EventArgs e) { //seleziona data fine Calendar2.Visible = true;//rendo visibile il secondo calendario Button5.Visible = true;//rendo visibile il pulsante nascondi Calendar1.Visible = false;//nascondo l'altro calendario Button2.Visible = true; //rendo visibile il pulsante seleziona dell'altro calendario nascondi(3);//nascondo il pulsante nascondi dell'altro calendario nascondi(4);//nascondo me stesso } protected void Button5_Click(object sender, EventArgs e) { //nascondi data fine Calendar2.Visible = false;//nascondo il calendario Button4.Visible = true;//rendo visibile il pulsante Seleziona nascondi(5);//nascondo il pulsante nascondi dell'altro calendario } protected void Button6_Click1(object sender, EventArgs e) { //Image1.Visible = false; GridView1.Visible = false; //GridView2.Visible = true; Button4.Visible = true; Button2.Visible = true; DropDownList1.Visible = true; Label1.Visible = true; Label2.Visible = true; Label3.Visible = true; Button1.Visible = true; ListBox1.Visible = true; //LinkButton1.Visible = true; //DropDownList2.Visible = true; nascondi(6); } protected void Button7_Click(object sender, EventArgs e) { } protected void nascondi(int n) { if (n == 3) Button3.Visible = false; if (n == 5) Button5.Visible = false; if (n == 2) Button2.Visible = false; if (n == 4) Button4.Visible = false; if (n == 1) Button1.Visible = false; if (n == 6) Button6.Visible = false; } protected void Calendar1_SelectionChanged(object sender, EventArgs e) { dataInizio.AddDays(Calendar1.SelectedDate.Day); dataInizio.AddMonths(Calendar1.SelectedDate.Month); dataInizio.AddYears(Calendar1.SelectedDate.Year); } protected void Calendar2_SelectionChanged(object sender, EventArgs e) { dataFine.AddDays(Calendar2.SelectedDate.Day); dataFine.AddMonths(Calendar2.SelectedDate.Month); dataFine.AddYears(Calendar2.SelectedDate.Year); DropDownList1.Visible = true; //LinkButton1.Visible = true; Label3.Visible = true; ListBox1.Visible = true; Button8.Visible = true; // DropDownList2.Visible = true; } protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { id=DropDownList1.SelectedIndex; CausaleMov = DropDownList1.SelectedIndex; //ListBox1.Visible = true; } protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e) { } protected void Button8_Click(object sender, EventArgs e) { ListBox2.Visible = true; } protected void ListBox2_SelectedIndexChanged(object sender, EventArgs e) { } protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { } protected void CheckBox1_CheckedChanged(object sender, EventArgs e) { if (DropDownList2.Enabled == true) { DropDownList2.Enabled = false; DropDownList2.Text = null; } else DropDownList2.Enabled = true; } protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e) { } }

in questo codice la maggior parte delle cose svolte è nascondere o far comparire controlli..niente di che..

di seguito lo screenshot risultante...
produce i risultati ma il problema è la muiltiselezione dove vedete scritto "udine codroipo..." la list box insomma..


1024x463 28Kb



spero possa bastare!

grazie mille..

paoval72 Profilo | Senior Member

Sarò sincero: avevo inteso un'latra cosa e sono un po' a digiuno con gli objectdatasource.
Ti lascio i riferimenti della MSDN per filtrare questi oggetti (http://msdn.microsoft.com/it-it/library/ms227680.aspx), ma credo che tu li abbia già guardati.

Se per caso riesco ad aggiornarmi e a trovare qualche soluzione te lo faccio sapere.
Ciao,
PV


balfaz Profilo | Expert

guarda non so se ti puo servire, ma se fai una query (ovviamente dal tuo manager di Database) che ritorna una tabella con tutti i valori necessari secondo un certo parametro e il risultato di questa query riempe l'altro Dropdownlist???

in maniera tale che il parametro della quesry sarà il value della DDL1 e il risultato riempe la DDL2


???

spero ti serva!!!
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