カスタムコントロールを作成しようとしているときに、Visual Studio(2005/2008)エディターと組み合わせたSystem.Windows.Forms.TextFormatFlags列挙型で問題が発生しました。この問題の理由は、この列挙型にゼロ値にマップされる複数のメンバーがあるという事実に起因しているようです。これらのメンバー(GlyphOverhangPadding、Left、Default、Top)のいずれかを選択すると、エディターはプロパティを次のように設定します。
this.customControl.TextFormatFlags = System.Windows.Forms.TextFormatFlags.GlyphOverhangPadding;
コードは期待どおりにコンパイルされます。ただし、エディターのプロパティグリッドからゼロ以外のメンバー(「右」など)を選択すると、次のようになります。
this.customControl.TextFormatFlags = System.Windows.Forms.TextFormatFlags.Left, Default, Top, Right;
明らかに、これはコンパイルされません。ゼロ以外のメンバーを複数選択すると(UITypeEditorを使用して、たとえば「Right | Bottom」)、次のようになります。
this.customControl.TextFormatFlags = ((System.Windows.Forms.TextFormatFlags)((System.Windows.Forms.TextFormatFlags.Left, Default, Top, Right | System.Windows.Forms.TextFormatFlags.Left, Default, Top, Bottom)));
ご覧のとおり、エディターは4つのゼロ値メンバーのうち3つを選択したアイテムに追加します。
この問題を再現したい場合:
- Visual Studio 2005/2008(Windowsフォームアプリケーション)で新しいプロジェクトを作成する
- プロジェクトにカスタムコントロールを追加します。
新しいクラスにプライベートフィールドとパブリックプロパティを追加します。
private TextFormatFlags tff = TextFormatFlags.Default;
public TextFormatFlags TFFProperty {get {return this.tff; } set {this.tff = value; }}
コードをコンパイルする
- デザイナでForm1を開き、CustomControl1を追加します
- コードは正常にコンパイルされます
- 次に、エディターのPropertyGridでCustomControl1のプロパティを開きます
- 「その他」セクションの下にTFFPropertyが表示されます。
- プロパティにはいくつかの値があり、そのほとんどにコンマが含まれています。
- カンマを使用して値のいずれかを選択すると(「Left、Default、Top、HorizontalCenter」など)、コンパイルできないコードになります
Flags属性を使用して独自の列挙型を作成し、ゼロにマップされた複数のメンバーを追加した場合も同じことが起こります(これは、不正な形式のフラグ列挙型の一種ですか?)。これは、使用しているUITypeEditorのバグではないことを確認しました(UITypeEditorを使用しなくても同じ問題が発生します)。私はコンバーターの問題を回避しようとしましたが、これまでのところ成功していません。この問題を解決する方法について誰かが何かアイデアを持っているなら、私はそれらを聞いてうれしいです。