2016-06-01 2 views
0

私はに実際ににしようとしています。 「実際に」とは、TreeView1.SelectedNode = null;が実際にツリー内のノードを選択解除することを意味します。実際にはTreeView(.NET)内のすべてのノードの選択を解除します

視覚的に言えば、ノードは選択解除されています。しかし、新しいノードを追加しようとすると、ツリービューはツリーの最初のノード(上部)を自動的に選択し、理想的には親ノードを作成したいときにサブノードを作成します。ユーザーが子ノードを追加したい場合があるため、追加する前に選択したノードの選択を解除できません。私が望む動作は、親/子ノードがツリービューで選択されたものに基づいて追加されることです。何も選択されていない場合は、親を追加します。何かが選択されている場合は、その選択されたノードに子を追加します。

は、私がイメージとテキストを持つ関数で nodeと呼ばれる TreeNodeオブジェクトを構築し、すべてのことは、私は次があります。

 if (tvContent.SelectedNode == null) 
      tvContent.Nodes.Add(node); 
     else 
     { 
      tvContent.SelectedNode.Nodes.Add(node); 
      tvContent.SelectedNode.Expand(); 
     } 

I持って上記のコードを作ることになっているボタン「すべての選択を解除します」作業。そのボタンのコードは単純です:

tvContent.SelectedNode = null; 

恩赦私のタギングC#とVB.NETの両方。私は両方の人が好きなので、もし誰かがどちらかの言語で私を助けてくれるのなら、それは素晴らしいだろう!

おかげ

EDIT: 興味深いです。選択されたノードがnullであるかどうかをテストしている間、.NETは自動的に選択されたノードをツリーの最初のノードに設定します。次のコードは、 "トリガー"メッセージボックスを示しますが、ifステートメントが完了した後、ツリーの最初のノードをすぐに選択します。

private void btnDeselectAll_Click(object sender, EventArgs e) 
    { 
     tvContent.SelectedNode = null; 
     if (tvContent.SelectedNode == null) MessageBox.Show("trigger"); 
    } 

EDIT2:この問題は、ノードのタイトル入力用のInputBox関数を使用することにあります。何らかの理由で、ツリービューの選択されたノードが変更されます。私はストックプロジェクトでこれを試し、問題を再現することができました。私はこれを修正するものはないと思う:S

+0

を働いた最初のノードにtvContent.SelectedNodeを変更したコードの行を参照し、その後、右tvContent.SelectedNodeブロックにF11(ステップデバッグバイステップ)でブレークポイントを置きます。 – Martheen

+0

それを変更したコードは見つかりませんでした。正直なところ、それ自体が変更されているようです。 – KingDan

+0

@Martheen投稿を編集してください。これは、ネット内で奇妙な動作であると思われます。 – KingDan

答えて

0

したがって、「真の」選択解除を得ることは不可能です。ツリービューがフォーカスを失った後、フォーカスが再び得られると(例えば、入力ボックスウィンドウがポップアップするなど)、選択されたノードはもはやヌルにはならない。

いくつかの入力オプションで表示されるパネルを紹介して、ノードのタイトル入力を別のフォームではなくメインフォームで行うようにしました。私はこの修正が好きではありませんが、それはすべて行うことができます。

0

あなたのシナリオを再現しようとしましたが失敗しました。 SelectedNodeをnullに設定した後、それを読み取ろうとすると、私はnullのままでした。確認したい点:

  1. 実際にノードの選択を解除していますか? TreeViewの "HideSelection"プロパティがTrue(デフォルト)に設定されている場合、TreeViewがフォーカスを失ったときに選択が消えます(すべてのボタンを選択解除したように見えます)。 HideSelectionをFalseに設定することで、そうでないことを確認してください。

  2. SelectedNodeをnullに設定したときに、SelectedNodeChangedなどのイベントハンドラを起動していないことを確認してください。

+1

これは回答として投稿されましたが、質問に答えるつもりはありません。それはおそらく、編集、コメント、別の質問、または完全に削除されるべきです。 – Codexer

+0

お返事ありがとう! 1. HideSelectionがtrueに設定されましたが、変更時に同じ問題が発生しました。 2.選択したノードが "AfterSelect"でなく、nullに設定された後、私の知識に基づいてイベントが発生することはありません。 詳細なデバッグを行いました。新しいノードを追加するときに、ツリービューが選択したノードを持たないことを意味します。解決策の私の現在のアイデアは、最初に選択された別のノードがあるかどうかを判断する新しいノードが追加される前に設定されている何らかのフラグを持つことです。 – KingDan

+0

私の投稿の「EDIT2」は、問題を再現する方法を提供します。私はこのような何かを修正する方法は知らない:S – KingDan

0

これは私のために

Private LastSelectetNode As TreeNode 

Protected Overrides Sub OnBeforeSelect(e As TreeViewCancelEventArgs) 
    e.Cancel = LastSelectetNode Is Nothing 
    MyBase.OnBeforeSelect(e) 
End Sub 

Protected Overrides Sub OnMouseUp(e As MouseEventArgs) 
    Dim nd = MyBase.HitTest(e.Location).Node 
    If LastSelectetNode Is nd Then 
     SelectedNode = Nothing 
     LastSelectetNode = Nothing 
    Else 
     LastSelectetNode = nd 
    End If 
    MyBase.OnMouseUp(e) 
End Sub 
関連する問題