C# 从自定义RadTreeNode模板读取值-适用于子树,但不适用于根树

C# 从自定义RadTreeNode模板读取值-适用于子树,但不适用于根树,c#,asp.net,telerik,radtreeview,C#,Asp.net,Telerik,Radtreeview,我使用带有自定义元素模板的RadTree。每个元素还有3个单选按钮作为RadioButtonList,在自定义模板中定义。用于创建新radTree项的代码为: RadTreeNode node = new RadTreeNode(usedName, value); // just some name and value node.NodeTemplate = new AdminFunctionsPhenoTreeTemplate(); // makes buttons node.Expan

我使用带有自定义元素模板的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();
这段代码成功地创建了所需的节点和分配权限。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;
        }

    }
List all=(List)Tree.GetAllNodes();
foreach(ALL中的RadTreeNode节点)
{
RadioButtonList rbRights=(RadioButtonList)node.FindControl(“rbRights”);
accessLevel=rbRights.SelectedIndex;//我在这里读我的收音机
}
树的内容读取良好,子树按钮读取良好(通过回调调用创建的按钮)。但由上面的代码段创建的主根树的按钮总是返回默认值,既不是我在创建代码中插入的那个(尽管它反映在屏幕上),也不是我用鼠标选择的那个

模板的编码如下所示:

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

    }
类AdminFunctionsPhenoTreeTemplate:ITemplate
{
公共容器(控制容器)
{
container.Controls.Add(新的LiteralControl(“”);
标签标签1=新标签();
label1.ID=“ItemLabel”;
标签1.Text=“Text”;
label1.Font.Size=8;
//label1.Font.Bold=true;
label1.DataBinding+=新事件处理程序(label1\u DataBinding);
container.Controls.Add(label1);
container.Controls.Add(新的LiteralControl(“”);
RadioButtonList rbRights=新的RadioButtonList();
rbRights.ID=“rbRights”;
rbRights.Items.Add(新列表项(“r/o”);
rbRights.Items.Add(新列表项(“r/w”);
rbRights.Items.Add(新列表项(“r/w/meta”);
rbRights.SelectedIndex=0;
rbRights.RepeatDirection=RepeatDirection.Horizontal;
container.Controls.Add(rbRights);
container.Controls.Add(新的LiteralControl(“”);
}
私有void label1_数据绑定(对象发送方,事件参数e)
{
标签目标=(标签)发送方;
RadTreeNode节点=(RadTreeNode)target.BindingContainer;
string nodeText=(string)DataBinder.Eval(node,“Text”);
target.Text=nodeText;
}
}
我想知道我错过了什么,请帮我完成这项工作

已解决:

在回发中,onLoad中发生了一个错误的Tree.DataBind()调用

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