سؤال

ولدي فئة يرث من TreeNode، ودعا ExtendedTreeNode. لإضافة كائن من هذا النوع إلى تريفيف ليست مشكلة. ولكن كيف يمكنني استرداد الكائن من تريفيف؟

ولقد حاول هذا:

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.

وماذا علي أن أفعل لجعل هذا العمل؟

و------------ SOLUTION -----------------

[تحرير] بلدي مخصص الطبقة 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;

وأستخدمه الصافي 3.5 SP1

هل كانت مفيدة؟

المحلول

هل يمكن أن حاول القيام بما يلي للحصول على كل عقد تحت الديك:

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

نصائح أخرى

ولقد وجدت المثال Microsoft لكيفية تنفيذ TreeView ASP.NET مع به <لأ href = "https://code.msdn.microsoft.com/Extend-ASPNET-TreeView-to-93d5d8c5" يختلط = "نوفولو "> هنا .

وبعض الخطوات الهامة التي هي ضرورية إلى جانب فقط إن شاء subclasses ترث TreeNode وإضافة خاصية Tag هي:

ويجب فئة فرعية TreeView وتجاوز أسلوب CreateNode:

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

وهذا يمنع TreeView من الكتابة العقد الجديد الخاص بك مع TreeNodes بدلا من مع نوع الموسعة من العقدة.

وسوف تحتاج الى ان يكون منشئ معين المتاحة. (ويبدو للعمل باستخدام منشئ افتراضي أيضا، ولكن هناك فرصة جيدة هناك سبب وجيه لماذا تستخدم هذه واحدة.)

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" />

ويجب أيضا تجاوز LoadViewState وSaveViewState في صفك TreeNode الموروثة:

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 بك بين إعادات النشر.

وأفترض أنك تقوم بإنشاء العقد كما ExtendedTreeNodes.

ولقد لاحظت أن XxxView (ListView الذي تريفيف، داتاغريدفيف) ضوابط تميل إلى استنساخ الأشياء بشكل غير متوقع. هل نفذت ICloneable.Clone ()؟

وهذا قد يعمل. TreeNode تنفذ Clone () تقريبا.

وأجد أنه من أسهل، على الرغم من أن تنفيذ خصائص الموسعة باستخدام خاصية العلامات من treenode:

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

وإنني أوصي بشدة من استخدام Clone (). انها نمط الهش. استخدام خاصية العلامات:

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top