0

我使用带有其元素的自定义模板的 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“树”对象相反)。这都是标准的。

当我收到回发时,我会读取如下单选按钮的值:

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;
        }

    }

我想知道我错过了什么,请帮助我完成这项工作!

4

1 回答 1

0

解决了:

在回发时,onLoad 中发生了一个杂散的 Tree.DataBind() 调用。

这是将来自客户端的值重置为默认模板值。

于 2013-01-31T10:03:31.293 回答