首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载 ┆ 端午节祝福 ┆ 迅雷在线影视 ┆淘宝手机在线充值 ┆淘宝游戏点卡充值 
设为首页
加入收藏
联系我们
高级搜索
您当前的位置: 主页>NET专区>ASP.NET>asp.net动态加载结点的TreeView控件实例
asp.net动态加载结点的TreeView控件实例
来源: 发布时间:2008-04-08 发布人: 浏览: 人次   字体: [ ]  

我在开发中遇到这么一个问题:如果结点数过多时(近万个),使用TreeView控件加载时速度非常慢。我就想能否做到一开始只加载部分结点,当用户翻页时再加载需要的新结点。但我翻了一个TreeView的资料,没有发现有针对滚动条的事件。于是就自己重载了TreeView控件,添加了对滚动条事件的支持。

 

添加滚动条事件支持

主要的实现代码很简单,如下所示:

public class MyTreeView : System.Windows.Forms.TreeView
{
    
private const int WM_VSCROLL = 0x0115;            //滚动条事件
    private const int WM_MOUSEWHEEL = 0x020A;        //鼠标滚轮事件
    private const int SB_ENDSCROLL = 8;                //滚动结束标志

    
public event EventHandler VerticalScrolled;

    
protected override void WndProc(ref Message m)
    
{
        
if (m.Msg == WM_VSCROLL || m.Msg == WM_MOUSEWHEEL)
        
{
            
if (m.WParam.ToInt32() == SB_ENDSCROLL)
            
{
                VerticalScrolled(
thisnew EventArgs());
            }

        }

        
base.WndProc(ref m);
    }


}

事件添加好了,现在要做的事情就是动态添加节点了,又出现了一个问题就是,我如何获取当前屏幕区域内的最后一个节点,我使用了如下一个方法获取当前区域内的最后一个树结点:

private TreeNode GetLastNodeInScreen(TreeView tv)
{
    TreeNode node 
= null;
    
for (int x = tv.ClientSize.Width; x > 0; x -= 5)
    
{
        
int y;
        
for (y = tv.ClientSize.Height; y > 0; y -= 5)
        
{
            node 
= tv.GetNodeAt(x, y);
            
if (node != null)
            
{
                
break;
            }

        }

        
if (y > 0)
            
break;
    }

    
return node;
}

动态加载的关键代码如下所示:

 

private MyTreeView Tree;

/// <summary>
/// 要载入的全部内容
/// </summary>

private List<string> Nodes;

/// <summary>
/// 每次载入的行数
/// </summary>

private const int PageRows = 30;

/// <summary>
/// 总页数
/// </summary>

private int PageCount;

/// <summary>
/// 加载的页数
/// </summary>

private int LoadedPage = 0;

/// <summary>
/// 滚动树内容时触发的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>

private void TreeScrolled(object sender, EventArgs e)
{
    
if (this.LoadedPage == this.PageCount)
        
return;

    TreeNode last_node_sc 
= this.GetLastNodeInScreen(this.Tree);

    
if (this.Tree.Nodes.Count - last_node_sc.Index < 10)
    
{
        
this.LoadPage(this.LoadedPage + 1);
    }

}



private void Form1_Load(object sender, EventArgs e)
{
    
this.Tree = new MyTreeView();
    
this.Tree.Parent = this;
    
this.Controls.Add(this.Tree);
    
this.Tree.Top = 10;
    
this.Tree.Left = 10;
    
this.Tree.Width = 150;
    
this.Tree.Height = 200;
    
this.Tree.VerticalScrolled += new EventHandler(this.TreeScrolled);

    
this.Nodes = new List<string>();
    
for (int i = 0; i < 1000; i++)
    
{
        
this.Nodes.Add("Node" + i.ToString().PadLeft(4));
    }

    
this.PageCount = (int)Math.Ceiling(Convert.ToDouble(this.Nodes.Count) / PageRows);
    
this.LoadPage(1);
}


/// <summary>
/// 载入页
/// </summary>
/// <param name="page_no"></param>

private void LoadPage(int page_no)
{
    
for (int i = this.LoadedPage * PageRows; i < page_no * PageRows - 1 && i < this.Nodes.Count; i++)
    
{
        TreeNode node 
= new TreeNode();
        node.Text 
= this.Nodes[i];
        
this.Tree.Nodes.Add(node);
    }

    
this.LoadedPage = page_no;
}

相 关 文 章   发布商链接
·asp.NET开发中常用的25个小技巧
·asp.net将上传图片增加水印并写入数...
·asp.net中HttpModule是如何工作的?附...
·Response.Redirect在新窗口打开的新...
·.net 如何得到某日是一年的第几周
·ASP.net获取SQL server数据库image类...
·一个可自动适应高度的TextBox,附代码
·ASP.NET中实现单点登录思路及其代码
·图解asp.net如何用excel做报表的实例
·ASP.NET利用dot模板生成Word文档代码
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·实例讲解ASP.NET实现加密Cook...
·如何实现在DataList控件中的D...
·实例讲解asp.net生成高质量缩
·asp.net适用于IE或FireFox的...
·举例详解C#代码与javaScript...
·asp.net无刷新上传文件
·在Ie中保存图片时出现"800700...
·asp.net文件上传大小限制的控
·asp.net动态生成txt文本文件...
·asp.net实现将Excel文件导入...
·实现多列,带图片的DropDownLi...
·javascript实现TreeView 控件
·ASP.NET配置Word的操作权限
·让FileUpload控件在IE和FireF...
·ASP.NET实现Office文档的分类
热 门 文 章
·asp.net(C#)上传下载及文件管...
·图解asp.net如何用excel做报...
·asp.net无刷新上传文件
·Asp.Net防止刷新重复提交数据...
·asp.net实现将Excel文件导入...
·ASP.NET取得物理路径和虚拟路...
·asp.net中Web.Config配置文件...
·asp.net(c#)生成验证码代码,...
·asp.net页面回传与js调用服务...
·asp.net中DataBinder.Eval的...
·asp.net(C#版)实现登录验证码...
·DataGrid中DropDownList触发S...
·asp.net可输入的下拉框复合控...
·ASP.net 实现批量数据更新或...
·asp.net中常见的几种日历控件...
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .