我有一个继承自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”。
我需要做些什么来完成这项工作?
------------解决方案-----------------
[编辑]我的自定义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
答案 0 :(得分: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
}
}
答案 1 :(得分:1)
我找到了一个关于如何使用标记here实现ASP.NET TreeView
的Microsoft示例。
除了继承TreeNode
并添加Tag
属性之外,必要的一些重要步骤是:
您必须继承TreeView
并覆盖CreateNode
方法:
public sealed class TaggedTreeView : TreeView {
protected override TreeNode CreateNode() {
return new TaggedTreeNode(this, false);
}
}
这可以防止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" />
您还必须覆盖继承的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
属性的值。
答案 2 :(得分: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;
}