ASP.NET树视图并选择所选节点

ASP.NET树视图并选择所选节点,asp.net,treeview,Asp.net,Treeview,如何捕获单击树视图的选定节点的事件? 它不会触发SelectedNodeChanged,因为选择显然没有更改,但是我可以捕获什么事件,以便知道所选节点已被单击 更新: 当我有时间时,我将不得不深入到TreeView控件的内部,找出它处理单击事件的内容和位置,并对TreeView进行子类化,以便在SelectedNodeClicked上公开新事件 我可能会在圣诞节假期做这件事,我会报告结果 更新: 我在下面提出了一个解决方案,对TreeView控件进行子类化。最简单的方法——如果它不干扰代码的其余

如何捕获单击树视图的选定节点的事件? 它不会触发SelectedNodeChanged,因为选择显然没有更改,但是我可以捕获什么事件,以便知道所选节点已被单击

更新: 当我有时间时,我将不得不深入到TreeView控件的内部,找出它处理单击事件的内容和位置,并对TreeView进行子类化,以便在SelectedNodeClicked上公开新事件

我可能会在圣诞节假期做这件事,我会报告结果

更新
我在下面提出了一个解决方案,对TreeView控件进行子类化。

最简单的方法——如果它不干扰代码的其余部分——就是在SelectedNodeChanged方法中将节点设置为未选中

protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e){
  // Do whatever you're doing
  TreeView1.SelectedNode.Selected = false;
}

您可以始终使用MouseDown或MouseUp事件,并检查它是否位于所选节点。

存储所选内容,并使用页面加载事件处理程序中的代码将所选内容与所存储的内容进行比较。与SelectedNodeChanged不同,即使所选值不变,每次回发都会调用Page_Load

范例

html


在_TreeNodePopulate()事件中将节点添加到树时,请在节点上设置.SelectionAction属性

TreeNode newCNode;
newCNode = new TreeNode("New Node");

newCNode.SelectAction = TreeNodeSelectAction.Select;

//now you can set the .NavigateUrl property to call the same page with some query string parameter to catch in the page_load()

newCNode.NavigateUrl = "~/ThisPage.aspx?args=" + someNodeAction

RootNode.ChildNodes.Add(newCNode);

在经历了一段时间之后,我终于有时间研究了如何对TreeView进行子类化,以处理正在单击的选定节点

这是我的解决方案,它公开了一个新事件SelectedNodeClicked,您可以从页面或任何地方处理该事件。 (如果需要,重构成C#是一项简单的任务)

对我有用

c#:


我有一个问题看起来像,但我解决了它

在服务器端代码中:

    protected void MainTreeView_SelectedNodeChanged(object sender, EventArgs e)
    {
        ClearTreeView();
        MainTreeView.SelectedNode.Text = "<span class='SelectedTreeNodeStyle'>" + MainTreeView.SelectedNode.Text + "</span>";
        MainTreeView.SelectedNode.Selected = false;

    }

    public void ClearTreeView()
    {
         for (int i = 0; i < MainTreeView.Nodes.Count; i++)
        {
            for(int j=0;j< MainTreeView.Nodes[i].ChildNodes.Count;j++)
            {
                ClearNodeText(MainTreeView.Nodes[i].ChildNodes[j]);
            }
            ClearNodeText(MainTreeView.Nodes[i]);
        }
    }

    public void ClearNodeText(TreeNode tn)
    {
        tn.Text = tn.Text.Replace("<span class='SelectedTreeNodeStyle'>", "").Replace("</span>", "");
    }
 <style type="text/css">
     .SelectedTreeNodeStyle { font-weight: bold;}
 </style>
protectedvoid MainTreeView\u SelectedNodeChanged(对象发送方,事件参数e)
{
ClearTreeView();
MainTreeView.SelectedNode.Text=“+MainTreeView.SelectedNode.Text+”;
MainTreeView.SelectedNode.Selected=false;
}
public void ClearTreeView()
{
对于(int i=0;i
在客户端代码中:

    protected void MainTreeView_SelectedNodeChanged(object sender, EventArgs e)
    {
        ClearTreeView();
        MainTreeView.SelectedNode.Text = "<span class='SelectedTreeNodeStyle'>" + MainTreeView.SelectedNode.Text + "</span>";
        MainTreeView.SelectedNode.Selected = false;

    }

    public void ClearTreeView()
    {
         for (int i = 0; i < MainTreeView.Nodes.Count; i++)
        {
            for(int j=0;j< MainTreeView.Nodes[i].ChildNodes.Count;j++)
            {
                ClearNodeText(MainTreeView.Nodes[i].ChildNodes[j]);
            }
            ClearNodeText(MainTreeView.Nodes[i]);
        }
    }

    public void ClearNodeText(TreeNode tn)
    {
        tn.Text = tn.Text.Replace("<span class='SelectedTreeNodeStyle'>", "").Replace("</span>", "");
    }
 <style type="text/css">
     .SelectedTreeNodeStyle { font-weight: bold;}
 </style>

.SelectedTreeNodeStyle{font-weight:bold;}

我使用
ShowCheckBox
属性和Checked属性“突出显示”所选项目。 当
SelectedNodeChanged
事件引发时:

  • 我将旧选定对象的
    ShowCheckBox
    属性和
    Checked
    属性设置为false,并将新选定对象的
    ShowCheckBox
    属性和
    Checked
    属性设置为true
  • 我将所选节点用于任何操作
  • 最后,我取消选择所选项目:
    myTreeView.SelecteNode.Selected=false

  • 不幸的是,我仍然希望看到所选节点被实际选中。不幸的是,这没有帮助,因为任何事情都可能导致回发。我仍然无法判断所选节点是否已单击。此时,我关心的是ASP.NET TreeView控件。我想您可能指的是WinForm或WPF控件?或者你指的是DOM事件?我真的不想深入研究为此编写一些客户端代码。SelectAction已设置。问题仍然是,我不知道是否选择了一个已选择的节点导致了回发。是否已将其放入ascx控件中?我希望所选节点实际显示为已选择,因此这没有帮助
    TreeNode node = TreeTypes.FindNode(obj.CustomerTypeId.ToString());
    
    
    TreeTypes.Nodes[TreeTypes.Nodes.IndexOf(node)].Select();
    
        protected void MainTreeView_SelectedNodeChanged(object sender, EventArgs e)
        {
            ClearTreeView();
            MainTreeView.SelectedNode.Text = "<span class='SelectedTreeNodeStyle'>" + MainTreeView.SelectedNode.Text + "</span>";
            MainTreeView.SelectedNode.Selected = false;
    
        }
    
        public void ClearTreeView()
        {
             for (int i = 0; i < MainTreeView.Nodes.Count; i++)
            {
                for(int j=0;j< MainTreeView.Nodes[i].ChildNodes.Count;j++)
                {
                    ClearNodeText(MainTreeView.Nodes[i].ChildNodes[j]);
                }
                ClearNodeText(MainTreeView.Nodes[i]);
            }
        }
    
        public void ClearNodeText(TreeNode tn)
        {
            tn.Text = tn.Text.Replace("<span class='SelectedTreeNodeStyle'>", "").Replace("</span>", "");
        }
    
     <style type="text/css">
         .SelectedTreeNodeStyle { font-weight: bold;}
     </style>