トップ回答者
リストボックスの選択変更不可

質問
回答
-
>透明なパネル
その場合は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
-
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
すべての返信
-
ListBoxには、無効時の文字色を指定するプロパティ等はないと思います。
ListBoxを継承したコントロールクラスを作成し、WndProcをオーバライドして
WM_ENABLEメッセージやWM_PAINTメッセージあたりを判断して
ご自身でListBoxの描画処理を書くことになるのではないかなと思いました。
結構大変だと思いますので、見にくいということですが、そのまま使うことは無理ですか?
ちなみに以下の方法で簡単に近いものは実現できますが、変更不可時に再描画が行われる
ようなケース(別画面を手前に表示して、再度自身を手前に表示するなど)では、
対応できないと思います。
コンボボックスの例ですが、ListBoxでも同じです。
-
以下のように参考にして行いましたが、デザインで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
-
>透明なパネル
その場合は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
-
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