为TreeNode添加自定义属性
2008-04-29 17:38
363 查看
为TreeNode添加自定义属性,需要重写TreeNode,例如,添加一个NodeType属性,类型为Int类型:
public class myTreeNode : TreeNode
{
private int nodeType;
public int NodeType
{
get
{ return nodeType; }
set
{ nodeType = value; }
}
public myTreeNode(): base()
{
//
// TODO: Add constructor logic here
//
}
public myTreeNode(string text, string value, int nodeType): base(text, value)
{
this.NodeType = nodeType;
} }
在页面中添加一个TreeView 控件,和button控件,代码如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
TreeView1.Nodes.Add(new myTreeNode("node 1", "A",99));
Button1.Text = (TreeView1.Nodes[0] as myTreeNode).nodeType.ToString();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Button1.Text = (TreeView1.Nodes[0] as myTreeNode ).nodeType.ToString() ;
}
但是在 Button的click事件中,却出现如下异常:
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error:
Line 14: protected void Button1_Click(object sender, EventArgs e)
Line 15: {
Line 16: Button1.Text = (TreeView1.Nodes[0] as myTreeNode).nodeType.ToString();
Line 17: }
Line 18: }
Source File: c:\Inetpub\wwwroot\test\Default.aspx.cs Line: 16
但是在pageload中为Button的Text赋值没有问题, 在点击Button之后,页面postback之后,出现这个异常,这好像说明是告诉我们,页面PostBack之后,就不能将TreeNode转化成自定义的TreeNode类型。
因此,我们需要重写TreeView 控件,将TreeView的TreeNode类型强制转化为自定义的TreeNode 类型:
public class myTreeView : TreeView
{
public myTreeView()
{
//
// TODO: Add constructor logic here
//
}
protected override TreeNode CreateNode()
{
return new myTreeNode();
}
}
然后,运行程序,发现原来的异常消失了,但是另一个问题出现了,就是我们在pageload里面给TreeNode的赋值,在页面Postback之后,我们发现nodeType的制变为0, 属性Text和value也变为null,也就是说我们的值没有保存,在页面Postack之后就丢失了,在反编译工具查看一下Treeview和Treenode的源代码,发现,Text和value,还有其他的一些属性是保存在viewstate中的,所以我们需要在自定义的TreeNode类中重写两个方法:SaveViewState 和LoadViewState,
下面是我的自定义的TreeNode的全部代码:
public class myTreeNode : TreeNode
{
private string NodeText = string.Empty;
private string NodeURL = string.Empty;
private int nodeType;
public int NodeType
{
get
{ return nodeType; }
set
{ nodeType = value; }
}
public myTreeNode(): base()
{
//
// TODO: Add constructor logic here
//
}
public myTreeNode(string text, string value, int nodeType): base(text, value)
{
this.NodeType = nodeType;
}
protected override object SaveViewState()
{
object[] arrState = new object[4];
arrState[0] = base.SaveViewState();
arrState[1] = this.NodeText;
arrState[2] = this.NodeURL;
arrState[3] = this.nodeType;
return arrState;
}
protected override void LoadViewState(object savedState)
{
if (savedState != null)
{
object[] arrState = savedState as object[];
this.NodeText = (string)arrState[1];
this.NodeURL = (string)arrState[2];
this.nodeType = (int)arrState[3];
base.LoadViewState(arrState[0]);
}
}
}
这样,在页面Postback的时候,值就不会丢失了。
public class myTreeNode : TreeNode
{
private int nodeType;
public int NodeType
{
get
{ return nodeType; }
set
{ nodeType = value; }
}
public myTreeNode(): base()
{
//
// TODO: Add constructor logic here
//
}
public myTreeNode(string text, string value, int nodeType): base(text, value)
{
this.NodeType = nodeType;
} }
在页面中添加一个TreeView 控件,和button控件,代码如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
TreeView1.Nodes.Add(new myTreeNode("node 1", "A",99));
Button1.Text = (TreeView1.Nodes[0] as myTreeNode).nodeType.ToString();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Button1.Text = (TreeView1.Nodes[0] as myTreeNode ).nodeType.ToString() ;
}
但是在 Button的click事件中,却出现如下异常:
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error:
Line 14: protected void Button1_Click(object sender, EventArgs e)
Line 15: {
Line 16: Button1.Text = (TreeView1.Nodes[0] as myTreeNode).nodeType.ToString();
Line 17: }
Line 18: }
Source File: c:\Inetpub\wwwroot\test\Default.aspx.cs Line: 16
但是在pageload中为Button的Text赋值没有问题, 在点击Button之后,页面postback之后,出现这个异常,这好像说明是告诉我们,页面PostBack之后,就不能将TreeNode转化成自定义的TreeNode类型。
因此,我们需要重写TreeView 控件,将TreeView的TreeNode类型强制转化为自定义的TreeNode 类型:
public class myTreeView : TreeView
{
public myTreeView()
{
//
// TODO: Add constructor logic here
//
}
protected override TreeNode CreateNode()
{
return new myTreeNode();
}
}
然后,运行程序,发现原来的异常消失了,但是另一个问题出现了,就是我们在pageload里面给TreeNode的赋值,在页面Postback之后,我们发现nodeType的制变为0, 属性Text和value也变为null,也就是说我们的值没有保存,在页面Postack之后就丢失了,在反编译工具查看一下Treeview和Treenode的源代码,发现,Text和value,还有其他的一些属性是保存在viewstate中的,所以我们需要在自定义的TreeNode类中重写两个方法:SaveViewState 和LoadViewState,
下面是我的自定义的TreeNode的全部代码:
public class myTreeNode : TreeNode
{
private string NodeText = string.Empty;
private string NodeURL = string.Empty;
private int nodeType;
public int NodeType
{
get
{ return nodeType; }
set
{ nodeType = value; }
}
public myTreeNode(): base()
{
//
// TODO: Add constructor logic here
//
}
public myTreeNode(string text, string value, int nodeType): base(text, value)
{
this.NodeType = nodeType;
}
protected override object SaveViewState()
{
object[] arrState = new object[4];
arrState[0] = base.SaveViewState();
arrState[1] = this.NodeText;
arrState[2] = this.NodeURL;
arrState[3] = this.nodeType;
return arrState;
}
protected override void LoadViewState(object savedState)
{
if (savedState != null)
{
object[] arrState = savedState as object[];
this.NodeText = (string)arrState[1];
this.NodeURL = (string)arrState[2];
this.nodeType = (int)arrState[3];
base.LoadViewState(arrState[0]);
}
}
}
这样,在页面Postback的时候,值就不会丢失了。
相关文章推荐
- 为TreeNode添加自定义属性
- Javascript创建自定义对象 创建Object实例添加属性和方法
- asp.net 用户自定义控件自定义属性添加
- 为自定义View添加属性
- [Android_Develop]自定义View添加XML属性
- Javascript 添加自定义静态方法属性JS清除左右空格
- C#如何创建自定义控件以及添加自定义属性和事件使用
- Bigcommerce: 给模板添加一个自定义的产品属性,使用$GLOBALS全局变量调用
- 点击添加自定义属性 和获取自定义属性的值
- powershell 给用户添加自定义属性 Using PowerShell to Set a Custom Attribute
- zTree初始化 节点添加自定义属性
- Android自定义组件添加组件的属性
- 自定义Panel中添加依赖属性需要注意的问题
- 如何创建自定义winForm控件 以及添加事件属性
- 给ASP.NET中的用户自定义空间添加属性
- 给一个自定义对象添加属性和方法
- 织梦 DeDeCMS 添加自定义属性的方法(图文教程)
- MVC 5 属性路由中添加自己的自定义约束
- How do I use IValidatableObject? 使用IValidatableObject添加自定义属性验证
- 说说Android 两种为自定义组件添加属性的使用方法和区别