2

我有一个自定义控件,我添加了一个Id字符串属性。

当控件放置在窗体上时,我希望构造函数将它设置为Guid.NewGuid().ToString(),但前提是它之前没有设置。

当我从设计器手动编辑此属性时,它会在文件中添加一行代码Designer.cs。我怎样才能以编程方式做到这一点?
具体来说,如何从自定义控件中做到这一点?

4

2 回答 2

3

我创建了符合您要求的示例用户控件。在这种情况下,是从 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 值,这不是必需的。

于 2012-11-25T11:42:48.227 回答
-1

我相信你需要的是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();
}

如果有,这将使用存储数组的第一个元素,如果没有,它将创建一个新字符串,并将其持久化(因此下次运行程序时将从设置中读取它)。

于 2012-11-25T08:35:25.253 回答