لماذا هو بلدي asp:TreeView العقدة المحددة إعادة تعيين عند في UpdatePanel?

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

سؤال

لدي asp.net 2.0 الصفحة التي تحتوي على 2 UpdatePanels.

الفريق الأول يحتوي على TreeView السيطرة عندما حدد عقدة في ثلاث مشاهدة السيطرة عليه يطلق تحديثا الثاني UpdatePanel فقط.هذا هو يتصرف بشكل صحيح.

هناك نوعان من أزرار على صفحة خارج تحديث لوحة (السابق/التالي).هذه أزرار الزناد تحديث من كلا الفريقين.سلوك أزرار لتحديد المجاورة عقدة في الشجرة.أول مرة كنت انقر على واحد من هذه الأزرار أحصل على توقع سلوك المجاورة عقدة اختيار كل من لوحات يتم تحديثها لتعكس هذا التغيير.

المشكلة يحدث عند النقر فوق أي من هذه الأزرار مرة أخرى.العقدة المحددة من treeview يبدو أن نتذكر المحدد سابقا عقدة و الأزرار تعمل على هذه العقدة.وبالتالي فإن سلوك السابق/الأزرار التالي هو أن تفعل شيئا أو القفز مرة أخرى اثنين.

تحرير - نموذج التعليمات البرمجية التي يوضح مشكلتي

العلامات

 <asp:UpdatePanel ID="myTreeViewPanel" runat="server">
    <ContentTemplate>
       <asp:TreeView runat="server" ID="myTreeView" OnSelectedNodeChanged="myTreeView_SelectedNodeChanged">
          <SelectedNodeStyle BackColor="#FF8000" />
       </asp:TreeView>
    </ContentTemplate>
    <Triggers>
       <asp:AsyncPostBackTrigger ControlID="myButton" EventName="Click" />
    </Triggers>
 </asp:UpdatePanel>
 <asp:UpdatePanel ID="myLabelPanel" runat="server">
    <ContentTemplate>
       <asp:Label runat="server" ID="myLabel" Text="myLabel"></asp:Label>
    </ContentTemplate>
    <Triggers>
       <asp:AsyncPostBackTrigger ControlID="myTreeView" EventName="SelectedNodeChanged" />
       <asp:AsyncPostBackTrigger ControlID="myButton" EventName="Click" />
    </Triggers>
 </asp:UpdatePanel>
 <asp:Button runat="server" ID="myButton" Text="myButton" OnClick="myButton_Click" />

التعليمات البرمجية خلف

   protected void Page_Load ( object sender, EventArgs e )
   {
      if ( !IsPostBack )
      {
         myTreeView.Nodes.Add( new TreeNode( "Test 1", "Test One" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 2", "Test two" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 3", "Test three" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 4", "Test four" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 5", "Test five" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 6", "Test size" ) );
      }
   }
   protected void myTreeView_SelectedNodeChanged ( object sender, EventArgs e )
   {
      UpdateLabel( );
   }
   protected void myButton_Click ( object sender, EventArgs e )
   {
      // here we just select the next node in the three
      int index = myTreeView.Nodes.IndexOf( myTreeView.SelectedNode );
      myTreeView.Nodes[ index + 1 ].Select( );
      UpdateLabel( );
   }
   private void UpdateLabel ( )
   {
      myLabel.Text = myTreeView.SelectedNode.Value;
   }

هو مثل viewstate من الشجرة لم يتم حفظها ؟

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

المحلول

من UpdatePanel التحكم نظرة عامة [asp.net]

الضوابط التي لا تتوافق مع الضوابط UpdatePanel

التالية ASP.NET الضوابط ليست متوافقة مع جزئية صفحة التحديثات ، وبالتالي فهي غير معتمدة داخل UpdatePanel التحكم:

  • TreeView و عناصر القائمة.
  • ...

نصائح أخرى

أعتقد أنك على حق حول اياكس جزئية الصفحة إعادة النشر أنه لا تحديث الخفية الإدخال __ViewState.

لدي نفس الشيء مع تحديث لوحات عندما يتنقل المستخدم إلى صفحة في موقع الويب الخاص بي استمارة الطلب.العادي مدخلات تحديث viewstate و حتى القيم اسكانها ولكن الدولة من الضوابط التي تم تحديثها مع اياكس لم تسجل حتى أنها تعود إلى الحالة الافتراضية.

يمكنني حل هذه المشكلة عن طريق حفظ واستعادة العقدة المحددة في صفحات رأي الدولة, فقط عن طريق إضافة اثنين من هذه الوظائف.

protected override object SaveViewState()
{
   ViewState["SelectedNodePath"] = myTreeView.SelectedNode.ValuePath;
   return base.SaveViewState();
}

protected void Page_PreLoad(object sender, EventArgs e)
{
   if (ViewState["SelectedNodePath"] != null)
   {
      TreeNode node = myTreeView.FindNode(ViewState["SelectedNodePath"].ToString());
      if (node != null)
         node.Select();
   }
}

لا أستطيع تحميل مختارة العقدة داخل LoadViewState() لأن الشجرة لا يملك أي العقد في هذه النقطة.إذا كنت تفعل ذلك في التحميل المسبق.

هو فقط شعور خاطئ بأن علي أن أفعل هذا.أنا في عداد المفقودين شيئا ؟

أنا التي تواجه تقريبا مشكلة مشابهة.خسرت CheckedNodes جمع.أشك نفس الأسلوب في حل مشاكلي.أي فكرة ؟

تحديث:أنا حل المشكلة إلى حد كبير وتستخدم بعض الحلول.لرؤية التفاصيل هنا: TreeView داخل UpdatePanel المسألة - postbacks على الاختيار وازل من عقدة الاختيار و باستخدام TreeView داخل اياكس UpdatePanel

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top