我有一个自定义控件,我添加了一个Id
字符串属性。
当控件放置在窗体上时,我希望构造函数将它设置为Guid.NewGuid().ToString()
,但前提是它之前没有设置。
当我从设计器手动编辑此属性时,它会在文件中添加一行代码Designer.cs
。我怎样才能以编程方式做到这一点?
具体来说,如何从自定义控件中做到这一点?
我有一个自定义控件,我添加了一个Id
字符串属性。
当控件放置在窗体上时,我希望构造函数将它设置为Guid.NewGuid().ToString()
,但前提是它之前没有设置。
当我从设计器手动编辑此属性时,它会在文件中添加一行代码Designer.cs
。我怎样才能以编程方式做到这一点?
具体来说,如何从自定义控件中做到这一点?
我创建了符合您要求的示例用户控件。在这种情况下,是从 Label 继承的“MyLabel”。
首先创建包含 MyLabel 类的单独库,这是该类的代码:
public class MyLabel: Label
{
public string ID { get; set; }
protected override void OnCreateControl()
{
base.OnCreateControl();
if (this.DesignMode && string.IsNullOrEmpty(this.ID))
{
this.ID = Guid.NewGuid().ToString();
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
this.Text = this.ID;
}
}
如您所见,如果控件处于设计模式并且尚未设置任何值,则我的控件具有填充的 ID 属性。检查设计模式很重要,因此如果您重新打开项目,值不会改变。
OnPaint 事件的覆盖只是为了实时查看实际的 ID 值,这不是必需的。
我相信你需要的是Properties.Settings
. 请参阅MSDN 页面。
您可以在设计期间将这些设置为默认值,或在运行时加载和保存。
示例:使用设计器,创建一个新的用户范围string[]
命名 ID。然后在你的构造函数中,像这样
string ID = "";
if (Properties.Settings.Default.IDs!=null && Properties.Settings.Default.IDs.Length>0) {
ID = Properties.Settings.Default.IDs[0];
}
else {
ID = "random";
Properties.Settings.Default.IDs = new string[1];
Properties.Settings.Default.IDs[0] = ID;
Properties.Settings.Default.Save();
}
如果有,这将使用存储数组的第一个元素,如果没有,它将创建一个新字符串,并将其持久化(因此下次运行程序时将从设置中读取它)。