Чтение значений из пользовательского шаблона RadTreeNode - работает для поддеревьев, но не для корневого дерева

Я использую RadTree с пользовательским шаблоном его элементов. Каждый элемент также имеет 3 переключателя RadioButtonList, определенных в пользовательском шаблоне. Код, используемый для создания элементов нового radTree:

 RadTreeNode node = new RadTreeNode(usedName, value); // just some name and value
 node.NodeTemplate = new AdminFunctionsPhenoTreeTemplate(); // makes buttons
 node.ExpandMode = TreeNodeExpandMode.ServerSideCallBack;
 Tree.Nodes.Add(node); // adding node to RadTree.
// selections.
 RadioButtonList rbRights = (RadioButtonList)node.FindControl("rbRights");
if (rbRights != null)
 {
 rbRights.SelectedIndex= accessLevel; // set correct radio button using rbRights.SelectedIndex
 }
 node.DataBind();

Этот код успешно создает нужные узлы и присваивает rbRights.SelectedIndex= accessLevel действительно устанавливает желаемый переключатель в соответствии с инструкциями. Это работает для корневого дерева и для поддеревьев, которые я создаю при обратном вызове по требованию.

Тот же код, который используется для создания поддеревьев в обратном вызове на стороне сервера - я использую динамическое создание поддеревьев после того, как пользователь захочет развернуть дерево. Единственное формальное отличие, это присоединяет новое поддерево к свойству Nodes родительского узла (в отличие от объекта RadTree "Tree" в примере). Это все стандартно.

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

List<RadTreeNode> alls = (List<RadTreeNode>)Tree.GetAllNodes();
   foreach (RadTreeNode node in alls)
        {
            RadioButtonList rbRights = (RadioButtonList)node.FindControl("rbRights");
            accessLevel = rbRights.SelectedIndex; // here I read my radios
         }

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

Шаблон закодирован так:

class AdminFunctionsPhenoTreeTemplate : ITemplate
    {
        public void InstantiateIn(Control container)
        {
            container.Controls.Add(new LiteralControl("<table style=\"margin:0px;padding:0px;\"><tr><td>"));
            Label label1 = new Label();
            label1.ID = "ItemLabel";
            label1.Text = "Text";
            label1.Font.Size = 8;
            // label1.Font.Bold = true;
            label1.DataBinding += new EventHandler(label1_DataBinding);

            container.Controls.Add(label1);
            container.Controls.Add(new LiteralControl("</td><td>"));
            RadioButtonList rbRights = new RadioButtonList();
            rbRights.ID = "rbRights";
            rbRights.Items.Add(new ListItem("r/o"));
            rbRights.Items.Add(new ListItem("r/w"));
            rbRights.Items.Add(new ListItem("r/w/meta"));
            rbRights.SelectedIndex = 0;
            rbRights.RepeatDirection = RepeatDirection.Horizontal;
            container.Controls.Add(rbRights);
            container.Controls.Add(new LiteralControl("</td></tr></table>"));
        }

        private void label1_DataBinding(object sender, EventArgs e)
        {
            Label target = (Label)sender;
            RadTreeNode node = (RadTreeNode)target.BindingContainer;
            string nodeText = (string)DataBinder.Eval(node, "Text");
            target.Text = nodeText;
        }

    }

Интересно, что мне не хватает, пожалуйста, помогите мне сделать эту работу!

1 ответ

Решение

Решено:

при обратной передаче в onLoad происходил случайный вызов Tree.DataBind().

Это был сброс значений, поступающих от клиента, к значениям шаблона по умолчанию.

Другие вопросы по тегам