asp:TreeViewがUpdatePanelにあるときに以前の選択をクリアするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/206024

質問

2つのUpdatePanelを含むASP.Net 2.0ページがあります。最初のパネルにはTreeViewが含まれています。 2番目のパネルにはラベルが含まれており、ツリー内の選択によってトリガーされます。ノードを選択すると、ラベルが期待どおりに更新され、クリックした TreeNode が強調表示され、以前に選択したノードが強調表示されなくなります。ただし、コードビハインドでノードが元々強調表示(選択)されている場合、別のノードを選択しても強調表示は削除されません。

マークアップ

<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional">
   <ContentTemplate>
      <asp:TreeView ID="TreeView1" runat="server" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged">
         <SelectedNodeStyle BackColor="Pink" />
      </asp:TreeView>
   </ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="True">
   <ContentTemplate>
      <asp:Label ID="Label1" runat="server" Text=" - "></asp:Label>
   </ContentTemplate>
   <Triggers>
      <asp:AsyncPostBackTrigger ControlID="TreeView1" EventName="SelectedNodeChanged" />
   </Triggers>
</asp:UpdatePanel>

背後のコード

protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostBack)
   {
      TreeView1.Nodes.Add(new TreeNode("Test 1", "Test One"));
      TreeView1.Nodes.Add(new TreeNode("Test 2", "Test Two"));
      TreeView1.Nodes.Add(new TreeNode("Test 3", "Test Three"));
      TreeView1.Nodes.Add(new TreeNode("Test 4", "Test Four"));
      TreeView1.Nodes[0].Selected = true;
   }
}

protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
   Label1.Text = TreeView1.SelectedValue;
}

最初に最初のノードが選択されます。別のノードを選択するときにハイライトが削除されないのはなぜですか?

また、別の質問私は答えを持っていない同じセットアップについて。助けていただければ幸いです。

編集 ChildrenAsTriggers =&quot; false&quot; の設定が機能することは知っていますが、ツリーが非常に大きくなる可能性があるため、ツリーの再レンダリングは避けたいと思います。

役に立ちましたか?

解決 3

これはちょっとしたハックかもしれませんが、これによりクライアントの選択がクリアされ、パネルの更新が回避されます。

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(function BeginRequestHandler(sender, args)
   {
      var elem = args.get_postBackElement();
      var selectedClassName = elem.id + '_1';

      var arrAllElements = GetElementsByClassName(selectedClassName, elem);
      var selectedNode = $get(elem.id + '_SelectedNode').value;

      for(var i = 0; i < arrAllElements.length; i++)
      {
         if(arrAllElements[i].childNodes[0].id != selectedNode)
            RemoveClassName(arrAllElements[i], selectedClassName );
      }
   }
);

「_ SelectedNode」非表示フィールドに値が含まれていない限り、選択したスタイル/クラスがすべてのツリーノードから削除されます。 GetElementsByClassName RemoveClassName は自分のjsライブラリにありますが、十分に明らかです。

他のヒント

    /// <summary>
    /// Remove selection from TreeView
    /// </summary>
    /// <param name="tree"></param>
    public static void ClearTreeView(TreeView tree)
    {

        if (tree.SelectedNode != null)
        {
            tree.SelectedNode.Selected = false;
        }
    }

すべてのノードの選択をfalseに設定する必要があります。

(treeview tvCategoriesで)アプリケーションの1つに次のようなものを使用します:

public void RefreshSelection(string guid)
{
    if (guid == string.Empty)
        ClearNodes(tvCategories.Nodes);
    else
        SelectNode(guid, tvCategories.Nodes);

}

private void ClearNodes(TreeNodeCollection tnc)
{
    foreach (TreeNode n in tnc)
    {
        n.Selected = false;
        ClearNodes(n.ChildNodes);
    }
}
private bool SelectNode(string guid, TreeNodeCollection tnc)
{
    foreach (TreeNode n in tnc)
    {
        if (n.Value == guid)
        {
            n.Selected = true;
            return true;
        }
        else
        {
            SelectNode(guid, n.ChildNodes);
        }
    }

    return false;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top