DOBON.NET DOBON.NETプログラミング掲示板過去ログ

TreeViewの特定のノードを選択不可にしたい

環境/言語:[WindowsXP, Visual Studio2005]
分類:[.NET]

TreeViewについて質問させてください。

通常、TreeViewのノードを選択すると、選択されたノードに
フォーカスが移り、テキストと背景の色が変わると思いますが、
特定のノードだけ選択できない(選択してもフォーカスが移らず
テキストと背景の色も変わらない)ようにすることは可能でしょうか。

 いち   ←ここだけ選択できないようにしたい
 ├に   ←以降、3つは選択できる
 ├さん
 └よん

というようにしたいのですが、なにか方法がありましたら、
お手数ですがご教授願います。
#System.Windows.Formsと仮定。

方法1
AfterSelect イベントで最新の選択ノードを記憶しておいて、ルートノードだったら元へ戻す。
#フォーカスの移り変わりは見えてしまう。

方法2
TreeViewを継承したコントロールのWndProcでWM_LBUTTONDOWNのときに
ルートノード上だったらMyBase.WndProcを呼び出さない。
#クリックしなかったことにする方法。
#未検証なのでたぶんということで。

今思いつくのはこんなところです。
■No21632に返信(まどかさんの記事)
> #System.Windows.Formsと仮定。
>
> 方法1
> AfterSelect イベントで最新の選択ノードを記憶しておいて、ルートノードだったら元へ戻す。
> #フォーカスの移り変わりは見えてしまう。
>
> 方法2
> TreeViewを継承したコントロールのWndProcでWM_LBUTTONDOWNのときに
> ルートノード上だったらMyBase.WndProcを呼び出さない。
> #クリックしなかったことにする方法。
> #未検証なのでたぶんということで。
>
> 今思いつくのはこんなところです。

まどかさん、アドバイスありがとうございます。

フォーカスの移り変わりが見えないようにしたいので、方法2でやってみようと思います。
しかしながら、Visual C#での開発が初めてでど素人なので、まずは方法2の実現方法について調査してみます。

なにか進捗がありましたら、またコメントさせていただこうと思います。
BeforeSelect イベントでキャンセルできます。ノードの参照も取得できたはずです。
が、フォーカスの移り変わりは見えてしまった記憶があります。(てことはダメですね…)

# たぶん、最も簡単なのはこの方法かな、ということで。
> BeforeSelect イベントでキャンセルできます。ノードの参照も取得できたはずです。

すっかり、忘れてました。
って、使ったこと無かった。
■No21642に返信(Rukuさんの記事)
> BeforeSelect イベントでキャンセルできます。ノードの参照も取得できたはずです。
> が、フォーカスの移り変わりは見えてしまった記憶があります。(てことはダメですね…)
> 
> # たぶん、最も簡単なのはこの方法かな、ということで。

Rukuさん、アドバイスありがとうございます。

BeforeSelectイベントを追加し、下記のメソッドを作成することで、イベントのキャンセルができました。

    public void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
    {
        // 選択したノードがルートノードか?
        if (e.Node.Parent == null)
        {
            // ルートノードの場合はイベントをキャンセルする
            e.Cancel = true;
        }
    }

引き続き、TreeViewを継承したコントロールを作成して実現できるか検討してみます。
余談です。

■No21645に返信(みゃさんの記事)
> // 選択したノードがルートノードか?
> if (e.Node.Parent == null)

私はこっちのほうが好きだなぁ。>↑が間違いということではありません。

If e.Node.Equals(Me.TreeView1.Nodes(0)) Then

e.Node が主役だし。

イベントの中なので上記の条件しかありえないけど、コードの中でやりくりする場合を考えると
Dim newNode As New TreeNode > この時点でnewNode.Parent Is Nothing
がちらついてしまいますねぇ。

以上、独り言でした。
2008/03/11(Tue) 17:46:01 編集(投稿者)

■No21646に返信(まどかさんの記事)
> If e.Node.Equals(Me.TreeView1.Nodes(0)) Then

余談に突っ込むのも無粋ですが、気になったので。
ルートノードは一つとは限らないのでこの判定はまずいと思います。
(0番目のノードだけがルートではありません。)
■No21647に返信(よねKENさんの記事)
> ルートノードは一つとは限らないのでこの判定はまずいと思います。
> (0番目のノードだけがルートではありません。)

そのとおり。
書き忘れました。m(_ _)m

DOBON.NET | プログラミング道 | プログラミング掲示板