0

私の c# Windows アプリケーションには、チェックボックスが true に設定されたツリー ビュー リスト ボックスがあります。実行時に、プログラムは xml ファイル内のこのツリー ビューのノードをチェックします。アプリケーションでは、以下に示すコードを使用して親ノードのチェックボックスを非表示にしました。

public const int TVIF_STATE = 0x8;
    public const int TVIS_STATEIMAGEMASK = 0xF000;
    public const int TV_FIRST = 0x1100;
    public const int TVM_SETITEM = TV_FIRST + 63;

    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam,
    IntPtr lParam);

    public struct TVITEM
    {
        public int mask;
        public IntPtr hItem;
        public int state;
        public int stateMask;
        [MarshalAs(UnmanagedType.LPTStr)]
        public String lpszText;
        public int cchTextMax;
        public int iImage;
        public int iSelectedImage;
        public int cChildren;
        public IntPtr lParam;

    }

    void tree_DrawNode(object sender, DrawTreeNodeEventArgs e)
    {
        if (e.Node.Level == 1)
            HideCheckBox(e.Node.Parent);
        e.DrawDefault = true;
    }

    private void HideCheckBox(TreeNode node)
    {
        TVITEM tvi = new TVITEM();
        tvi.hItem = node.Handle;
        tvi.mask = TVIF_STATE;
        tvi.stateMask = TVIS_STATEIMAGEMASK;
        tvi.state = 0;
        IntPtr lparam = Marshal.AllocHGlobal(Marshal.SizeOf(tvi));
        Marshal.StructureToPtr(tvi, lparam, false);
        SendMessage(this.taskslctor_treeview.Handle, TVM_SETITEM, IntPtr.Zero, lparam);
    }

私が今欲しいのは、選択された子ノードを(実行時に)チェックできるようにすることです。選択した場合は、選択した子ノードのテキストを配列リストに追加できるようにする必要があります(複数のチェックボックスを選択できるため)。何も選択されていない場合、メッセージ ボックスは [何も選択されていません] として表示されます。

親チェックボックスを非表示にする前に、以下のコードを試してみるとうまくいきました..しかし、今(親チェックボックスを非表示にした後)これは機能しません..

public void checkednodes()
    {
        foreach (TreeNode node in taskslctor_treeview.Nodes)
        {               
            if (node.Checked)
            {
                check.Add(node.Text);
                MessageBox.Show(check.ToString());
            }
        }
        if (check.Count == 0)
        {
            MessageBox.Show("Atleast one task needs to be selected!!", "Error");
        }
    }

私の仕事は現在保留になっているので、すぐに助けていただければ幸いです..

4

1 に答える 1

1

child nodesあなたのコメントから、ではなくをチェックするだけでよいように見えるlevel-1 nodeので、これでうまくいくはずです:

//Use this to get all the Checked child nodes under a Parent node
private List<TreeNode> GetCheckedNodes(TreeNode node){
  List<TreeNode> nodes = new List<TreeNode>();
  if(node.Checked) nodes.Add(node);
  foreach(TreeNode n in node.Nodes)
    nodes.AddRange(GetCheckedNodes(n));
  return nodes;
}


 check.Clear();
 foreach (TreeNode node in taskslctor_treeview.Nodes) {               
    foreach(TreeNode childNode in GetCheckedNodes(node)){
        check.Add(childNode.Text);            
    }
 }
 MessageBox.Show(check.ToString());
 if (check.Count == 0){
    MessageBox.Show("Atleast one task needs to be selected!!", "Error");
 }

アップデート

Checkedノードとノードの両方を取得するには、ノードをそれぞれ格納Uncheckedする 2 を宣言する必要があります。次に、次のように、2 つのリストを満たすループがList<TreeNode>必要です。recursive

List<TreeNode> checkedNodes = new List<TreeNode>();
List<TreeNode> uncheckedNodes = new List<TreeNode>();
private void FillNodeLists(TreeNode node){
  if(node.Checked) checkedNodes.Add(node);
  else uncheckedNodes.Add(node);
  foreach(TreeNode n in node.Nodes)
     FillNodeLists(n);
}
//then just use the 2 Lists (such as loop through them)
于 2013-10-19T06:41:49.187 に答える