如何坚持以编程方式进行的设计时属性更改?

时间:2012-11-25 08:04:45

标签: c# .net custom-controls

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

当控件放在表单上时,我希望构造函数将其设置为Guid.NewGuid().ToString(),但前提是它尚未设置。

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

2 个答案:

答案 0 :(得分:3)

我创建了适合您要求的示例用户控件。在这种情况下,“MyLabel”继承自Label。

首先创建包含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值,这不是必需的。

答案 1 :(得分:-1)

我相信你需要的是Properties.Settings。请参阅MSDN page

您可以在设计期间将这些设置为默认值,或在运行时加载和保存 示例:使用设计器,创建一个新的用户范围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();
}

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