434 messaggi dal 08 aprile 2009
Vorrei salvare nel ControlState tutto il contenuto di un panel.
Ho provato a fare questo:
        protected override object SaveControlState()
        {
            // scrittura del ControlState di base
            Object[] rawState = new Object[2];
            rawState[0] = base.SaveControlState();

            // aggiunta dell'indice selezionato
            rawState[1] = dialogModalForm;
            return rawState;


        }


        protected override void LoadControlState(object savedState)
        {
            // lettura del ControlState di base
            Object[] rawState = (Object[])savedState;
            base.LoadControlState(rawState[0]);

            // lettura dell'indice selezionato
            dialogModalForm = (Panel)rawState[1];



        }


Ma mi da il seguente errore:
"Il tipo 'System.Web.UI.WebControls.Panel' nell'assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' non è contrassegnato come serializzabile"

Non posso salvare tutto il Panel nel Control State?
Devo salvare oggetto per oggetto contenuto nel Panel?
no direi di no, non ha molto senso farlo, piuttosto salva solo le informazioni che contiene.

inoltre il ControlState è stato persanto per salvare piccole quantità di dati che anche disabilitando il ViewState permettano al controllo di funzionare

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
434 messaggi dal 08 aprile 2009
Allora ho fatto una prova e salvo solo la text di una textbox contenuta nel panel.
Il problema è che in fase di postback mi fa prima il loadcontrolstate del createchildrencontrol....
direi che è normale, prima salvati nel LoadControlState il valore che ti serve e ripristinalo quando hai creatoi figli, anche se sarebbe molto meglio che ogni figlio pensasse al proprio ControlState

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
434 messaggi dal 08 aprile 2009
Io sto impazzendo...non so come fare a salvare il viewstate di questi benedetti controlli.
Ti posto il codice e vedi se riesci a darmi una mano....

Questo è il mio composite control con supporto al design view.
Praticamente è un pop up contenitore di altri controlli asp.

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Web.UI;
using System.Web.UI.Design;
using System.Web.UI.Design.WebControls;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Runtime.Serialization;


namespace ManagementModalFormPopUp
{
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
    [Designer(typeof(ModalFormContainerControlDesigner))]
    [ParseChildren(true)]
    public class ModalFormContainerControl : CompositeControl
    {

       
        private Panel dialogModalForm;
        private ITemplate containerTemplate;
        private Control containerControl;
        [Browsable(false),
        PersistenceMode(PersistenceMode.InnerProperty)]
        public virtual ITemplate ItemTemplate
        {
            get
            {
                return containerTemplate;
            }
            set
            {
                containerTemplate = value;
            }
        }
        public ModalFormContainerControl()
        {
        }

        protected override void CreateChildControls()
        {
     
            //This is where the ItemTemplate is created
            containerControl = new Control();
            dialogModalForm = new Panel();
            dialogModalForm.ID = "dialogModalForm";
            Controls.Add(dialogModalForm);
            if (ItemTemplate != null)
            {
                ItemTemplate.InstantiateIn(containerControl);
            }


            dialogModalForm.Controls.Add(containerControl);

          

        }

        internal void GetDesignTimeHtml()
        {
            this.EnsureChildControls();
        }



