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ページを参照してください。
これらは、設計時にデフォルト値に設定するか、実行時にロードして保存することができます。例:デザイナーを使用して、名前付きIDという名前
の新しいユーザースコープを作成します。string[]
次に、コンストラクターで、このようなもの
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();
}
これは、格納されている配列の最初の要素が存在する場合はそれを使用し、存在しない場合は新しい文字列を作成して永続化します(したがって、次にプログラムを実行するときに設定から読み取られます)。