Grid e FormView1

domenica 14 marzo 2010 - 21.12

gae58 Profilo | Senior Member

salve,

ho una pagina asp con un multiView.
Nel multiview, nella prima pagina ho una gridView, nella seconda la formView e nella 3 una gridView e nella quarta un'altra gridView.

La grid della prima pagina e la formView sono collegate tra loro attraverso il gridView1.selectedValue.

Succede che ogni volta che inserisco un dato nella formView della 2° pagina, dopo aver salvato, la formView1 scompare perchè nella gridView son risulta selezionato alcun movimento.

Pensavo che dopo l'inserimento, facendo risultare selezionato il movimento appena caricato, dovrebbe rimanere a video.

Ma non so come fare a far risultare nella gridView il movimento appena caricato.

Quando clikko su seleziona della gridview, la grid che fa richiama l'sql con il where == l'ultimo inserito?

Qualche aiuto? spero di essere stato chiaro.


Gaetano

skraus Profilo | Junior Member

Se non ho capito male tu vorresti che dopo l'insert sul db dei dati inseriti nel formView, ti si venga riproposto a video sempre il formView vuoto e pronto per un nuovo insert, relazionato al record selezionato nel GridView.

In questo caso anzichè utilizzare l'automatismo offerto da ASP.NET nell'ancorare l'interazione tra il gridView ed il FormView, non ti conviene mettere un bottone custom su cui programmare l'evento clic e caso mai il selectedValue della griglia conservarlo, nel viewState o in un coockie o in una varabile di sessione ?

Sempre se non ho capito male ....

Ciao
Sk

gae58 Profilo | Senior Member

ciao ti ringrazio per la risposta, ma mi rendo conto di non essere stato troppo chiaro.

Ho una gridView ed una formView collegate alla stessa tabella attraverso 2 sqldataSource.

L'inserimento lo effettuo tramite la formView. Dopo l'inserimento vorrei che la grid si aggiornasse e selezionasse in automatico il movimento inserito.

La parte per prendere il progressivo dell'ultimo inserito ce l'ho, l'aggiornamento della grid lo effettuo tramite il dataBind, ma pur usandando il selected.index, non riesco a selezionare la riga.
Le ho provate tutte, ma senza risulttao.

Spero di essere stato chiaro.


Gaetano

skraus Profilo | Junior Member

Io ho utilizzato l'evento RowDataBound del GridView.

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { if (e.Row.Cells[2].Text == "5") e.Row.RowState = DataControlRowState.Selected; } }

Comunque la proprietà che ti permette di definire una riga come selezionata è RowState che accetta valori dell'enumerazione DataControlRowState.

Ciao
Sk

gae58 Profilo | Senior Member

proverò il codice, ma tieni presente che non lo posso fare da dove dici tu, ma da
SqlDsdatSource_OnInserted

Ho pensato d'inserirlo qui perchè mi sembra il posto + adatto, che ne pensi?


Gaetano

Ho provato, ma l'oggetto che mi hai indicato non raggiungibile da dove mi trovo

skraus Profilo | Junior Member

Se usi l'onInserted non puoi fare riferimento ad e.Row.

Comunque secondo me, sempre se non ho capito male, l'evento onInserted ti si genera sul SqlDataSource legato al FormView e non quello della GridView.

Se hai il valore di primary key assegnato al record inserito per ultimo, ed il campo fa parte dei record restituiti dal SqlDataSource bindato al GridView puoi rifarti al mio esempio, sostituendo, nel mio esempio, il valore numerico costante.

Ciao
Sk

gae58 Profilo | Senior Member

>Se usi l'onInserted non puoi fare riferimento ad e.Row.
>
>Comunque secondo me, sempre se non ho capito male, l'evento onInserted
>ti si genera sul SqlDataSource legato al FormView e non quello
>della GridView.

giusto



>Se hai il valore di primary key assegnato al record inserito
>per ultimo, ed il campo fa parte dei record restituiti dal SqlDataSource
>bindato al GridView puoi rifarti al mio esempio, sostituendo,
>nel mio esempio, il valore numerico costante.

