本文分步介绍了如何序列化 ASP.NET ListBox Web 服务器控件的 项目 属性。
当您开发 ASP.NET Web 应用程序,您可能希望存储到永久存储设备的 Web 服务器控件的属性。 通过创建扩展标准的 ASP.NET Web 控件库的功能的自定义类,可序列化 Web 服务器控件的公共属性。
- 启动 Microsoft Visual Studio.NET。
- 在 文件 菜单上单击 新建 ,然后单击 项目 。
- 在 项目类型 ,选择 Visual C# 项目 。 在 模板 ,下选择 类库 。
- 将该项目 SerializableControls,命名然后单击 确定 。 默认,一个类文件 (Class 1.cs) 是创建并添加到项目。
- 添加对 System.Web.dll 的一个引用。 要这样做,请按下列步骤操作:
- 在 Visual Studio.NET IDE 中 项目 菜单上单击 添加引用 。
- 在 .NET 选项卡上找到 System.Web.dll ,然后单击 选择 。
- 在中,单击 确定 , 添加引用 对话框以接受您的选择。 如果您收到提示您选择在库生成包装,单击 是 。
- 在 Class 1.cs 类文件重命名为 SerialListBox.cs。 为此,右键单击 Class 1.cs,在解决方案资源管理器,,然后单击 重命名 。 键入 SerialListBox.cs ,然后按 Enter 键。
- 在 SerialListBox.cs 文件中替换的现有代码:
using System; using System.Runtime.Serialization; using System.Web.UI.WebControls; namespace SerializableControls { [Serializable] public class SerialListBox : System.Web.UI.WebControls.ListBox , System.Runtime.Serialization.ISerializable { public SerialListBox() { } // Deserialization constructor public SerialListBox(SerializationInfo info, StreamingContext context) { string strItem; string strValue; // Obtain the list of item keys. string itemList = info.GetString("ItemList"); string [] items = itemList.Split(new Char[] {';'}); // Create a new list item for each key in the ItemList. for(int nCount = 0; nCount < (items.Length - 1); nCount++) // use (items.Length - 1) due to terminating ';' delimiter { // list item Text property strItem = items[nCount]; // list item Value property strValue = info.GetString("Item-Value-" + strItem); this.Items.Add(new System.Web.UI.WebControls.ListItem(strItem, strValue)); } } // Serialization function (see ISerializable) public void GetObjectData(SerializationInfo info, StreamingContext context) { string itemList = ""; foreach(ListItem item in this.Items) { // Add a ';' delimited list of item keys using the Text property of the item. itemList += item.Text + ";"; // Add a Key/Value pair to the SerializationInfo object. // Use the "Item-Value-<KEY>" format to distingush item-value properties // from other properties stored in the SerializationInfo object. info.AddValue("Item-Value-" + item.Text, item.Value); } info.AddValue("ItemList", itemList); } } }
- 在 生成 菜单上单击 生成解决方案 生成解决方案。 或者,按 Shift + Ctrl+B。
Create an ASP.NET WebForm to Test the Serializable Web Server Control
<script type="text/javascript"></script>
- 在 Microsoft Visual Studio.NET 中单击 文件 菜单上的 新建 ,然后单击 项目 。
- 在 项目 ,下选择 Visual C# 项目 。 在 模板 ,下选择 ASP.NET Web 应用程序 。
- 在 位置 框中替换 SerializationTest 默认名称。 如果在使用本地服务器您可以将在服务器名保留为 http://localhost 中。 生成 位置 框如下所示:
http://localhost/SerializationTest默认,在 WebForm 1.aspx 文件是创建和添加到项目。
- 添加一个对 SerializableControls 类库的引用。 要这样做,请按下列步骤操作:
- 在 项目 菜单中,Visual Studio.NET 集成开发环境 (IDE) 上, 单击 添加引用 。
- 在 .NET 选项卡上请选择 浏览 。
- 在 打开 对话框找到该 SerializableControls.dll 文件,单击 打开 ,并单击 确定 。
注意 : The SerializableControls.dll 文件将位于中刚刚创建类库项目在项目文件夹下的文件夹。
- 在较低的左角 Web 窗体设计器的单击要切换到 HTML 视图的 WebForm 1.aspx 的 HTML 。 替换现有代码与:
<%@ Register TagPrefix="cc1" Namespace="SerializableControls" Assembly="SerializableControls" %> <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="SerializationTest.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <cc1:SerialListBox id="lstSerListBox" style="Z-INDEX: 101; LEFT: 85px; POSITION: absolute; TOP: 23px" runat="server" Width="172px" Height="121px" EnableViewState="False" AutoPostBack="True"> <asp:ListItem Value="1">First Item</asp:ListItem> <asp:ListItem Value="2">Second Item</asp:ListItem> <asp:ListItem Value="3">Third Item</asp:ListItem> </cc1:SerialListBox> <asp:Button id="btnLoad" style="Z-INDEX: 105; LEFT: 17px; POSITION: absolute; TOP: 111px" runat="server" Text="Load"></asp:Button> <asp:Button id="btnSave" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 26px" runat="server" Text="Save"></asp:Button> <asp:Label id="lblValue" style="Z-INDEX: 106; LEFT: 270px; POSITION: absolute; TOP: 25px" runat="server" Width="68px" Height="22px">Value: </asp:Label> </form> </body> </HTML>
此代码将执行以下操作:
- 向 Web 窗体添加 按钮 Web 服务器控件。 控件的 ID 为 btnLoad ,且 Text 属性为 负载 。
- 向 Web 窗体添加 按钮 Web 服务器控件。 控件的 ID 为 btnSave ,且 Text 属性为 保存 。
- 向 Web 窗体添加 Label 控件。
- 添加包含三个列表项在 SerialListBox 自定义控件。 ID 设置为 lstSerListBox 。 要使用此控件,请您必须添加对 Web 页的顶部引用。 此引用 HTML 中定义命名空间和使用后标记的。
- 在较低的左角 IDE 的单击 设计 以切换到 WebForm 1.aspx 的设计视图。 双击 btnSave 。 在代码中的 Visual C#.NET 后启动 btnSave_Click() 事件处理程序 (WebForm 1.aspx.cs) 文件。 现有代码替换为下面:
private void btnSave_Click(object sender, System.EventArgs e) { Stream stream = new FileStream(@"c:/Test/MyListBox.bin", FileMode.Create, FileAccess.Write, FileShare.None); // Serialize the object, and close the TextWriter. BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, lstSerListBox); stream.Close(); // Clear all SerialListBox items. lstSerListBox.Items.Clear(); lblValue.Text = ""; }
- 在解决方案资源管理器右键单击 WebForm 1.aspx 文件,然后单击 视图设计器 若要切换回 WebForm 1.aspx 文件的设计视图。 在设计视图中双击 btnLoad 按钮。 这将打开 btnLoad_Click() 事件处理程序在 Visual C#.NET 代码。 替换为下面的代码的现有代码:
private void btnLoad_Click(object sender, System.EventArgs e) { // Open the FileStream to read from. Stream stream = File.OpenRead(@"C:/Test/MyListBox.bin"); // Deserialize the object, and close the TextReader. BinaryFormatter formatter = new BinaryFormatter(); lstSerListBox = (SerializableControls.SerialListBox)(formatter.Deserialize(stream)); stream.Close(); }
- 切换回,WebForm 1.aspx 设计视图,然后双击 lstSerListBox 列表框控件。 这将打开 lstSerListBox_SelectedIndexChanged() 事件处理程序在 Visual C#.NET 代码。 现有代码替换为下面:
private void lstSerListBox_SelectedIndexChanged(object sender, System.EventArgs e) { lblValue.Text = "Value: " + lstSerListBox.SelectedItem.Value.ToString(); }
- 在 WebForm 1.aspx.cs 文件中将以下代码添加要导入这些命名空间的顶部:
using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary;
- 在 生成 菜单上单击 生成解决方案 生成解决方案。 或者,按 Shift + Ctrl+B。
测试该 Web 窗体
<script type="text/javascript"></script>
- 在解决方案资源管理器右键单击 WebForm 1.aspx 文件,然后单击 在浏览器中的查看 。
- 看到包含 加载 按钮、 一个 保存 按钮、 一个列表框和标签在 Web 窗体页时, 单击列表框中的任何项。 标签控件显示所选的列表框项目的值。
- 单击 保存 。 列表框的内容序列化,,保存到磁盘中。 列表框的内容会消失。
- 单击 加载 。 序列化的数据读取磁盘和使用序列化的数据实例化一个新的 ListBox 控件。 列表框的内容会还原到以前的状态中。