Gestione controllo Multiview

venerdì 28 novembre 2008 - 13.17

antobx Profilo | Newbie

Salve a tutti,
stò lottando con il controllo Multiview e spero che qualcuno sappia darmi una mano :

Stà sviluppando una pagina in asp.net - visual studio 2008 :

L'idea è questa :
Ho una pagina che al caricamento deve essere popola con una sezie di controlli (label, textbox,
dropdownlist) i controlli sono raggruppati per "Sezioni".Quindi ho messo un controllo Multiview
su una pagina aspx. Al caricamento della pagina leggo da un db i dati per determinare quali e quanti controlli

caricare e procedo così :
creo un view lo aggiungo al multiview , aggiungo al singolo view i controlli. Così per n view.
Adesso vorrei poter navigare tra le "sezioni" , spostandomi tra una view è l'altra.

In pratica il mio codice si può riassumere così :

protected void Page_PreInit(Object sender, EventArgs e)
{
if (!IsPostBack)
{
CaricaControlli();
this.MultiViewSezioni.ActiveViewIndex = 0;
}
}

private void CaricaControlli()
{

legge da db

loop sui record

per ogni riga di configurazione carica uno o più controlli
(es.)
...

viewSezione = new View();
viewSezione.ID = "Sezione1" ;
int indiceSezione = 1 ;
...

label = new Label();
label.ID = "lblSezione" ;
label.Text = "testoLabelSezione";
this.MultiViewSezioni.Views[indiceSezione].Controls.Add(label);
...

}

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs"

Inherits="WebApplication.WebForm1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:MultiView ID="MultiViewSezioni" runat="server">
</asp:MultiView>
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="Default.aspx">Torna alla
pagina principale</asp:HyperLink>
</form>
</body>
</html>

Riesco a visualizzare correttamente la prima view con tutti i controlli
( this.MultiViewSezione.ActiveViewIndex = 0; ).
Il mio problema è che non riesco a navigare tra le view , ottengo sempre l'errore :
ActiveViewIndex is being set to '0'. It must be smaller than the current number of View controls
'0'.For dynamically added views, make sure they are added before or in Page_PreInit event. Parameter
name: value


Ho provato a inserire dei bottoni in cui inserire i diversi comandi di navigazione :
NextView/PrevView , SwitchViewByID, settare MultiView.ActiveViewIndex += 1 / -= 1 .
Nulla !

Cosa sbaglio ?


p.s.
Visto cosa voglio fare il controllo MultiView è una buona scelta ?

kontax Profilo | Junior Member

Non vorrei dire una stupidaggine, ma dopo il postback le View che crei dinamicamente, credo non persistano.Tu le crei solo quando il caricamento non è da un postback, ma così, non le ricrei, e di per se non rimangono nella pagina. Quindi ti da l'errore perchè non trova View.
Prova a crearne una non dinamicamente, la '0' e prova a vedere se ti da ancora errore, e se le View che hai crato ci sono ancora.
Ciao

antobx Profilo | Newbie

In effetti hai ragione. Così le view non sono persistenti . Infatti se subito dopo il caricamento , facendo dei test, cambio l'indice della ActiveViewIndex riesco a visualizzare la view corrispondente. Al primo post back
la collection di view sembra essere cancellata. Se provo a caricare i controlli ripetendo la procedura, il compilatore si arrabbia perchè trova che stò cercando di ricreare i controlli che ho creato la prima volta.
Che strano ... esistono gli oggetti contenuti non il contenitore (le view) . Ci sarà il modo di rendere persistenti le view ?
O il multiview non è l'oggetto adatto per fare quello che voglio ?
(l'idea era che avendo molti controlli da caricare era meglio avere tante pagine separate, piuttosto che
una paginata unica lunga tre kilometri ...).
Forse è meglio usare un controllo wizard ? Il problema è proprio il caricamento dinamico delle "pagine"
... e quindi mi ritroverei a dare testate sugli step del controllo wizard ?

kontax Profilo | Junior Member

Beh secondo me l'idea di usare la multiview è ottima.
Il problema è proprio il caricamento dinamico.
Cmq, credo che tu debba gestire manualmente il loro salvataggio nel Viewstate.
Butta un'occhiata su questo controllo, potrebbe semplificarti la vita, dato che si occupa di gestire la ricreazione dopo i postback dei controlli dinamici in esso contenuti:
http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx
Ciao

antobx Profilo | Newbie

Grazie per il suggerimento !

Purtroppo cercando in giro con google ho trovato queste indicazioni ( e altre ancora )

http://geekswithblogs.net/shahed/archive/2008/05/03/121869.aspx

http://david.safitech.com/?p=7

... "suonano" decisamente male ... penso che proverò
ancora a dare qualche testata, ma se c'è da scrivere tonnellate
di codice penso che cambierò approccio ...

kontax Profilo | Junior Member

Aspetta a scoraggiarti, un modo ci deve essere!
Intanto, ho provato a fare due test, visto, che si tratta di una situazione che non avevo mai affrontato.
Ho riscontrato il tuo stesso problema.
Però questa pagina sembra funzionare
:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

.cs:
using System; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void crea_view(object sender, EventArgs e) { Label lbl = new Label(); lbl.Text = "Ciao!"; View view = new View(); view.Controls.Add(lbl); MultiView1.Views.Add(view); Label lbl1 = new Label(); lbl1.Text = "Ciao mondo!"; View view1 = new View(); view1.Controls.Add(lbl1); MultiView1.Views.Add(view1); } protected void Button1_Click(object sender, EventArgs e) { MultiView1.ActiveViewIndex = 1; } protected void Button2_Click(object sender, EventArgs e) { MultiView1.ActiveViewIndex = 2; } }
Fammi sapere se così il problema si risolve!
Ciao

antobx Profilo | Newbie


Ho provato il tuo suggerimento e funziona perfettamente !! Grazie .

p.s.
(in realtà per "problemi tecnici" al momento non ho potuto testare su .net 3.5 ma su .net 2.0. Comunque
nel caso specifico non credo cambi nulla )
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