- PR -

ユーザーコントロールにオブジェクトを追加する方法

1
投稿者投稿内容
さまかた
会議室デビュー日: 2008/08/21
投稿数: 5
お住まい・勤務地: 東京都
投稿日時: 2008-12-26 19:02
初めて書き込みます。

開発環境:WindowsXP Pro SP2
Visual Basic 2005

問題:ユーザーコントロール(TextBoxとBottunとGridを配置)を作成し、別フォームにそのユーザーコントロールを貼り付けます。

フォーム側の[デザイン画面]から貼り付けたユーザーコントロールに対してオブジェクト(TextBox等)を追加するにはどうしたらよいのでしょうか?

もちろんユーザーコントロール内に追加したオブジェクトは、ユーザーコントロール自身で認識されなくてはなりません。

このようなことをする経緯としまして、今回のユーザーコントロールは、他のプログラム(アプリケーション)からでも共通で使用できるということを前提に作ろうと考えています。

ユーザーコントロール内のTextBoxの値をGridに追加したり、Gridの値を選択することでTextBoxに反映させたりする仕様になっています。

この部分は共通仕様なのですが、プログラム(アプリケーション)ごとにユーザーコントロール内の必要なTextBoxの数が異なるため、その部分だけ増減できないものかと思いまして。

以上が今回の経緯です。

例えばなんですが、DataGridViewのプロパティにはColumnsというものがあって、そこからDataGridViewの列を編集したり追加できると思うんですが、同じようなことをユーザーコントロールに対してもやりたいのです。

DataGridViewもユーザーコントロールも私の中では同じオブジェクトとして認識しているので、できそうな気がするのですが…。

ここまで長くなってしまいましたが、どうかご教授のほうよろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-12-26 20:24
引用:

さまかたさんの書き込み (2008-12-26 19:02) より:

フォーム側の[デザイン画面]から貼り付けたユーザーコントロールに対してオブジェクト(TextBox等)を追加するにはどうしたらよいのでしょうか?


UserControl も Form もコンテナ コントロールに過ぎないですから Form に Control を追加するのと同じ方法でできます。 対象の UserControl のインスタンスの Controls プロパティから Add メソッドで TextBox 等を追加してください。

引用:

もちろんユーザーコントロール内に追加したオブジェクトは、ユーザーコントロール自身で認識されなくてはなりません。


通常は UserControl 自身で追加するので当然管理はできます。

引用:

このようなことをする経緯としまして、今回のユーザーコントロールは、他のプログラム(アプリケーション)からでも共通で使用できるということを前提に作ろうと考えています。

ユーザーコントロール内のTextBoxの値をGridに追加したり、Gridの値を選択することでTextBoxに反映させたりする仕様になっています。


無理に相違点まで取り込んで共通化する必要はないと思います。 よほど汎用性に富んでいないと可読性を損なうだけです。

単純に入力項目が可変であるという流れであれば、

引用:

この部分は共通仕様なのですが、プログラム(アプリケーション)ごとにユーザーコントロール内の必要なTextBoxの数が異なるため、その部分だけ増減できないものかと思いまして。


そういったものは List、View、Grid 系のいずれかが利用できないかをまず考えたほうがよろしいですね。

引用:

例えばなんですが、DataGridViewのプロパティにはColumnsというものがあって、そこからDataGridViewの列を編集したり追加できると思うんですが、同じようなことをユーザーコントロールに対してもやりたいのです。


TextBox でないとダメな場合は、UserControl に RowCount のようなプロパティを設けて、UserControl 自身が Control を生成してレイアウトするという流れになるでしょう。 Control の生成と追加方法は前述どおりです。 プロパティは System.Int32 型の行数、列数などを示すプロパティで良いでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-12-26 20:39
情報共有のためのリンク
http://bbs.wankuma.com/index.cgi?mode=al2&namber=30510
passol
常連さん
会議室デビュー日: 2008/12/12
投稿数: 20
投稿日時: 2008-12-27 03:42
こんにちは、passolです。
引用:

情報共有のためのリンク
http://bbs.wankuma.com/index.cgi?mode=al2&namber=30510


上記のマルチポスト先で、
引用:

Gridみたいなコントロールを自作すれば分かるということなので、試しに作ってみようと思います。
しかし、どうやって作ったらいいのか自分で見当がつきません。
その部分を是非とも教えていただきたいのですが…


とあるので、とっかかり程度にtextBoxの数をプロパティで指定できるサンプルを以下に記載します。
コード:
'(前提としてpanelコントロール「Panel1」をUserControl1に貼り付けていることとする。)
Public Class UserControl1
    '(前提として、panelをformに配置して置く)
    Private textBoxWidth As Integer = 100
    Private textBoxHeight As Integer = 20
    Private colCount As Integer = 0
    Public Property textBoxColCount() As Integer
        Get
            Return colCount
        End Get
        Set(ByVal value As Integer)
            If value < 0 Then
                MsgBox("0以下は指定できません。")
                Exit Property
            End If
            Me.SuspendLayout()
            If colCount < value Then
                For colLoopCount As Integer = colCount + 1 To value
                    Dim createTextBox As New TextBox
                    createTextBox.Location = New System.Drawing.Point((colLoopCount - 1) * textBoxWidth, textBoxHeight)
                    createTextBox.Name = "TextBox" & colLoopCount.ToString
                    createTextBox.Multiline = True
                    createTextBox.Size = New System.Drawing.Size(textBoxWidth, textBoxHeight)
                    createTextBox.TabIndex = colLoopCount
                    Me.Panel1.Controls.Add(createTextBox)
                Next
            Else
                For colLoopCount As Integer = colCount To value + 1 Step -1
                    Me.Panel1.Controls.Remove(Me.Panel1.Controls.Item("TextBox" & colLoopCount))
                Next
            End If
            Me.ResumeLayout()
            colCount = value
        End Set
    End Property
End Class


上記コードは、さっぱり役にたたないコードですが、とっかかり程度にはなると思います。

またマルチポスト先の文章の引用なんですが、
引用:

ただ、コードに書かずしてTextBoxの追加ってやはり難しいのでしょうか?
[デザイン画面]からだけでTextBoxを追加したり、追加したTextBoxとGridのとある列(Cell)を連携させることは難しいのでしょうか?


上記は結構大変です。
実装を試みるなら、下記URLを参考にしてみてください。
http://www.microsoft.com/japan/msdn/net/general/vsnetpropbrow.aspx#vsnetpropbrow_topic03
さまかた
会議室デビュー日: 2008/08/21
投稿数: 5
お住まい・勤務地: 東京都
投稿日時: 2009-01-06 14:41
返信遅くなり申し訳ありませんでした。
じゃんぬねっとさん、Jittaさん、passolさん、ご丁寧な回答ありがとうございました。
頂いた回答をもとに、もう少し自分で考えてみます。
1

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