none
リストボックスの選択変更不可 RRS feed

  • 質問

  • 一度複数選択されたリストボックスの内容を固定して(変更不可)にして、移行クリックしても選択内容が変えられないような方法はあるでしょうか?

    情報をお持ちの方いらっしゃいませんでしょうか?

    2011年1月19日 2:46

回答

  • >透明なパネル

    その場合はTabStopを無効にすることや、親コントロールのEnabledには対応できないなどがありそうです。

    親コントロール(パネルなど)が無い、又は無効にすることが無いならばいけますね。

     

    以下で確認用に試したら問題なく機能しました。参考にしてみてください。

    新規フォームのソースに貼りつけるだけです。

    Public Class Form1
      Private lbEx As ListBoxEx
      Private btn As Button
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        lbEx = New ListBoxEx() With {.Top = 20, .Left = 0, .Width = 100, .Height = 100}
        lbEx.Items.Add("item1")
        lbEx.Items.Add("item2")
        lbEx.Items.Add("item3")
        lbEx.Items.Add("item4")
        lbEx.Enabled = True
        lbEx.SelectionMode = SelectionMode.MultiSimple
        Me.Controls.Add(lbEx)
    
        btn = New Button() With {.Top = 0, .Left = 0, .Width = 100, .Height = 20}
        btn.Text = "Enable切替"
        Me.Controls.Add(btn)
        AddHandler btn.Click, AddressOf btn_Click
    
      End Sub
      Private Sub btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        lbEx.Enabled = Not lbEx.Enabled
      End Sub
    End Class
    Public Class ListBoxEx
      Inherits ListBox
      Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = &HA Then
          Return
        End If
        MyBase.WndProc(m)
      End Sub
    End Class
    
    

    • 回答としてマーク TAKAPI 2011年1月23日 11:34
    2011年1月19日 7:18
  • honefaiさんが指摘されているように問題となる点があるかもしれませんが、とりあえず透明なPanelのサンプルを見つけましたので、ご紹介しておきます。いずれ何かの役に立つかもしれません。
    C#のコードですがシンプルなコードですので、VBに変換することはたやすいと思います。

    Is it possible to disable the left most row selector of DataGridView? i.e. make it unclickable?
    http://www.windowsdevelop.com/windows-forms-general/is-it-possible-to-disable-the-left-most-row-selector-of-datagridview-ie-make-it-unclickable-31210.shtml

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク TAKAPI 2011年1月23日 11:33
    2011年1月20日 0:57
    モデレータ

すべての返信

  • Enabledプロパティではダメですか?

    listBox1.Enabled = False
    

    2011年1月19日 2:53
  • Enabled = Falseだと色が薄くなって見にくいので、どうにかならないでようか?

    2011年1月19日 4:14
  • ListBoxには、無効時の文字色を指定するプロパティ等はないと思います。

    ListBoxを継承したコントロールクラスを作成し、WndProcをオーバライドして

    WM_ENABLEメッセージやWM_PAINTメッセージあたりを判断して

    ご自身でListBoxの描画処理を書くことになるのではないかなと思いました。

    結構大変だと思いますので、見にくいということですが、そのまま使うことは無理ですか?

     

    ちなみに以下の方法で簡単に近いものは実現できますが、変更不可時に再描画が行われる

    ようなケース(別画面を手前に表示して、再度自身を手前に表示するなど)では、

    対応できないと思います。

    コンボボックスの例ですが、ListBoxでも同じです。

    http://marb.blog.shinobi.jp/Entry/297/

    2011年1月19日 5:15
  • 以下のように参考にして行いましたが、デザインでEnabled Trueにして、フォームロード時に
    Enabled Falseにしても文字がグレーのままです。
    T_ListBox はListBoxを継承したもので、大したオーバーライドはしてません。
    どこがいけないのでしょうか?
    Partial Class T_ListBoxEx
      Inherits T_ListBox
      Private Const WM_ENABLE = &HA
      'UserControl はコンポーネント一覧をクリーンアップするために dispose をオーバーライドします。
      <System.Diagnostics.DebuggerNonUserCode()> _
      Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
          If disposing AndAlso components IsNot Nothing Then
            components.Dispose()
          End If
        Finally
          MyBase.Dispose(disposing)
        End Try
      End Sub
    
      Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = WM_ENABLE Then
          Return
        End If
        MyBase.WndProc(m)
      End Sub
      'Windows フォーム デザイナで必要です。
      Private components As System.ComponentModel.IContainer
      'メモ: 以下のプロシージャは Windows フォーム デザイナで必要です。
      'Windows フォーム デザイナを使用して変更できます。 
      'コード エディタを使って変更しないでください。
      <System.Diagnostics.DebuggerStepThrough()> _
      Private Sub InitializeComponent()
        components = New System.ComponentModel.Container()
      End Sub
    
    End Class
    2011年1月19日 6:54
  • もしくは透明なパネルでListBoxを覆ってしまうかだと思います。以前どこかで見たと思うのですが、ちょっと探せない・・・

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年1月19日 7:00
    モデレータ
  • >透明なパネル

    その場合はTabStopを無効にすることや、親コントロールのEnabledには対応できないなどがありそうです。

    親コントロール(パネルなど)が無い、又は無効にすることが無いならばいけますね。

     

    以下で確認用に試したら問題なく機能しました。参考にしてみてください。

    新規フォームのソースに貼りつけるだけです。

    Public Class Form1
      Private lbEx As ListBoxEx
      Private btn As Button
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        lbEx = New ListBoxEx() With {.Top = 20, .Left = 0, .Width = 100, .Height = 100}
        lbEx.Items.Add("item1")
        lbEx.Items.Add("item2")
        lbEx.Items.Add("item3")
        lbEx.Items.Add("item4")
        lbEx.Enabled = True
        lbEx.SelectionMode = SelectionMode.MultiSimple
        Me.Controls.Add(lbEx)
    
        btn = New Button() With {.Top = 0, .Left = 0, .Width = 100, .Height = 20}
        btn.Text = "Enable切替"
        Me.Controls.Add(btn)
        AddHandler btn.Click, AddressOf btn_Click
    
      End Sub
      Private Sub btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        lbEx.Enabled = Not lbEx.Enabled
      End Sub
    End Class
    Public Class ListBoxEx
      Inherits ListBox
      Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = &HA Then
          Return
        End If
        MyBase.WndProc(m)
      End Sub
    End Class
    
    

    • 回答としてマーク TAKAPI 2011年1月23日 11:34
    2011年1月19日 7:18
  • honefaiさんが指摘されているように問題となる点があるかもしれませんが、とりあえず透明なPanelのサンプルを見つけましたので、ご紹介しておきます。いずれ何かの役に立つかもしれません。
    C#のコードですがシンプルなコードですので、VBに変換することはたやすいと思います。

    Is it possible to disable the left most row selector of DataGridView? i.e. make it unclickable?
    http://www.windowsdevelop.com/windows-forms-general/is-it-possible-to-disable-the-left-most-row-selector-of-datagridview-ie-make-it-unclickable-31210.shtml

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク TAKAPI 2011年1月23日 11:33
    2011年1月20日 0:57
    モデレータ
  • いつもいろいろ御助言ありがとうございます。

    参考にしてやってみます。

     

    2011年1月23日 11:33