2010-07-08 303 views
1

我有一个使用Treeview的网页。 在treeview中是节点,我使用文本和值属性,但我需要一个。我需要一个名为IsFile的布尔属性。将属性添加到TreeNode

我制作节点并以编程方式将它们添加到树中。 我有一个叫做NavTreeNodes的类继承了TreeNode类和广告这个布尔。

public class NavTreeNode : TreeNode 
{ 
    private bool _IsFile; 

    public bool IsFile 
    { 
     get { return _IsFile; } 
     set { _IsFile = value; } 
    } 

    public NavTreeNode() 
    { } 
} 

而当我做一个新的TreeNode我使用这个类。 一切工作,直到我尝试从TreeView函数SelectedNodeChanged中的树视图中获取数据。

protected void treeview_Navigation_SelectedNodeChanged(object sender, EventArgs e) 
{ 
    TreeNode node = treeview_Navigation.SelectedNode; 
    NavTreeNode NNode = node as NavTreeNode; 

    Response.Write(NNode.IsFile.ToString()); 
} 

我得到一个“没有设置对象实例的对象引用”。错误,当我尝试这个。 我甚至不能使用此方法获取Value或Text值。

回答

2

创建保存您的值和IsFile属性的新类,并将其放入节点的Value属性中。

 [Serializable] 
    public class ValueAndIsFile { 
      [XmlAttribute] 
      public bool IsFile {get; set;} 

      [XmlAttribute] 
      public string Value { get; set; } 
    } 

     ... 

     TreeNode nd = new TreeNode(); 
     ValueAndIsFile val = new ValueAndIsFile(){ IsFile = true, Value = yourValueObject}; 

     nd.Value =SerializeToString(val); 
     treeView.Nodes.Add(nd); 

     .... 

     protected void treeview_Navigation_SelectedNodeChanged(object sender, EventArgs e) 
     { 
      TreeNode node = treeview_Navigation.SelectedNode; 
      ValueAndIsFile val = DeserializeFromString<ValueAndIsFile>(node.Value);    
      Response.Write(val.IsFile.ToString()); 

    } 


    public static string SerializeToString(object obj) 
     { 
     XmlSerializer serializer = new XmlSerializer(obj.GetType()); 

     using (StringWriter writer = new StringWriter()) 
     { 
     serializer.Serialize(writer, obj); 
     return writer.ToString(); 
     } 
    } 

    public static T DeserializeFromString<T>(string str) 
     { 
     XmlSerializer serializer = new XmlSerializer(typeof(T)); 

     using (StringReader reader =new StringReader(str)) 
     { 
      return (T)serializer.Deserialize(reader);   
     } 
    } 

不知道系列化该解决方案是最好的,但它解决了这个问题

+0

嗯,你会怎么做到这一点? – eski 2010-07-08 15:21:25

+0

尝试此操作时出现错误。它说node.value只能是字符串。 – eski 2010-07-09 10:25:18

+0

我正在使用此方法从树视图中选择并检查treenode是否为文件。许多用户正在使用这些页面,他们必须登录。当许多用户使用它时,此方法是否很慢? – eski 2010-07-09 11:34:04

2

您可以使用属性标签和存储额外的数据存在。

+0

System.Web.UI.WebControls.TreeNode中没有Tag属性 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.treenode_members.aspx 它被替换为价值财产。 – 2010-07-08 14:44:10

+0

Yaubb,我不能使用标签属性,那只是在形式和WPF我认为 – eski 2010-07-08 14:47:50

+0

好吧,你是对的。我正在谈论winform treenode。 ) – yatagarasu 2010-07-08 14:49:09