- PR -

パネル上のテキストボックスを全て入力不可に

投稿者投稿内容
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2007-08-31 20:38
TableLayoutPanelを継承するクラスを作る。
TextBoxをn列Xm行配置する機能を実装する。
TextBoxをFor Each でLOOPさせ1つずつReadOnly = Trueする機能を実装する。


さまざまなカスタムコントロールの「拡張コントロール」を参照
http://msdn2.microsoft.com/ja-jp/library/ms171725(VS.80).aspx
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-08-31 22:03
引用:

なびさんの書き込み (2007-08-31 19:53) より:
とありますが、もう少し具体的に教えて頂けないでしょうか?



じゃあ具体的に。

他の方や自分の為に、リフレクション有りと無しと両方書いておきます。
ですが、なびさんにはリフレクション無しのものをお勧めします。

継承を勉強しておかないと、.Netの恩恵は殆ど受けられません。
少なくとも、「リフレクション無し」の物を
きちんと理解するところまでは勉強してから
使うことをお勧めします。

コード:
Public Class MyTableLayoutPanel
    Inherits TableLayoutPanel
    Private pReadOnly As Boolean

    Public Property [ReadOnly]() As Boolean
        Get
            Return Me.pReadOnly
        End Get
        Set(ByVal value As Boolean)
            Dim pi As System.Reflection.PropertyInfo
            For Each c As Control In Me.Controls
                'リフレクション有りなら
                pi = c.GetType.GetProperty("ReadOnly", GetType(Boolean), New System.Type() {})
                If pi IsNot Nothing AndAlso pi.CanWrite Then
                    pi.SetValue(c, value, Nothing)
                End If
                'リフレクション無しなら
                'Select Case True
                '    Case TypeOf c Is TextBoxBase
                '        CType(c, TextBoxBase).ReadOnly = value
                '    Case TypeOf c Is UpDownBase
                '        CType(c, UpDownBase).ReadOnly = value
                '    Case TypeOf c Is DataGrid
                '        CType(c, DataGrid).ReadOnly = value
                '    Case TypeOf c Is 他のReadOnlyがあるコントロール
                '        ・・・
                'End Select
            Next
            Me.pReadOnly = value
        End Set
    End Property

End Class


LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2007-09-01 16:06
れいさん、大変丁寧にありがとうございます。

早速試してみました。

ただどうしても気になるにが
For Each c As Control In Me.ControlsでLOOPしている点です。

コントロールが200あったら200回まわしますよね。

そこでやはりパネルのEnableを設定するだけというのは
魅力的です。

よっし〜さんに、ご紹介頂いたサイトも見てみましたが
パネル内のテキストボックスを黒く表示させる方法を
具体的にご教授頂けませんか。

宜しくお願いします。


shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-09-01 16:22
引用:

LANVINさんの書き込み (2007-09-01 16:06) より:
れいさん、大変丁寧にありがとうございます。


このスレでは初出ですよね?>LANVINさん。


引用:

コントロールが200あったら200回まわしますよね。


TableLayoutPanelからMyTableLayoutPanelを作っているのですから、使う方はProperty(ReadOnly)をfalseにするだけですが・・。

[ メッセージ編集済み 編集者: shimix 編集日時 2007-09-01 16:23 ]
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-09-01 17:45
引用:

コントロールが200あったら200回まわしますよね。


まわすことでパフォーマンスを気にしているのでしょうか?
実際、私も似たようなことをしているアプリケーションがありますが
気になるほどのものではありません。#スペックしだいかもしれませんが…

shimixさんもおっしゃられているように一度作ってしまえば
使うときはプロパティ設定一つのみです。

引用:

よっし〜さんに、ご紹介頂いたサイトも見てみましたが
パネル内のテキストボックスを黒く表示させる方法を
具体的にご教授頂けませんか。


紹介したリンク先に具体的に記載してありますよ?
但し、継承するのはTableLayoutPanelではなくTextBoxとなるはずですが。

それでもわからないというのであれば、『継承』を勉強してください。

#コンテナ内の子オブジェクトに対して、っていう方法をとれば
#TableLayoutPanelでも実現できるのかな…?面倒かも。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-09-01 22:37
引用:

LANVINさんの書き込み (2007-09-01 16:06) より:
コントロールが200あったら200回まわしますよね。
そこでやはりパネルのEnableを設定するだけというのは
魅力的です。



使うときはMyTableLayoutPanel.ReadOnlyを設定するだけですが、
それは理解していますか?
それとも、O(n)であることを気にしているのですか?

最終的に、コントロールの外観が変更され、描画がおきます。
その際変更された全てのコントロールに関して描画がおきますので、
その時点でO(n)です。
ですので、どのような方法でReadOnlyにしようと、
O(n)より小さくはできません。

表示の更新は、変な実装だとO(n^2)になる場合もありますが、
今回はなりません。
速度的には大差ないことになります。

>そこでやはりパネルのEnableを設定するだけというのは
>魅力的です。

これもO(n)になり、速度的には大差ありません。

引用:

よっし〜さんに、ご紹介頂いたサイトも見てみましたが
パネル内のテキストボックスを黒く表示させる方法を
具体的にご教授頂けませんか。



なびさんにもいいましたが、
愚直なのは悪いことではありません。
自分がきちんと理解できる、実装できる範囲内の技術で
要求仕様を満たすのも技術のうちです。

リンク先の内容で理解できないのであれば、
より基礎的なところから勉強する必要があると
認識すべきでしょう。

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