如何在 Windows 窗体中保存运行时创建的控件
本文关键字:运行时 创建 控件 保存 Windows 窗体 | 更新日期: 2023-09-27 18:35:09
这是我的代码
private void make_Book(int x, int y, string name)
{
#region Creating Book
// this code is initializing the book(button)
Button book1 = new Button();
Image img = button1.Image;
book1.Image = img;
book1.Name = name;
book1.Height = img.Height;
book1.Width = img.Width;
book1.Location = new Point(44 + x, 19 + y);
book1.Click += new EventHandler(myClickHandler);
groupBox1.Controls.Add(book1);
#endregion
}
每次我单击按钮时,此代码都会创建一个按钮,现在我想保存创建的按钮及其属性,以便每次应用程序启动时它们都会出现。
在 C# Visual Studio 2010 中编码...
一种解决方案可能是使用StringCollection
用户设置(编辑:在您的评论中,您说关闭应用程序时不会保留这一点。这不是真的,因为这是使用用户设置的全部意义......
在每一行中,您需要将控件的位置和名称保存为字符串,例如
120;140;MyName
当用户添加新按钮时,在StringCollection
中创建一个项目,如下所示:
private void make_BookButtonAndStore(int x, int y, string name)
{
make_Book(x,y,name);
Properties.Settings.Default.ButtonStringCollection.Add(String.Format("{0};{1};{2}", book1.Location.X, book1.Location.Y, book1.Name));
Properties.Settings.Default.Save();
}
private void make_Book(int x, int y, string name)
{
// this code is initializing the book(button)
Button book1 = new Button();
Image img = button1.Image;
book1.Image = img;
book1.Name = name;
book1.Height = img.Height;
book1.Width = img.Width;
book1.Location = new Point(44 + x, 19 + y);
book1.Click += new EventHandler(myClickHandler);
groupBox1.Controls.Add(book1);
}
然后,您需要通过读取每一行、提取位置和名称并再次调用make_book
(不是我的新 make_BookButtonAndStore
方法,因为这会使按钮加倍)从StringCollection
中的每个项目创建按钮的代码。
请注意,在添加第一个按钮之前,您可能需要使用 new
关键字创建StringCollection
。
编辑
要说明如何创建此类设置,请执行以下操作: 转到项目属性的"设置"选项卡。创建名为 ButtonStringCollection
的新设置,选择"类型System.Collections.Specialized.StringCollection
"和"范围User
"。
在窗体的构造函数中,添加以下行:
if (Properties.Settings.Default.ButtonStringCollection == null)
Properties.Settings.Default.ButtonStringCollection = new StringCollection();
然后,添加我上面提供的代码来创建按钮。此外,在窗体的 Load
事件处理程序中,添加如下所示的内容:
foreach (string line in Properties.Settings.Default.ButtonStringCollection)
{
if (!String.IsNullOrWhitespace(line))
{
// The line will be in format x;y;name
string[] parts = line.Split(';');
if (parts.Length >= 3)
{
int x = Convert.ToInt32(parts[0]);
int y = Convert.ToInt32(parts[1]);
make_Book(x, y, parts[2]);
}
}
}
当您调用该方法时make_Book
您可以将输入参数保存到数据库或应用程序当前使用的其他存储中。当应用程序启动时,您可以通过调用make_Book
方法加载所有按钮,该方法保存在应用程序存储中。
- 使用 XML 保存和还原 .NET 表单的选址
- 使用序列化将对象加载并保存到 XML
- C# 中的 Windows 窗体用户设置
这是如何节省负载 xml 的示例。
public static void Save(string x, string y, string name)
{
if (!Directory.Exists(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "''appName"))
{
Directory.CreateDirectory(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "''appName");
}
XmlDocument xmlDocument = new XmlDocument();
string xml = string.Format(@"<?xml version='1.0' encoding='utf-8'?><button><x>{0}</x><y>{1}</y><name>{2}</name></button>", x, y, name);
xmlDocument.LoadXml(xml);
xmlDocument.Save(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "''appName''button.xml");
}
public static Dictionary<string,string> Load()
{
string address = "";
if (!File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "''appName''button.xml"))
{
return new Dictionary<string,string>(){{"x",""},{"y",""},{"name",""}};
}
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "''appName''button.xml");
XmlNode button = xmlDocument.GetElementsByTagName("button").Item(0);
XmlNode nameNode = button.SelectSingleNode("name");
XmlNode xNode = button.SelectSingleNode("x");
XmlNode yNode = button.SelectSingleNode("y");
return new Dictionary<string, string>() { { "name", nameNode.InnerText }, { "x", xNode.InnerText }, { "y", yNode.InnerText } };
}