我使用带有其元素的自定义模板的 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;
}
}
我想知道我错过了什么,请帮助我完成这项工作!