ENelsen Ответов: 1

ASP.NET Treeview с использованием PopulateOnDemand и флажков не работает по мере необходимости


Я использую элемент управления Treeview на веб-странице. На самом низком уровне находится более 1900 узлов, поэтому я пытаюсь использовать PopulateOnDemand. Это хорошо работает до тех пор, пока я не захочу найти все узлы, которые выбрал пользователь.

Когда любой из узлов, которые изначально заполнены, проверяются, они включаются в свойство CheckedNodes Treeview, когда я нажимаю кнопку упорядочить выбранные разделы.

Если я перехожу на уровень, который изначально не заполнен, выполняется tvDocList_TreeNodePopulate, и узел заполняется правильной информацией. Если я сейчас поставлю галочку рядом с одним из вновь заполненных узлов и нажму кнопку заказать выбранные разделы, то CheckedNodes не будет содержать ни одного из узлов, которые были заполнены по требованию.

Я попытался получить проверенные узлы с помощью TreeNodeCheckChanged, но единственные узлы, которые проходят через них, - это те, которые изначально загружены. Любые из них, загруженные по требованию, игнорируются.

Есть предложения?
Заранее спасибо.

Вот код, который я использую.

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ShoppingCart._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
  <h2>
        Welcome to Great River Printing!
    </h2>
    <asp:Table ID="Table1" runat="server" Width="100%">
    <asp:TableRow runat="server">
      <asp:TableCell runat="server">
        <asp:Button ID="btnOrderSelected" runat="server" Text="Order Selected Sections" />
      
    
  
    <asp:TreeView ID="tvDocList" runat="server" Width="316px" ShowCheckBoxes="All">
    <nodes>
      <asp:TreeNode ShowCheckBox="True" Text="Great River" Value="Great River">
      
    </nodes>


public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    if (!IsPostBack)
    {
      LoadPage();
    }
    btnOrderSelected.Click +=
      new EventHandler(btnOrderSelected_Click);
    tvDocList.TreeNodePopulate +=
      new TreeNodeEventHandler(tvDocList_TreeNodePopulate);
    tvDocList.TreeNodeCheckChanged +=
      new TreeNodeEventHandler(tvDocList_TreeNodeCheckChanged);
  }

  protected void LoadPage()
  {
    tvDocList.Nodes.Clear();
    tvDocList.ExpandDepth = 3;
    foreach (PageProject project in MySession.Current.Projects)
    {
      TreeNodeData node = project.AddToTree(null);
      node.AddToTree(tvDocList.Nodes);
    }
  }

  private void btnOrderSelected_Click(object sender, EventArgs e)
  {
    List<int> checkedIds = new List<int>();
    int id;

    foreach (TreeNode tn in tvDocList.CheckedNodes)
    {
      if (int.TryParse(tn.Value, out id))
        checkedIds.Add(id);
    }
  }

  void tvDocList_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
  {
    PageSection p = GetPageSection(e);
  }

  void tvDocList_TreeNodePopulate(object sender, TreeNodeEventArgs e)
  {
    PageSection pageSection = GetPageSection(e);
    if (pageSection != null)
    {
      TreeNodeData tnd = pageSection.AddToTree(null);
      tnd.AddChildrenToTree(e.Node);
    }
  }

  private PageSection GetPageSection(TreeNodeEventArgs e)
  {
    PageSection pageSection = null;
    int id;
    if (int.TryParse(e.Node.Value, out id))
    {
      foreach (PageProject project in MySession.Current.Projects)
      {
        pageSection = project.FindPageSection(id);
        if (pageSection != null)
        {
          pageSection.Selected = e.Node.Checked;
          break;
        }
      }
    }
    return pageSection;
  }
}
</int></int>

1 Ответов

Рейтинг:
2

Jim Heath

Старый вопрос. Но, поскольку это продолжало отображаться в результатах поиска, когда я тоже исследовал проблему, которую вы описываете, я подумал, что опубликую решение для других, которые могут столкнуться с этим.

При выполнении управления TreeView на веб - странице, использующей PopulateOnDemand, вы в основном хотите начать здесь: [^]

Однако для флажков, если вы хотите, чтобы все дочерние узлы проверялись при проверке родительского узла, вам понадобится JavaScript. Для этого я нашел, что это хорошо работает: языке C# TreeView в веб-форме регистрации дочерних узлов на родительские проверяем узел - переполнение стека[^]

Единственное, чего не хватает, - это ситуации, которую вы описываете. Например, если узел еще не развернут и, следовательно, не заполнен, то флажки еще не установлены. Таким образом, если родительский узел проверяется при расширении узла, то ни один из дочерних узлов не будет проверен.

Исправить это, как оказалось, очень просто. В подпрограмму, добавляющую дочерний узел, и непосредственно перед добавлением дочернего узла включите следующее:

//  If the node that we are expanding and populating is checked, then check all the children.
if (node.Checked) {
     newNode.Checked = true;
}