Non l'ho capito, visto che l'oggetto non è raggiungibile, come hai detto tu l'onInserted è della formView.
l'onInserted è questo:
protected void SqlDsAppo_OnInserted(object sender, SqlDataSourceStatusEventArgs e)
{
if (e.Exception == null)
{
prendo il progressivo dell'ultimo movimento inserito
int lastID = (int)e.Command.Parameters["@Prog"].Value;

e pensavo che con questi comandi potessi selezionare la riga nel gridView

GridView1.DataBind();
GridView1.SelectedIndex = lastID;
ho provato anche con il parameter, ma niente
SqlDsAppo.SelectParameters["Progressivo"].DefaultValue = lastID.ToString();
}

grazie


Gaetano

skraus Profilo | Junior Member

Per prima cosa la variabile lastID la renderei globale, per cui dichiarata a livello di classe e non di evento.

Nell'ambito dell'evento mantieni l'istruzione

lastID = (int)e.Command.Parameters["@Prog"].Value;


Se non ricordo male, nella tua pagina utilizzavi un MultiView e FormView è contenuto nella seconda View, per cui dovrai esplicitamente riportare attiva la View1 che contiene il GridView, quindi sempre nell'evento onInserted io aggiungerei l'istruzione

MultiView1.ActiveViewIndex = 0;

A questo punto nell'evento RowDataBound del GridView

if (lastID != 0) { if (e.Row.RowType == DataControlRowType.DataRow) { if (e.Row.Cells[numero_colonna].Text == lastID.toString()) e.Row.RowState = DataControlRowType.Selected; } }

Ciao
Sk

gae58 Profilo | Senior Member

>Per prima cosa la variabile lastID la renderei globale, per cui
>dichiarata a livello di classe e non di evento.
no so come si faccia a dichiarare globale la var, ma preferisco non farlo ed usare il viewState, visto che la uso solo in questa form
>nell'evento onInserted io aggiungerei l'istruzione
>
>MultiView1.ActiveViewIndex = 0;
>
>A questo punto nell'evento RowDataBound del GridView
>
>if (lastID != 0)
>{
> if (e.Row.RowType == DataControlRowType.DataRow)
> {
>if (e.Row.Cells[numero_colonna].Text == lastID.toString())
in questa istruzione mi riporta l'errore che non può effettuare la trasformazione

> e.Row.RowState = DataControlRowType.Selected;
e qui mi riprta l'errore che il selected non è supportato.

Non pensavo fosse così complesso.
Per tamponare e visto che devo inserire i dati del movimento appena inserito in un altra tabella, sai se c'è qualche altra possibilità?

grazie


Gaetano

skraus Profilo | Junior Member

puoi postare il codice relativo agli eventi che ti generano gli errori.

Grazie, ciao
Sk

gae58 Profilo | Senior Member

ciao, scusa il ritardo nella risposta, ma ho avuto un po' di problemi. Per capire come funziona il rowDataBound, ho fatto varie prove, come potrai notare nel codice qui sotto:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
// Mette l'Italico sulla Seconda COlonna
if (e.Row.RowType == DataControlRowType.DataRow)
{
// Visualizza la COlonna in Italico
e.Row.Cells[1].Text = "<i>" + e.Row.Cells[1].Text + "</i>";
}


int a = 11;
//if (ViewState["lastID"].ToString() != 0)
//{
if (e.Row.RowType == DataControlRowType.DataRow)
Response.Write(a + "<br/>");
Response.Write(e.Row.Cells[0].Text + " " + a.ToString());

{
if (e.Row.Cells[0].Text == a.ToString())
Response.Write("aa");
e.Row.RowState = DataControlRowState.Selected;
}
//}
}

Per non settare le varie Variabili, ho impostato la var a con un progressivop presente nella tabella, ed ho cambiato il codice della riga:
e.Row.RowType == DataControlRowType.DataRow
in
e.Row.RowState = DataControlRowState.Selected
perchè in e.Row.RowState = DataControlRowState non è presente selected
nell'esecuzione del codice ho notato che questa riga:
if (e.Row.Cells[0].Text == a.ToString())
non risulta mai valorizzata, non trova questa uguaglianza, anche se è presente il progressivo 11, e non capisco perché

che ne pensi?


Gaetano

Ho effettuato altre prove ed ho notato che la riga di confronto risulta sempre false:
Response.Write(e.Row.Cells[0].Text == a.ToString());

Ho letto un po' di informazioni e se ho capito bene, l'istruzione e.Row.RowState = DataControlRowState.Selected;
serve solo ad indicare se la riga è stata selezionata

skraus Profilo | Junior Member

>ciao, scusa il ritardo nella risposta,

idem

>problemi. Per capire come funziona il rowDataBound

l'evento RowDataBound viene eseguito per ogni riga del GridView che viene bindata all'origine dati, per cui il suo funzionamento può essere assimilato ad una iterazione

>protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs
>e)
> {
> // Mette l'Italico sulla Seconda COlonna
> if (e.Row.RowType == DataControlRowType.DataRow)
> {
> // Visualizza la COlonna in Italico
>e.Row.Cells[1].Text = "<i>" + e.Row.Cells[1].Text + "</i>";
> }

Queste istruzioni te le puoi risparmiare andando a settare lo stile italico direttamente da design sulla voce Modifica colonne e settando la proprietà ItemStyle della colonna che ti interessa.

> int a = 11;
> if (e.Row.RowType == DataControlRowType.DataRow)
> Response.Write(a + "<br/>");
> Response.Write(e.Row.Cells[0].Text + " " + a.ToString());
>
> {
> if (e.Row.Cells[0].Text == a.ToString())
> Response.Write("aa");
> e.Row.RowState = DataControlRowState.Selected;
> }
> //}
> }

qui sinceramente mi sono perso.

Setti la variabile a al valore 11
Controlli se la riga corrente è di tipo DataRow. A questo punto le parentesi graffe del blocco if te le sei dimenticate o le hai omesse volutamente ?

Inoltre le istruzioni Response.Write non ti garantiscono la scrittura all'interno della struttura (tag) table risultante dall'elaborazione dell'istanza di GridView, come al contrario si poteva fare in asp 3. Per scrivere un valore all'interno di una cella devi fare riferimento alla proprietà Text della cella in cui vuoi scrivere.

Per cui se nella cella della prima colonna vuoi che venga visualizzato il valore della variabile a devi scrivere

e.Row.Cells[0].Text = a.toString();

>Ho letto un po' di informazioni e se ho capito bene, l'istruzione
>e.Row.RowState = DataControlRowState.Selected;
>serve solo ad indicare se la riga è stata selezionata

esatto è la medesima cosa che avviene quando l'utente mediante un tasto di selezione seleziona la riga per visualizzarne i dati di dettaglio.

Per qunto riguarda la proprietà RowState e l'enumerazione DataControlRowState è impossibile che non sia presente selected. Guarda qui http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.datacontrolrowstate.aspx.

Ciao
Sk

gae58 Profilo | Senior Member

ti ringrazio per la spiegazione, ma come già ti hi scritto precedentemente mi sono trovato in difficiltà

Non sapendo usare Varibili globali e siccome la var m'interessa solo in questa pagina, ho pensato di usare il ViewState:
quindi nell'onInserted della Tabella della form ho inserito il Codice:
int lastID = (int)e.Command.Parameters["@Prog"].Value;
ViewState["aa"] = lastID;
mvwTabelle.ActiveViewIndex = 0;
GridView1.DataBind();

mentre nel GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
ho inserito questo codice:
int a = ViewState["aa"];
if (a != 0)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (e.Row.Cells[6].Text == a.toString())
e.Row.RowState = DataControlRowState.Selected;
}
}

