一种解决方案是使用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);
}
然后,您需要从StringCollection
中的每个项目创建按钮的代码,方法是读取每一行,提取位置和名称,并再次调用make_book
(而不是我的新make_BookButtonAndStore
请注意,在添加第一个按钮之前,您可能需要使用new
关键字创建StringCollection
。
EDIT
To explain how to create such a setting: Go to your project properties to the "Settings" tab. Create a new setting named ButtonStringCollection
, select type System.Collections.Specialized.StringCollection
and scope User
.
在表单的构造函数中,添加以下行:
if (Properties.Settings.Default.ButtonStringCollection == null)
Properties.Settings.Default.ButtonStringCollection = new StringCollection();
然后,添加我上面提供的代码来创建按钮。此外,在sLoad
事件处理程序的表单中,添加以下内容:
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]);
}
}
}