C# 如何持久化以编程方式进行的设计时属性更改?

C# 如何持久化以编程方式进行的设计时属性更改?,c#,.net,custom-controls,C#,.net,Custom Controls,我有一个自定义控件,在其中添加了Idstring属性 当控件放置在表单上时,我希望构造函数将其设置为Guid.NewGuid().ToString(),但前提是之前没有设置过 当我从设计器手动编辑此属性时,它会向designer.cs文件添加一行代码。如何以编程方式完成此操作? 具体来说,如何从自定义控件中执行此操作?我相信您需要的是属性。设置。看 您可以在设计期间将这些设置为默认值,或在运行时加载并保存。 示例:使用设计器,创建一个新的用户范围string[]命名ID。然后在构造函数中,类似这

我有一个自定义控件,在其中添加了
Id
string属性

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

当我从设计器手动编辑此属性时,它会向
designer.cs
文件添加一行代码。如何以编程方式完成此操作?

具体来说,如何从自定义控件中执行此操作?

我相信您需要的是
属性。设置。看

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

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

我创建了符合您要求的示例usercontrol。在本例中,是从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值,这不是必需的。

对不起,您到底想实现什么?一个窗体上控件的多个实例,所有实例的
Id
值相同?静态属性可以做到这一点。在定义中设置为
null
,然后在构造函数中检查它是否为
null
。否,我希望每个控件都有自己的唯一值。我可以在每次将控件添加到窗体时手动输入一个值,但我只是想使其自动,这样我就不必这样做了。我的想法是,我正在序列化有关控件的一些信息,下次程序启动时,它需要找到该信息,因此它需要保留Guid。但我只想让它成为我不需要指示其他开发人员在使用控件时将Id属性设置为唯一值的地方。将代码放入自定义控件构造函数中。@ChrisF就是这样。但它不会持久化,因此每次我关闭并重新打开表单设计器时,它都会生成一个新值。如何让它以我在设计器中手动编辑它的方式将该值序列化到Designer.cs是我无法理解的。无法通过编程更改应用程序级别设置。用户级设置可以是,但是当另一个开发人员从源代码管理获取代码时,用户设置将不会被包括在内,然后它将为他生成一个新的值。我需要在第一次设置后,每个人的值都保持不变。另外,如何将设置连接到特定控件?我想这只会把问题往后推一步,除非我在这里误解了什么。我添加了一个如何使用这些用户范围设置的示例。(也就是说,如果我有10个不同的控件来保存一个设置,我将使用什么来识别设置?在我看来,我需要做的正是为了实现这一点。哦,对不起,我以为你只是想保留每台计算机的设置。但是值应该是相同的,无论程序在哪里运行?那么如何关于现在创建,比如说,100个新的guid,并只将那些硬编码的guid存储在源代码中?这不会在程序执行之间保留ID。@ChrisF我不同意你的看法。我已经在程序的多次执行之间对此进行了测试,ID值为persisant(默认和自定义设置)。您是否将MyLabel放置在单独的库中?它将GUID保存到何处?GUID放置在设计器文件中,然后编译为exe/dll。我明天才有机会尝试此操作,但这与我最初尝试的操作非常相似。我怀疑您可能在启动并重新启动appli时打开了设计器窗口需要测试。但是如果您关闭设计器窗口,然后重新打开它,其值可能会有所不同。不过,我最希望的就是在这方面出错。我明天会通知您的。谢谢。