però mi ritorna questo errore presente nell'immagine

1288x217 17Kb


cosa ne pensi?



Gaetano

gae58 Profilo | Senior Member

ciao ho reso la var globale ed ho effettuato altre prove, ma mi sa che non va bene, in quanto il rowDataBound, funziona col paging. Infatti se mi posiziono sulla prima pagina ed inserisco un nuovo movimento, mi evidezia la prima riga, mentre se quando inseriusco il nuovo movimento mi trovo già sulla pagina dove verrà visualizzato va tutto bene.

Se però ho capito bene evidenzia la riga ma non la seleziona.

Gaetano

skraus Profilo | Junior Member

Forse non ho compreso cosa intendi per selezionare ?

Il fatto che la riga cambi colore è l'attestazione che è stata selezionata.

Ciao
Sk

gae58 Profilo | Senior Member

Ti dico quello che faccio.
Ho una gridView sulla prima pagina del multiview, nella seconfa pagina del multiview ho una formView.

La formView è collegata alla gridView attraverso un controlParameter, in particolare il SelectedIndexChanged della gridView

Quando inserisco un nuovo movimento mi sposto sulla formView e quando la salvo, mi scompare la form perchè la gridView non è selezionata sul movimento inserito.

Per l'editazione, clikko sul link del command per il SelectedIndexChanged e farmi visualizzare i dati nel dettaglio della form.
Quindi la grid mi serve per far vedere tutti i movimenti e la form per il dettaglio.

I problemi che ho, quindi, sono 2:
Il primo è quello che nell'inserimento la form non mi viene + visualizzata perchè il controlParameter non è valorizzato.
La seconda è che siccome dopo l'inseriemnto ho la necessità di far scegliere dei movimenti per l'invio di eMail e prendo dei dati dalla formView, non essendo questa visibile, mi ritoran un errore.

Spero di essere stato chiaro, so che ti sto facendo perdere tanto tempo.

grazie


Gaetano

skraus Profilo | Junior Member

>Ti dico quello che faccio.
>Ho una gridView sulla prima pagina del multiview, nella seconfa
>pagina del multiview ho una formView.
>
>La formView è collegata alla gridView attraverso un controlParameter,
>in particolare il SelectedIndexChanged della gridView

Perchè l'inserimento dei nuovi dati è relazionato ad un record mostrato nel GridView !? divesramente non comprendo la valenza del SelectedIndexChanged.

>Per l'editazione, clikko sul link del command per il SelectedIndexChanged
>e farmi visualizzare i dati nel dettaglio della form.
>Quindi la grid mi serve per far vedere tutti i movimenti e la
>form per il dettaglio.

Quindi nel formview mostri i dati provenienti da una query di Join ?

Scusami ma se non riesco a capire mi resta difficile aiutarti

Ciao
Sk
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