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();
}
これは、格納されている配列の最初の要素が存在する場合はそれを使用し、存在しない場合は新しい文字列を作成して永続化します(したがって、次にプログラムを実行するときに設定から読み取られます)。