Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将TabContainer保存到Viewstate?_C#_Asp.net_Webforms_Ajaxcontroltoolkit_Viewstate - Fatal编程技术网

C# 如何将TabContainer保存到Viewstate?

C# 如何将TabContainer保存到Viewstate?,c#,asp.net,webforms,ajaxcontroltoolkit,viewstate,C#,Asp.net,Webforms,Ajaxcontroltoolkit,Viewstate,我一直在努力将一个TabContainer保存到一个viewstate变量,该变量将加载该TabContainer的所有tabpanel。(页面加载速度会更快吗?)。 如果问题格式不正确,请原谅;我还是asp.net新手,以下是我的代码: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { CreateTabbedPanel(); Response.Wr

我一直在努力将一个TabContainer保存到一个viewstate变量,该变量将加载该TabContainer的所有tabpanel。(页面加载速度会更快吗?)。 如果问题格式不正确,请原谅;我还是asp.net新手,以下是我的代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        CreateTabbedPanel();
        Response.Write("New Tabs Loaded");
    }
    else
    {
        // Here i would need to load the TabContainer from the viewstate variable
        Response.Write("Tabs Loaded from ViewState");
    }
}

private void CreateTabbedPanel()
{
    TabPanel tp = null;

    string CS = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
    using (SqlConnection con = new SqlConnection(CS))
    {
        SqlCommand cmd = new SqlCommand("select Description from TblProductType", con);
        con.Open();
        SqlDataReader rdr = cmd.ExecuteReader();
        while (rdr.Read())
        {
            tp = new TabPanel();
            tp.HeaderText = rdr["Description"].ToString();                    
            TabContainer1.Tabs.Add(tp);
        }
    }
    // Here i would need to create the viewstate variable
}
这是我的网络表单:

<form id="form1" runat="server">
    <div>
        <ajaxToolkit:TabContainer ID="TabContainer2" runat="server" 
           ActiveTabIndex="1" AutoPostBack="false">
        </ajaxToolkit:TabContainer>
    </div>
</form>


我需要做什么

如果希望将.Net对象保存到ViewState,则需要确保该对象支持序列化/反序列化。然而,这不太可能提高性能

ViewState数据被渲染到特定的隐藏字段中。如果将复杂对象保存到ViewState中,则会大大增加HTML页面大小。接下来,序列化/反序列化也需要时间

最后,您不能在ViewState中存储ASP.NET控件,因为。创建控件并将其添加到页面控件层次结构中时,它会经历ASP.NET生命周期的所有阶段:初始化、加载、渲染、[保存在ViewSate中]、卸载。下次从ViewState获取控件时,控件状态将为“渲染后”。如果将此类控件添加到新的页面控件层次结构中,处于“渲染后”状态的控件将再次开始执行初始化、加载和渲染阶段。尽管它可以在基本控件(标签、文本框等)的情况下操作,它完全打破了控件的生命周期,并在复杂控件中引发了各种奇怪的问题


如果动态创建ASP.NET控件,我强烈建议您在每次新页面请求时重新创建它们,因为ASP.NET页面生命周期需要这些控件

假设只需要保存几个选项卡名称,可以使用
ViewState
。否则,我建议您使用
Session
,因为它允许在服务器端存储复杂的对象,而无需将它们发布到页面中,它需要的代码更少,但您还需要处理过期的会话

选项卡集合为只读、不可序列化等。但是,此代码可用于将标题保存在
CreateTabbedPanel()

页面加载未回发时:

private void LoadTabs()
{
    string[] headers = (string[])ViewState["tabs"];
    if(headers!=null)
    {
        foreach (string header in headers)
        {
            TabContainer1.Tabs.Add(new TabPanel() { HeaderText = header });
        }
    }
}

非常感谢你derloopkat,它工作得很好。欣赏男人
private void LoadTabs()
{
    string[] headers = (string[])ViewState["tabs"];
    if(headers!=null)
    {
        foreach (string header in headers)
        {
            TabContainer1.Tabs.Add(new TabPanel() { HeaderText = header });
        }
    }
}