2

ExtendedTreeNode という TreeNode から継承するクラスがあります。このタイプのオブジェクトをツリービューに追加することは問題ではありません。しかし、ツリービューからオブジェクトを取得するにはどうすればよいでしょうか?

私はこれを試しました:

TreeNode node = tvManual.Find("path/to/node"); // tvManual is a treeview

return ((ExtendedTreeNode)node).Property;

しかし、これはうまくいきません。次のエラーが表示されます: タイプ 'System.Web.UI.WebControls.TreeNode' のオブジェクトをタイプ 'PCK_Web_new.Classes.ExtendedTreeNode' にキャストできません。

これを機能させるにはどうすればよいですか?

- - - - - - 解決 - - - - - - - - -

[編集] 私のカスタム TreeNode クラスは次のようになります。

public class ExtendedTreeNode : TreeNode
{
    private int _UniqueId;

    public int UniqueId
    {
        set { _UniqueId = value; }
        get { return _UniqueId; }
    }
    public ExtendedTreeNode()
    {
    }
}

このようにして、ノードをツリービューに追加します。

ExtendedTreeNode TN2 = new ExtendedTreeNode();

TN2.Text = "<span class='Node'>" + doc.Title + "</span>";
TN2.Value = doc.ID.ToString();
TN2.NavigateUrl = "ViewDocument.aspx?id=" + doc.ID + "&doc=general&p=" + parent;
TN2.ImageUrl = "Graphics/algDoc.png";
TN2.ToolTip = doc.Title;
TN2.UniqueId = counter;

tvManual.FindNode(parent).ChildNodes.Add(TN2);

このようにして、ExtendedTreeNode オブジェクトを取得します。

TreeNode node = tvManual.Find("path/to/node");
ExtendedTreeNode extNode = node as ExtendedTreeNode;
return extNode.UniqueId;

.NET 3.5 SP1 を使用しています

4

3 に答える 3

2

TreeViewタグを使用して ASP.NET を実装する方法に関する Microsoft の例を見つけまし

サブクラス化とプロパティTreeNodeの追加以外に必要ないくつかの重要な手順は次のとおりです。Tag

メソッドをサブクラス化TreeViewし、オーバーライドする必要があります。CreateNode

public sealed class TaggedTreeView : TreeView {
   protected override TreeNode CreateNode() {
      return new TaggedTreeNode(this, false);
   }
}

これにより、が拡張タイプのノードではなく s でTreeView新しいノードを上書きするのを防ぎます。TreeNode

その特定のコンストラクターを使用できるようにする必要があります。(デフォルトのコンストラクターを使用しても機能するようですが、これを使用したのには十分な理由がある可能性が高いです。)

public sealed class TaggedTreeNode : TreeNode {
   object _Tag;

   public object Tag { get { return _Tag; } set { _Tag = value; } }

   ...

   protected internal TaggedTreeNode(TreeView owner, bool isRoot)
   : base(owner, isRoot) {
   }

拡張を使用するには、マークアップに次のような行を追加してタイプをインポートTreeViewする必要があります。Register

<%@ Register TagPrefix="asp" Namespace="MyNamespace" Assembly="MyAssembly" %>

...

<asp:TaggedTreeView ID="taggedTreeView" runat="server" />

また、継承されたクラスでオーバーライドする必要がありますLoadViewStateSaveViewStateTreeNode

public sealed class TaggedTreeNode : TreeNode {

   ...

   protected override void LoadViewState(object state) {
      var arrState = (object[])state;
      _Tag = arrState[0];
      base.LoadViewState(arrState[1]);
   }

   protected override object SaveViewState() {
      var arrState = new object[2];
      arrState[1] = base.SaveViewState();
      arrState[0] = _Tag;
      return arrState;
   }

これにより、ポストバック間でプロパティTreeViewの値を保持できます。Tag

于 2015-01-06T19:29:30.733 に答える
1

親の下にあるすべてのノードを取得するには、次を試すことができます。

TreeNode[] parentNode = treeView1.Nodes.Find (parentid, true);
foreach(TreeNode node in parentNode)
{
    ExtendedTreeNode ext_tree_node = node as ExtendedTreeNode;
    if(ext_tree_node != null)
    {
        // Do your work
    }
}
于 2009-09-17T11:34:55.743 に答える
0

ExtendedTreeNodeノードをsとして作成していると仮定します。

XxxView (ListView、TreeView、DataGridView) コントロールは予期せずクローンを作成する傾向があることに気付きました。実装しましたICloneable.Clone ()か?

それはうまくいくかもしれません。TreeNode はClone ()仮想的に実装します。

treenode の Tag プロパティを使用して拡張プロパティを実装する方が簡単だと思います。

TreeNode node = tvManual.Find("path/to/node");
return node.Tag as ExtendedTreeNode;

を使用しないことを強くお勧めしClone ()ます。壊れやすいパターンです。Tag プロパティを使用します。

class ExtendedInfo
{
    string NavigateUrl;
    string ImageUrl;
    int UniqueId;

    // other custom properties go here
}

// ...

void CreateTreeNode ()
{
    TreeNode TN = new TreeNode();

    string parent = "parent";    

    TN.Text = "<span class='Node'>" + doc.Title + "</span>";
    TN.Value = doc.ID.ToString();
    TN.ToolTip = doc.Title;

    ExtendedInfo extInfo = new ExtendedInfo;
    extInfo.NavigateUrl = "ViewDocument.aspx?id=" + doc.ID + "&doc=general&p=" + parent;
    extInfo.ImageUrl = "Graphics/algDoc.png";
    extInfo.UniqueId = counter;

    TN.Tag = extInfo;
}

// ...

ExtendedInfo GetExtendedInfo (TreeNode node)
{
    return node.Tag as ExtendedInfo;
}
于 2009-09-17T11:35:20.690 に答える