4

各ノードにカスタム プロパティを追加できるように TreeNode クラスを拡張する必要があります (WebForms TreeNode には Tag プロパティが含まれていないため)。だから、これは私の CustomTreeNode です:

public class CustomTreeNode : TreeNode
{

    public CustomTreeNode()
    {               
    }

    public CustomTreeNode(int nodeId, string nodeType)
    {
        NodeId = nodeId;
        NodeType = nodeType;
    }

    public string NodeType { get; set; }
    public int NodeId { get; set; }
}

CustomTreeNode を作成して TreeView に追加すると、次のようになります。

CustomTreeNode node = new CustomTreeNode(1, "CustomType");            
treeView.Nodes.Add(node);

次に、次のようにしてキャスト例外を取得します。

CustomTreeNode selectedNode = (CustomTreeNode)TreeView.SelectedNode;

TreeView は CustomTreeNode ではなく TreeNode を返すためです。

少し読んだところ、TreeView クラスを拡張し、CreateNode() メソッドをオーバーライドして、TreeNode ではなく CustomTreeNode を返す必要があるようです。だから私はこれを作成しました:

public class CustomTreeView : TreeView
{
    protected override TreeNode CreateNode()
    {
        return new CustomTreeNode();
    }
}

ただし、問題は CreateNode() が引数を取らないため、CustomTreeNode クラスの空のコンストラクターを呼び出す必要があることです。したがって、上記で CustomTreeNode を作成したとき、CustomTreeView からそれを取得すると、空のコンストラクターが値のないノードを返すため、nodeId と nodeType の値が失われています。

どんな助けでも大歓迎です。

4

1 に答える 1

5

これが私が思いついたものです(専門家、アドバイスを歓迎します)。コード ビハインドで をインスタンス化し、 CustomTreeNodesetter を介してプロパティを設定します。クラスを変更してCustomTreeNode、ViewState の値を永続化します。カスタム ツリー ビューによって返されるノードはCreateNode、ViewState 情報をロードします。

TreeNode クラス:

[DefaultProperty("Text")]
[ToolboxData("<{0}:CustomTreeNode runat=server></{0}:CustomTreeNode>")]
public class CustomTreeNode : TreeNode
{
    private const int NODE_TYPE = 1;
    private const int NODE_ID = 2;

    public string NodeType { get; set; }
    public int NodeId { get; set; }

    protected override void LoadViewState(Object savedState)
    {
        if (savedState != null)
        {
            object[] myState = (object[])savedState;
            if (myState[0] != null)
                base.LoadViewState(myState[0]);
            if (myState[NODE_TYPE] != null)
                this.NodeType = (string)myState[NODE_TYPE];
            if (myState[NODE_ID] != null)
                this.NodeId = (int)myState[NODE_ID];

        }
    }

    protected override Object SaveViewState()
    {
        object baseState = base.SaveViewState();
        object[] allStates = new object[3];
        allStates[0] = baseState;
        allStates[NODE_TYPE] = this.NodeType;
        allStates[NODE_ID] = this.NodeId;

        return allStates;
    }
}

TreeView クラス:

[DefaultProperty("Text")]
[ToolboxData("<{0}:CustomTreeView runat=server></{0}:CustomTreeView>")]
public class CustomTreeView : TreeView
{
    protected override TreeNode CreateNode()
    {
        // Tree node will get its members populated with the data from VIEWSTATE
        return new CustomTreeNode();
    }
}

単純な .aspx ファイル (カスタム コントロールがアセンブリ "Foo" と名前空間 "Bar" で定義されていると仮定します。

<%@ Register TagPrefix="customControl" Assembly="Foo" Namespace="Bar"  %>

<customControl:CustomTreeView ID="sampleTree" 
    runat="server" onselectednodechanged="sampleTree_SelectedNodeChanged"></customControl:CustomTreeView>
<asp:Label ID="lblSelectedNode" runat="server" ></asp:Label>

分離コード:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            PopulateTree();
        }
    }

    private void PopulateTree()
    {
        sampleTree.Nodes.Clear();
        CustomTreeNode root = new CustomTreeNode();
        root.Value = "root node";

        sampleTree.Nodes.Add(root);

        // Creating some fake nodes (you would of course be using real data)
        for (int i = 0; i < 10; i++)
        {
            CustomTreeNode child = new CustomTreeNode();
            child.NodeId = i;               // Saved in ViewState
            child.NodeType = "Type " + i;   // Saved in ViewState
            child.Value = child.NodeType;
            root.ChildNodes.Add(child);
        }
    }

    protected void sampleTree_SelectedNodeChanged(object sender, EventArgs e)
    {
        CustomTreeView cTreeView = (CustomTreeView) sender;
        lblSelectedNode.Text = ((CustomTreeNode)cTreeView.SelectedNode).NodeType;
    }
于 2012-04-26T08:55:28.787 に答える