向TreeNode添加属性

时间:2010-07-08 14:32:43

标签: c# asp.net

我有一个使用Treeview的网页。 在树视图中是节点,我使用Text和Value属性,但我还需要一个。我需要一个名为IsFile的布尔属性。

我创建节点并以编程方式将它们添加到树中。 我有一个名为NavTreeNodes的类,它继承了TreeNode类并广告这个bool。

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 个答案:

答案 0 :(得分:2)

创建保存您的值和IsFile属性的新类,并将其放在node的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);          
         }
    }

不确定序列化的解决方案是否最佳,但它解决了问题

答案 1 :(得分:2)

您可以使用属性Tag并在那里存储其他数据。