- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要扩展 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 返回的是 TreeNode,而不是 CustomTreeNode。
我已经阅读了一些资料,看起来我需要扩展 TreeView 类,并覆盖 CreateNode() 方法以返回 CustomTreeNode 而不是 TreeNode。所以我创建了这个:
public class CustomTreeView : TreeView
{
protected override TreeNode CreateNode()
{
return new CustomTreeNode();
}
}
但问题是,CreateNode() 不接受任何参数,因此您必须为 CustomTreeNode 类调用空构造函数。所以当我在上面创建我的 CustomTreeNode 时,当我从 CustomTreeView 取回它时,nodeId 和 nodeType 值已经丢失,因为空构造函数返回一个没有任何值的节点。
非常感谢任何帮助。
最佳答案
这是我想出的(专家,欢迎任何建议)。在您的代码中实例化 CustomTreeNode
并通过 setter 设置属性。修改您的 CustomTreeNode
类以将值保存在 ViewState 中。自定义 TreeView 的 CreateNode
返回的节点将加载 ViewState 信息。
树节点类:
[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;
}
关于c# - 创建自定义 TreeView/TreeNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10329293/
我有一个 JTree (myTree) 在另一个类(class),我有一个 DefaultMutableTreeNode取自myTree。 在某个函数中,我想要 JTree突出显示该节点。 我试过了:
我是golang的新手,对以下内容感到困惑, type TreeNode struct { Val int Left *TreeNode Right *TreeNode
这与大多数应用的行为方式相同。我认为 TreeView 默认情况下是这样工作的。 有没有办法做到这一点,还是我必须让已检查的 TreeNode 的所有子节点并自己检查它们? 这是 winforms。
这是我的代码: if (e.Node.Parent == null) { string selectedNodeText = e.Node.Text; TreeNode x = e.N
最近做了很多思维导图,经常遇到无法合并分支的问题。比如一个节点有branch1、branch2、branch3和branch4,我发现branch3和branch4可以趋向于另一个节点。但是,Mind
与System.Windows.Forms中的其他一些控件集合一样,TreeNodeCollection实现IEnumerable。这背后是否有任何设计原因,还是仅仅是泛型问世之前的宿醉? 最佳答案
在 TreeView 中插入长文本节点时 - 出现水平滚动条。有没有办法在 TreeNode 中自动换行而不是滚动? 目前我使用的解决方案是根据 TreeView 的宽度分割文本并在不同的节点中显示其
我有一个 uitree 结构并使用激活的 MultipleSelectionNodes 属性。我总是选择两个节点。我需要永久修复其中一个的选择,而另一个可以通过鼠标选择进行更改。我怎样才能实现这一目标
如何在 ASP.NET 中突出显示选定的 TreeNode (UI.WebControls)?目的是让用户看到他或她当时正在查看的类别。 我的想法是,在每个 TreeNode 上,检查其属性 Sele
我有一个带有一堆 TreeNode 的 TreeView 控件。每个节点 ContextMenu 根据其状态具有不同的 MenuItems。所以我目前正在为每个 TreeNode 附加其自己的 Con
public class Solution { public TreeNode invertTree(TreeNode root) { if(root == null)
所以,这是故事。我正在尝试创建一个递归下降解析器,它标记一个字符串,然后从这些标记中创建一个节点树。 我的主要类(class)的所有指针都在工作......如果你之前使用过 RDP 那么你知道我在说什
所以,这是故事。我正在尝试创建一个递归下降解析器,它标记一个字符串,然后从这些标记中创建一个节点树。 我的主要类(class)的所有指针都在工作......如果你之前使用过 RDP 那么你知道我在说什
现在我的循环是 for (TreeNode n = e.Node.FirstNode; n != null; n = n.NextNode) 我的数据是这样的 a a1 a2 b
我有一个使用 Treeview 的网页。在 TreeView 中是节点,我使用 Text 和 Value 属性,但我还需要一个。我需要一个名为 IsFile 的 bool 属性。 我创建节点并以编程方
基本上 TreeView 有复选框,我能够获得 TreeNode,但无论我在 TreeNode 上单击什么地方,它都会为我提供 TreeNode,从它的文本到它的复选框,再超出一点(向左)。 我能否限
以下代码不会运行,因为在按名称“RootNode”检索时 rootNode 为 null treeView1.Nodes.Add(new TreeNode("RootNode")); ... /
我正在我的 C# GUI 应用程序中使用 TreeView 和 TreeView.Nodes,并希望在我的树中的几个节点上使用右键单击功能。我已经搜索了很多,但似乎 SelectedNode 仅对左键
我试图在鼠标悬停在 TreeView 节点上时显示工具提示。但是工具提示没有显示。 这是我的代码: private void treeView1_MouseHover(object sender, E
如何将全尺寸图像嵌入到 TreeNode? 目标是显示详细的日志文件,其中每个节点代表窗口标题,其子节点包含键盘记录。 最佳答案 使用以下模式将图像添加到 TreeView 图像列表。 ImageLi
我是一名优秀的程序员,十分优秀!