كيفية ترث من الطبقة treenode؟
سؤال
ولدي فئة يرث من 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
من الكتابة العقد الجديد الخاص بك مع TreeNode
s بدلا من مع نوع الموسعة من العقدة.
وسوف تحتاج الى ان يكون منشئ معين المتاحة. (ويبدو للعمل باستخدام منشئ افتراضي أيضا، ولكن هناك فرصة جيدة هناك سبب وجيه لماذا تستخدم هذه واحدة.)
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
بك بين إعادات النشر.
وأفترض أنك تقوم بإنشاء العقد كما ExtendedTreeNode
s.
ولقد لاحظت أن 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;
}