C# 选定的子节点文本检索在树状视图列表中工作不正常
在我的c#windows应用程序中,我有一个树视图列表框,其中的复选框设置为true。在运行时,我的程序在xml文件中检查此树视图的节点。在我的应用程序中,我使用以下代码隐藏了父节点复选框:C# 选定的子节点文本检索在树状视图列表中工作不正常,c#,winforms,checkbox,treeview,C#,Winforms,Checkbox,Treeview,在我的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_SET
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");
}
}
如果您能立即提供帮助,我们将不胜感激……因为我的工作现在处于暂停状态。从您的评论来看,您似乎只需要检查
子节点
,而不是一级节点
,因此这应该对您有效:
//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");
}
您的
级别1节点
没有任何复选框
,因此您不能使用选中的
属性,您到底想要什么?是否要检查子节点的已检查的?正如我所说,一级节点
没有任何复选框
,Checked
属性对它们来说是无用的。@KingKing:所以,没有其他方法来检查任何选定的子节点并获取它们相应的文本??检查我的答案以获取解决方案,如果没有,留下一些评论,这样我可以改进答案。谢谢…太棒了!!!这很好…但我可以看到选定复选框的文本在arraylist中重复出现。假设我选择了3个复选框,那么在我看来,arraylist的大小应该是3(从0到2),但是当我给第4个索引打印它时,它会打印出与0本身相同的结果。为什么会这样???@vysakh可能你已经连续多次尝试了,你需要在每次添加新文本之前清除复选框,我想在单击按钮时禁用所有其他复选框(用户在运行时未选中)……这可能吗?@vysakh查看我的更新,了解一些经过修改的代码,这些代码比两个单独的方法(一个用于获取选中的节点,另一个用于获取未选中的节点)更有效不是这样的..我问过,当我点击一个按钮时,它应该禁用当时未选中的所有复选框..这可能吗??
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)