- PR -

自作コンボでプロパティ内で追加したItemがデザイナー内のソースコードにも埋め込まれてしまう

1
投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2006-02-02 10:12
こんにちは。お世話になってます。

今、標準コンボを継承してインストールされているフォントを列挙する自作コンボ
ボックスを作っています。

とりあえずソースは以下のようになってます。
コード:
    Public Class FontListComboBox
        Inherits ComboBox

        Private mFontList As FontListType = FontListType.Normal

        Property FontList() As FontListType
            Get
                Return mFontList
            End Get
            Set(ByVal value As FontListType)
                If mFontList <> value Then
                    mFontList = value
                    Call SetFontList()
                End If
            End Set
        End Property

        Enum FontListType
            Normal
            All
        End Enum

        Private Sub SetFontList()
            Dim i As Integer = 0
            Me.Items.Clear()
            If mFontList = FontListType.Normal Then
                Me.Items.Add("MS ゴシック")
                Me.Items.Add("MS 明朝")
            Else
                Dim ifc As New System.Drawing.Text.InstalledFontCollection
                Dim ffs As FontFamily() = ifc.Families
                Dim y As Integer = 0
                Dim ff As FontFamily
                For Each ff In ffs
                    Me.Items.Add(ff.Name)
                Next
            End If
            Me.Text = "MS ゴシック"
        End Sub

        Public Sub New()
            Call InitializeComponent()
            Call SetFontList()
        End Sub

        Private Sub InitializeComponent()
            Me.SuspendLayout()
            '
            'FontListComboBox
            '
            Me.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
            Me.ResumeLayout(False)

        End Sub
    End Class



FontListプロパティを変えることでMSフォント系のみか、インストールされているもの
すべてかが選択できます。

で、コンパイルして、フォームにそのコンボを貼り付け、FontListプロパティを変更
すると、デザイナー内のソース(Form1.Designer.vb)内のソースコードの以下の箇所

コード:
  Me.FontListComboBox1.Items.AddRange(New Object() { ・・・この部分・・・ }



に、SetFontListでセットした値が勝手にデザイナー内にも埋め込まれてしまいます。
したがって動きとしては、SetFontListメソッドで列挙したフォントをコンボに追加し、
さらにデザイナーで追加されたコードでさらに追加されるので、二重追加となって
しまいます。

コード:
If AppDomain.CurrentDomain.FriendlyName = "DefaultDomain" Then



でデザインモードの判別をしたうえでSetFontListを実行するようにもしてみたので
すが、やはりデザインモードのソースに埋め込まれてしまいます。

この問題を解決するにはどのようにすべきでしょうか?

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-02 10:25
引用:

maruさんの書き込み (2006-02-02 10:12) より:

この問題を解決するにはどのようにすべきでしょうか?


面倒ならば DesignMode プロパティ。

引用:

If AppDomain.CurrentDomain.FriendlyName = "DefaultDomain" Then


AppDomain を使う必要はありません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-02-02 10:57
南部です。

もしくは、デザイナにCodeDomシリアライズしないように指示するかですね。
コード:

<System.ComponentModel.DesignerSerializationVisibilityDesignerSerializationVisibility.Hidden)> _
Shadows ReadOnly Property Items() As ComboBox.ObjectCollection
Get
Return MyBase.Items
End Get
End Property




すみません、括弧が消えてました。
<System.ComponentModel.DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _


[ メッセージ編集済み 編集者: nanbu 編集日時 2006-02-02 12:51 ]
1

スキルアップ/キャリアアップ(JOB@IT)