文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 国产软件 | 国外软件 | 汉化补丁 | 设为首页 | 加入收藏
业界资讯 | 图形图像 | 操作系统 | 网络冲浪 | 工具软件 | 办公软件 | 媒体动画 | 精文荟萃 | 认证考试 | 网站建设 | 技术开发 | 专栏
当前位置:abcdown网络学院网络编程Asp.Net数据回发时,维护ASP.NET Tree控件位置
精品广告
推荐TOP10
·asp.net创建文件夹的IO类的问题
·ASP.NET 2.0 多文件上传小经验
·asp.net常用代码
·Asp.net cache 简述
·技巧实例:ASP.NET生成静态页面实现方法
·ASP.NET、JSP及PHP之间的抉择
·.net基础知识错误注意二十二点知识
·asp.net2.0学习历程 菜鸟到中级程序员的飞跃
·.NET基础知识-什么是.NET
·初学C#+ASP.NET+Oracle时积累的备忘点滴
阅读TOP10
·使用ASP.NET2.0的ReportViewer查看RDLC报表
·打造一个通用ASP.NET数据分页控件
·asp.net结合html,javascript实现无刷新跨域数据提交
·Asp.Net中使用水晶报表
·ASP.NET2.0下含有DropDownList的GridView编辑、删除的完整例子!
·ASP.NET 2.0 多文件上传小经验
·Asp.net cache 简述
·用http代理下载sourceforge的cvs仓库[原理+C#代码]
·asp.net常用代码
·利用.net反射动态调用指定程序集的中的方法

数据回发时,维护ASP.NET Tree控件位置

日期:2006年12月20日 作者: 查看:[大字体 中字体 小字体]


  ASP.NET2.0提供了一个功能强大的TreeView控件,但是它看起来有一个缺陷:它好像不能够跟踪用户最后选择的一个节点。如果你滚动到第50个节点然后展开该节点,那么当单击链接页面进行回发后,你必须重新利用滚动条下拉到你想要的节点位置。

  在.NET较早的版本里,您可能考虑使用SmartNavigation这个特性.SmartNavigation是Web页面指令的一个属性,它的取值为布尔值,一个设置为true的页面指令看起来类似如下:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" SmartNavigation="true" %>

  不过,正如好多人已经注意到的,SmartNavigation本身就有洗衣阿问题,事实上微软也被这个问题所困扰以至于在ASP.NET2.0里添加了MaintainScrollbackPositionOnPostback属性而取代SmartNavigation 。遗憾的是,我在使用它们时,感觉它们都有一些问题,我稍后将进行解释。

  本文我将介绍SmartNavigation和MaintainScrollbackPositionOnPostback 在维护页面回发位置方面的缺点,并提供如何利用Javascript来解决这个问题,这个小技巧即使对复杂的Web页面也同样有效.

  再见了SmartNavigationeb,欢迎MaintainScrollbackPositionOnPostback

  SmartNavigation主要作用是减少页面导航时的闪动,它主要利用适当的IFrames来进行这个工作并仅仅显示改变的部分。SmartNavigation 同样被设计为能够维护页面位置,元素焦点,回发浏览器访问历史记录的作用。遗憾的是,即使微软知道SmartNavigation已经去掉,但是检查MSDN文档,您仍然能够看到SmartNavigation其实仅仅被定义为"过时"的 。利用GOOGLE的搜索您可以搜到大家对SmartNavigation的讨论.

  下一步

  ASP.NET2.0引进了MaintainScrollbackPositionOnPostback,和SmartNavigation类似,您可以在Page属性里设置它的值为true或者为false。

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" MaintainScrollPositionOnPostback="true" %>

  非常简明,这个属性/属性值对是用来维护页面位置的。遗憾的是,它只是维护页面的位置,因为如果你在用户控件里使用了TreeView控件,然后在页面里使用该用户控件,那么页面在在回发后您将返回到用户控件的位置而不是TreeView节点位置。

  简单的说,MaintainScrollbackPositionOnPostback只是用来维护页面的回发位置。如果你的页面固定--也就是一个应用程序那样不需要进行利用滚动条进行上下滚动,那么这个属性对你可能无用。如果你的页面很常需要滚动,那么你就需要利用该属性.

  在TreeView里维护控件的位置

  最近,我在开发一个Web应用程序Windowsy,也就是每一个页面都会全屏显示而不是滚动。页面里使用类TreeView来进行导航想列表一样进行显示,但是页面本身不需要上下滚动。但是问题是这里的数据列可能需要扩展使得页面出现滚动.我准备使用如下的方式解决这个问题.
首先,利用TreeView控件的SelectedNode属性,可以知道哪个节点被选取,这个被选取的节点需要保存起来,它最终会程序为HTML元素。如果我知道了被选择HTML控件的ID,那么我就可以滚动到该控件并设置该控件为当前焦点。确实,如果您看以下使用TreeView控件的页面HTML代码,你将发现生成的一个隐藏<input>元素,以及为textbox类型,它的ID可能类似TreeViewx_SelectedNode

<input type="hidden" name="TreeView1_SelectedNode" id="TreeView1_SelectedNode" value="TreeView1t54" />

  有了这些知识,你就知道该怎么做了,基本方法是隐藏的Input是一个textbox,我们要做的就是知道将来呈献的内容。一个TreeView最终呈现为HTML表格,节点的值被用来作为单元格的值,<TD>元素呈现节点名称,所以通过查找单元格ID并滚动到那里.

  为了具体说明做法,我使用TreeView编写了一些代码,在Page_Load时间里加载一段脚本来找到需要的单元格(参考下表),在<body>的onload时间里调用该函数.

Imports System.Collections.Generic

Partial Class _Default
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load

InjectLoadEvent()

If (IsPostBack) Then Return

TreeView1.Nodes.Clear()

Dim chicken As New TreeNode("Chicken")
 TreeView1.Nodes.Add(chicken)
 Dim beef As New TreeNode("Beef")
 TreeView1.Nodes.Add(beef)
 Dim pork As New TreeNode("Pork")
 TreeView1.Nodes.Add(pork)
 Dim fish As New TreeNode("Fish")
 TreeView1.Nodes.Add(fish)

 chicken.ChildNodes.Add(New TreeNode("Crepes Florentine with Buffalo Chicken"))
 fish.ChildNodes.Add(New TreeNode("Linguine with White Clam Sauce"))
 pork.ChildNodes.Add(New TreeNode("Pork Loin with Peanut and Madarin Orange Sauce"))
 beef.ChildNodes.Add(New TreeNode("Standing Rib Roast with Fennel and Blue Cheese Potatoes"))


 ' We need a bunch of stuff here so we will add some stubs
 Dim I As Integer
 For I = 1 To 50
  chicken.ChildNodes.Add(New TreeNode("Placeholder " + I.ToString()))
  fish.ChildNodes.Add(New TreeNode("Placeholder " + I.ToString()))
  pork.ChildNodes.Add(New TreeNode("Placeholder " + I.ToString()))
  beef.ChildNodes.Add(New TreeNode("Placeholder " + I.ToString()))
 Next

 TreeView1.CollapseAll()
End Sub

Public Sub InjectLoadEvent()
 Dim script As String = _
   "function LoadEvent()" + _
   "{{" + _
   " try" + _
   " {{" + _
   " var elem = document.getElementById('{0}_SelectedNode');" + _
   " if(elem != null )" + _
   " {{" + _
   " var node = document.getElementById(elem.value);" + _
   " if(node != null)" + _
   " {{" + _
   " node.scrollIntoView(true);" + _
   " {1}.scrollLeft = 0;" + _
   " }}" + _
  " }}" + _
 " }}" + _
 " catch(oException)" + _
 " {{}}" + _
 "}}"

Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "LoadEvent", _
String.Format(script, TreeView1.ClientID, Panel1.ClientID), True)
 End Sub
