C#のプロジェクトは、完全な選挙をツリーのオプションをチェックし達成する必要があり、半分ダニは、状態を選択しないでください。
唯一のオリジナルのチェックとは、制御するため、2つの状態がチェックされないので、半分ダニのステータスコードはドローと自己定義する必要があります。
チェック:Node.Checked =真
オフにします:Node.Checked =偽
セミがチェック:Node.Checkedは=偽&& Node.ToolTipText = "セクションのチェック"
注意:半状態がOwnerDrawTextまたはOwnerDrawAllに描画モードあなたがコントロールのプロパティを設定する必要がありますコントロールを再描画する必要がありますチェック
コアロジック:選択された親ノードの設定(ノードを選択するとき、すべての兄弟ノードを選択したか否かを判断する。ノードは、兄弟ノードが半選択状態を選択し、選択された状態は、親ノードに、それによって決定されているか否かを判断する必要がある場合にキャンセル。 )
// 選択したノードをキャンセルした後、親ノードが選択されたすべてキャンセルする プライベート 無効 setParentNodeCheckedState(currNodeのTreeNode、BOOL 州) { ツリーノードのparentNode = ; currNode.Parent //現在のノードの親ノードを取得 parentNode.Checked = 国家を; //セット親ノードを選択した 場合(状態== falseに)状態が偽に設定されている場合// { int型フラグ=で0 ; foreachの(broNodeツリーノードでparentNode.Nodes)/ 親ノードの/子ノードは、半分があるか否かをチェックして決定されますオプションの状態 { IF(broNode.Checked || broNode.ToolTipText.Equals(" パートティック" )) { フラグに = 1 ; } } IF(フラグに== 1 )//親ノードセットは、半チェック状態有し { parentNode.ToolTipText =の" 部分的にチェックする" ; parentNode.Checked = falseに; } 他 { //親ノードの状態がチェックされていない設定 parentNode.ToolTipText =を「」; ParentNode.Checked = trueに、 parentNode.Checked = falseに、 コントロールを再描画するために、ノードの状態を変更する//チェックの必要性; } } 他{ //親ノードが選択状態に設定されている場合、 INTフラグ=で0 ; foreachの( broNodeのTreeNode でparentNode.Nodes)//選択されていないノードは、親ノードの子ノードの下にあるかどうかを判断します。 { IF(!BroNode.Checked) { フラグに = 1。; } } IF(==フラグに1。 ) { parentNode.ToolTipText = " セクションのチェック" ; parentNode.Checked = falseに; } そうでなければ { parentNode.ToolTipText = "" ; parentNode.Checked = trueに; } } IF(currNode.Parent。親!= nullの)//親ノードの親ノードが存在する場合 { SetParentNodeCheckedState(currNode.Parent州); //再帰呼び出し } }
2つのコアロジック:選択したサブノードを設定
// 選択されたノードの後、ノードの選択されたすべての子ノード のプライベート ボイド setChildNodeCheckedState(ツリーノード、currNode BOOL 状態) { TreeNodeCollectionノード = currNode.Nodes; //すべての子ノードを取得 IF(nodes.Count> 0 )//子ノードが存在 するforeachを(TNツリーノードでノード) { tn.Checked = 州; tn.ToolTipText = "" ; setChildNodeCheckedState(TN州); 子ノードに子ノード//再帰呼び出し } }
制御モニタープロパティを設定しAfterCheck
プライベート 無効 skinTreeView1_AfterCheck(オブジェクト送信者、TreeViewEventArgs E) { IF(e.Action == TreeViewAction.ByMouse)//マウスクリック { // textBox1.Text = e.Node.Text; IF (e.Node.Checked)//チェック { e.Node.ToolTipText = "" ; // 選択されたノードの後に、すべての子ノード選択ノード setChildNodeCheckedState(e.Node、真の); IF(!e.Node.Parent = NULL ) { setParentNodeCheckedState(e.Node、真の); } } 他 //未確認 { e.Node.ToolTipText = "" ; // 選択されたノードを解除した後、選択されたすべての子ノードキャンセル (e.Node、setChildNodeCheckedState falseにします)。 // ノードが親ノードが、非選択の親ノードが存在している場合 IF(e.Node.Parent!= NULL ) { setParentNodeCheckedState(e.Node、falseにします); } } } }
、モニタDrawNodeを再描画新しいパターンを描画半チェック状態が提供されます
プライベート ボイド ClassTreeList_DrawNode(オブジェクトSENDER、DrawTreeNodeEventArgs E) { IF(e.Bounds.Location.X <= 0 ) { リターン; } VARのツリービュー= SENDER AS のTreeView; VARブラシ= Brushes.Black; //黒 IF(e.Node .ToolTipText.EndsWith(" パートティック")&& == e.Node.Checked falseに) { //半決定の状態確認 するvar LOCATION = e.Node.Bounds.Locationと、 location.Offset( - 10、7。); VARのサイズ= 新新(サイズ。7、7 ); e.Graphics.FillRectangle(ブラシは、新しい新しい四角形(位置、サイズ)); //ここでは、正方形を描くには } // テキストを描画します e.Graphics.DrawString(e.Node.Text、treeview.Font、ブラシ、e.Bounds.Left、e.Bounds.Top); }