0

その要素のカスタム テンプレートで RadTree を使用します。各要素には、カスタム テンプレートで定義された RadioButtonList として 3 つのラジオ ボタンもあります。新しい 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;
        }

    }

私は何が欠けているのだろうか、これを機能させるのを手伝ってください!

4

1 に答える 1

0

解決済み:

ポストバック時に、onLoad で途中で Tree.DataBind() 呼び出しが発生していました。

これは、クライアントからの値をデフォルトのテンプレート値にリセットしていました。

于 2013-01-31T10:03:31.293 に答える