DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ユーザーコントロールでのEnum型プロパティ

環境/言語:[VB.NET (OS:Win2K)]
分類:[.NET]

毎度お世話になっております。
どうか、ユーザーコントロールのプロパティについて
精通されている方の知恵を拝借させて下さい。

現在、会社でのプロジェクトで共通ライブラリを担当しております。
入力文字を規制するために、自作のExTextBoxクラスモジュールを実装し、
入力許可文字を設定する自作のプロパティなどを設けていました。

しかしながら、クラスモジュールでのプロパティの実装は、
コード上で何かしろ指定するなどしなければなりません。
例えば、現在はカスタム可能な関数などで、

' /* 許可文字取得関数 */ (Permは許可文字専用の構造体)
Private Function GetPermString(
  Select Case nControlName
    ' /* 数字のみ許可する */
    Case "txtHoge", "txtSore"
      Return Perm.NumberOnly

    ' /* ローマ字のみ許可する */
    Case "txtKore"
      Return Perm.RomaAll

    ' /* 特殊なフィールドなので、直接定義 */
    Case "txtKubun"
      Return "1248"
  End Select
End Function

などどして、プログラムごとにそのコントロール名を記述して、
入力許可文字を取得し、それを共通ライブラリでエラーチェックしています。

ですが、コード上でそういった属性を記述すると、
対応を見る際にコードとデザイナを行き来することになります。
プログラマ側としては画面設計をしている時に、プロパティを指定したいものです。

そこで、TextBoxを継承したユーザーコントロールを使用して、
Typeプロパティを追加することにしました。
画面デザイナのプロパティウィンドウでコンボによるリスト選択を行うため・・・

Public Class ExTextBox
  Inherits System.Windows.Forms.TextBox

  ' /* 許可文字列挙体 */
  Public Enum EnumType As Byte
    Free  = 0
    Number = 1
    RomaAll = 2
    Kana  = 4
    (中略)
  End Enum

  ' /* Typeプロパティの結果を格納 */
  Private _Type As String

  ' /* ExTextBox::Typeプロパティ */
  Public Property Type() As EnumType
    Get
      ' /* 許可文字から対応する許可文字列挙体を取得する関数 */
      Return GetTypeSelection(_Type)
    End Get

    Set(ByVal uType As EnumType)
      ' /* 許可文字列挙体から対応する許可文字を取得する関数 */
      _Type = SetTypeSelection(uType)
    End Set
  End Property
End Class

としているのですが、Enum列挙体を使うと今度は
『プログラマが独自に文字列を書き込むことができない』ということになります。

プロパティウィンドウで、コンボによる規定のプロパティを選択でき、
かつプログラマが独自に文字列を設定できるようにできないのでしょうか?

# 仕様云々は既に決定済みで後戻りができません・・・
ユーザーコントロールのプロパティに全く精通してなく、ご質問の意味もいまいち分かっていないのですが...。

> としているのですが、Enum列挙体を使うと今度は
> 『プログラマが独自に文字列を書き込むことができない』ということになります。

私が思うに、勝手にプログラマが書き込むほうが、それを処理する方が対応していなければ意味がないため、混乱するような気がするのですが...。

> プロパティウィンドウで、コンボによる規定のプロパティを選択でき、
> かつプログラマが独自に文字列を設定できるようにできないのでしょうか?

文字列の設定はstring型の配列を使い、コンボボックスでの表示はStringConverterからの継承クラスを使う(これに関しては、「.NET Framework の PropertyGrid コントロールの高度な活用」の「簡単なドロップダウン プロパティのサポートを提供するには」)というのでは?

・.NET Framework の PropertyGrid コントロールの高度な活用
http://www.microsoft.com/japan/msdn/net/general/usingpropgrid.asp
2004/06/07(Mon) 09:41:11 編集(投稿者)
2004/06/07(Mon) 09:41:06 編集(投稿者)

ご解答ありがとうございます。

> ユーザーコントロールのプロパティに全く精通してなく、
> ご質問の意味もいまいち分かっていないのですが...。

> 私が思うに、勝手にプログラマが書き込むほうが、
> それを処理する方が対応していなければ意味がないため、混乱するような気がするのですが...。
一応、「処理する側」よりも前の段階(デザイナでプロパティ変更時)に、
書式として認識できなければブランクにするようにしていますので大丈夫かと思われます。

> 文字列の設定はstring型の配列を使い、コンボボックスでの表示はStringConverterからの継承クラスを使う(これに関しては、「.NET Framework の PropertyGrid コントロールの高度な活用」の「簡単なドロップダウン プロパティのサポートを提供するには」)というのでは?

> ・.NET Framework の PropertyGrid コントロールの高度な活用
> http://www.microsoft.com/japan/msdn/net/general/usingpropgrid.asp

情報ありがとうございます。早速、目を通してみます。
一応、現在はもう1つプロパティを追加し、Typeプロパティが「UserDefine」でないと触れないようにすることで解決しています。
とりあえず、[解決]とさせて頂きます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板