كيف يمكنني مسح التحديد السابق عندما asp:TreeView في UpdatePanel?

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

سؤال

لدي ASP.Net 2.0 الصفحة التي تحتوي على اثنين UpdatePanels.الفريق الأول يحتوي على TreeView.الفريق الثاني يحتوي على التسمية و يتم تشغيلها بواسطة مجموعة في الشجرة.عندما حدد عقدة التسمية يحصل على تحديث كما هو متوقع ، 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="false" سوف تعمل ولكن أريد أن تجنب تقديم الشجرة مرة أخرى كما أنها يمكن أن تكون كبيرة جدا.

هل كانت مفيدة؟

المحلول 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;
        }
    }

تحتاج إلى تعيين اختيار كاذبة على كافة العقد.

يمكنني استخدام شيء مثل هذا من التطبيقات (مع treeview tvCategories):

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