        protected override void OnInit(System.EventArgs e)
        {

            if (!Page.ClientScript.IsClientScriptBlockRegistered(typeof(ModalFormContainerControl), "includeScriptJquery_132"))
            {
                Page.ClientScript.RegisterClientScriptInclude(typeof(ModalFormContainerControl), "includeScriptJquery_132", Page.ResolveClientUrl("~/js/jquery/jquery-1.3.2.js"));
            }

            if (!Page.ClientScript.IsClientScriptBlockRegistered(typeof(ModalFormContainerControl), "includeScriptJquery_uicore"))
            {
                Page.ClientScript.RegisterClientScriptInclude(typeof(ModalFormContainerControl), "includeScriptJquery_uicore", Page.ResolveClientUrl("~/js/jquery/ui/ui.core.js"));
            }

            if (!Page.ClientScript.IsClientScriptBlockRegistered(typeof(ModalFormContainerControl), "includeScriptJquery_uidraggable"))
            {
                Page.ClientScript.RegisterClientScriptInclude(typeof(ModalFormContainerControl), "includeScriptJquery_uidraggable", Page.ResolveClientUrl("~/js/jquery/ui/ui.draggable.js"));
            }

            if (!Page.ClientScript.IsClientScriptBlockRegistered(typeof(ModalFormContainerControl), "includeScriptJquery_uiresizable"))
            {
                Page.ClientScript.RegisterClientScriptInclude(typeof(ModalFormContainerControl), "includeScriptJquery_uiresizable", Page.ResolveClientUrl("~/js/jquery/ui/ui.resizable.js"));
            }

            if (!Page.ClientScript.IsClientScriptBlockRegistered(typeof(ModalFormContainerControl), "includeScriptJquery_uidialog"))
            {
                Page.ClientScript.RegisterClientScriptInclude(typeof(ModalFormContainerControl), "includeScriptJquery_uidialog", Page.ResolveClientUrl("~/js/jquery/ui/ui.dialog.js"));
            }

            if (!Page.ClientScript.IsClientScriptBlockRegistered(typeof(ModalFormContainerControl), "includeScriptJquery_bgiframe"))
            {
                Page.ClientScript.RegisterClientScriptInclude(typeof(ModalFormContainerControl), "includeScriptJquery_bgiframe", Page.ResolveClientUrl("~/js/jquery/external/bgiframe/jquery.bgiframe.js"));
            }

            HtmlHead head = (HtmlHead)Page.Header;
            HtmlLink link = new HtmlLink();
            link.Attributes.Add("href", Page.ResolveClientUrl("~/Dialog/css/jquery/ModalForm/jquery-ui-1.7.2.custom.css"));
            link.Attributes.Add("type", "text/css");
            link.Attributes.Add("rel", "stylesheet");
            head.Controls.Add(link);


            base.OnInit(e);
        }








        public void ShowModalForm(Page pagina, Type type, string ConteinerClientID, string TitleModalForm,Button ButtonOK)
        {


            string script = "";
            script += "<script type=\"text/javascript\">";
            script += "  $(function () {";
            script += "$(\"#" + ConteinerClientID  + "\").dialog({";
            //script += "      $(\"#ctl00_ContentPlaceHolderMain_PanelFormInsUtente_ContenutoInsUser\").dialog({";
            script += "    bgiframe: true,";
            script += "    modal: true,";
            script += "    resizable: true,";
            script += "    draggable: true,";
            script += "    title:\"SorpassoWeb - " + TitleModalForm + "\",";
            script += "    buttons: {";
            script += "    'OK': function() {";
            string PostBackEvent = pagina.ClientScript.GetPostBackEventReference(ButtonOK, string.Empty);
            script += PostBackEvent + ";";
            script += "        },";
            script += "    'Annulla': function() {";
            script += "            __doPostBack('dialogConfirm@no', '');";
            script += "";
            script += "        }";
            script += "    }";


            script += "});";
            //script +="}";
            script += "});";


            script += "</script>";
            pagina.ClientScript.RegisterClientScriptBlock(type, "ShowModalFormInsUser", script);

        }

    }

    public class ModalFormContainerControlDesigner :ContainerControlDesigner
    {
        private Style _style = null;

        // Add the caption by default. Note that the caption 
        // will only appear if the Web server control 
        // allows child controls rather than properties. 
        public override string FrameCaption
        {
            get
            {
                return "ModalForm ContainerControlDesigner";
            }
        }

        public override Style FrameStyle
        {
            get
            {
                if (_style == null)
                {
                    _style = new Style();
                    _style.Font.Name = "Verdana";
                    _style.Font.Size = new FontUnit("XSmall");
                    _style.BackColor = Color.LightBlue;
                    _style.ForeColor = Color.Black;
                }

                return _style;
            }
        }

        public ModalFormContainerControlDesigner()
    {}

        TemplateGroupCollection col = null;

        public override void Initialize(IComponent component)
        {
            // Initialize the base
            base.Initialize(component);
            // Turn on template editing
            SetViewFlags(ViewFlags.TemplateEditing, true);            
        }