End Class


  下面的代码显示了页面的布局:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
 <title>Focus Tree Node on Postback</title>
</head>
<body onload="LoadEvent()">
 <form id="form1" runat="server">
  <div>
   <asp:Panel ID="Panel1" runat="server" Height="200px" Width="200px" ScrollBars="Both">
    <asp:TreeView ID="TreeView1" runat="server">
     <SelectedNodeStyle BackColor="#8080FF" />
    </asp:TreeView>
   </asp:Panel>
  </div>
 </form>
</body>
</html>

  下图显示了本例子运行的结果


  最后,下面的代码显示了javascript的注入方式:

<script>
function LoadEvent()
{
 try
 {
  var elem = document.getElementById('TreeView1_SelectedNode');
  if(elem != null )
  {
   var node = document.getElementById(elem.value);
   if(node != null)
   {
    node.scrollIntoView(true);
    Panel1.scrollLeft = 0;
   }
  }
 }
 catch(oException)
 {}
}// -->
</script>

  用Javascript定义的LoadEvent函数将查找隐藏字段,我们利用TreeView控件的ClientID 查找所有元素,不过,在嵌套多个TreeView控件后,名称将变得非常长.找到单元格的值后,我使用scrollIntoView方法.scrollLeft属性将让滚动条滚动当前位置.

上一篇:Winamp批量转换音频格式

下一篇:用单元格数据作为Excel工作簿名称


相关软件: 相关文章:
·打造一个通用ASP.NET数据分页控件
·asp.net结合html,javascript实现无刷新跨域数据提交
·图片保存到数据库和从数据库读取图片并显示(c#)
·DOS常用命令参数的中文详解
·18条CPU参数详解
·sql server日期时间函数
·十进制数怎样转成十六进制数?

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.abcdown.net
首页 | 本站声明 | 下载帮助 | 发布软件 |
中文版权所有:ABC学院 浙ICP备05000717号