        // Add instructions to the placeholder view of the control
        public override string GetDesignTimeHtml()
        {
            //First, ensure that the DialogBox creates child components
            ModalFormContainerControl ctl = (ModalFormContainerControl)this.Component;
            ctl.GetDesignTimeHtml();
            return base.GetDesignTimeHtml();
            
        }
        
        public override TemplateGroupCollection TemplateGroups
        {
            get
            {

                if (col == null)
                {
                    // Get the base collection
                    col = base.TemplateGroups;

                    // Create variables
                    TemplateGroup tempGroup;
                    TemplateDefinition tempDef;
                    ModalFormContainerControl ctl;

                    // Get reference to the component as TemplateGroupsSample
                    ctl = (ModalFormContainerControl)Component;

                    // Create a TemplateGroup
                    tempGroup = new TemplateGroup("ItemTemplate");

                    // Create a TemplateDefinition
                    tempDef = new TemplateDefinition(this, "ItemTemplate",
                        ctl, "ItemTemplate", true);

                    // Add the TemplateDefinition to the TemplateGroup
                    tempGroup.AddTemplateDefinition(tempDef);                    
                    col.Add(tempGroup);
                }

                return col;
            }
        }

        // Allow the control to be resized, regardless of templatemode or not.
        public override bool AllowResize
        {
            get
            {
                return true;
            }
        }

    }



}




dalle pagine lo instanzio in questo modo
<%@ Register Assembly="ModalFormPopUp" Namespace="ManagementModalFormPopUp" TagPrefix="PopUpGestDati" %>

                <PopUpGestDati:ModalFormContainerControl  EnableViewState="true" ID="PanelFormInsUtente" runat="server" 
                     >
                    <ItemTemplate>
                
                        <asp:Panel ID="ContenutoInsUser" runat="server">
                                <asp:TextBox ID="txt_input" runat="server"></asp:TextBox>
                      
                        </asp:Panel>
                    </ItemTemplate>
                </PopUpGestDati:ModalFormContainerControl>



Il pop up una volta aperto ha un bottone ok.
Quando viene cliccato ok viene prodotto un postback che ritorna sulla pagina principale.

    protected Button SalvaUtente;
    protected override void OnInit(EventArgs e)
    {

        //Generazione Bottoni di Salvataggio
        SalvaUtente = new Button();
        SalvaUtente.ID = "ButtonSalvaUtente";
        SalvaUtente.Text = "OK";
        if (Request.Browser.Browser.ToUpper().IndexOf("IE") < 0)
        {
            SalvaUtente.Style["display"] = "";
        }
        else
        {
            SalvaUtente.Style["display"] = "none";
        }

        PanelBottoniOperazioniDati.Controls.Add(SalvaUtente);
        SalvaUtente.Click += new EventHandler(this.SalvaUtente_Click);

        base.OnInit(e);
    }

    protected void SalvaUtente_Click(object sender, EventArgs e)
    {

        string testo = ((TextBox)PanelFormInsUtente.Controls[0].Controls[0].FindControl("ContenutoInsUser").FindControl("txt_input")).Text;
    }


Quando arrivo su SalvaUtente_Click la mia textbox è sempre vuota.

Io lo usercontrol lo ricarico sempre ed ho la prova che dopo il postback della pagina viene richiamato lìevento createchildcontrol.
E allora perchè non salva il viestate dei controlli figli (textbox ad esemio)?.
che cosa devo fare?
Gestire il save e Loadviewstate all'interno del CompositeControl?

Ti prego dammi un idea....
il codice non è poco,comunque mi sembra di capire che la tua txt_input si trova in una pop up, il vaolore quando tenti di recuperarlo?

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
434 messaggi dal 08 aprile 2009
cerco di recuperarlo sulla aspx di partenza.
Infatti è un bel pò di codice...:(
434 messaggi dal 08 aprile 2009
La textbox cmq si trova anche lei sulla aspx ma è dentro lo usercontrol (CompositeControl).
Poi vengono caricati nello usercontrol i javascript di jquery per il modalform che se gli dici come si chiama il div crea il popup.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
In primo piano

I più letti di oggi

Media
In evidenza
MISC