热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自定义Panel控件-实现滚动条位置自动保存

本文介绍了如何通过扩展Panel控件来实现滚动条位置的自动保存和恢复。类似于Page的MaintainScrollPositionOnPostBack属性,我们将在自定义的TBPanel控件中添加相同的功能。
在 ASP.NET 中,Page 对象有一个 MaintainScrollPositionOnPostBack 属性,当设置为 True 时,页面在 PostBack 时会自动保存并恢复滚动条的位置。在之前的文章中,我们讨论了如何使用 HiddenField 来保存 Panel 的滚动条位置。本文将进一步介绍如何通过扩展 Panel 控件,使其具备自动保存和恢复滚动条位置的功能。

我们将创建一个新的控件 TBPanel,该控件继承自 Panel,并添加了一个 MaintainScrollPositionOnPostBack 属性。当这个属性被设置为 True 时,TBPanel 将自动处理滚动条位置的保存和恢复。

以下是 TBPanel 控件的完整代码:

```vb
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Text
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

")>
Public Class TBPanel
Inherits System.Web.UI.WebControls.Panel
Private FMaintainScrollPositionOnPostBack As Boolean = False

'''
''' 在 PostBack 时自动维护滚动条位置。
'''


Public Property MaintainScrollPositionOnPostBack() As Boolean
Get
Return FMaintainScrollPositionOnPostBack
End Get
Set(ByVal value As Boolean)
FMaintainScrollPositiOnOnPostBack= value
End Set
End Property

'''
''' 维护滚动条位置。
'''

Private Sub DoMaintainScrollPosition()
Dim oScript As StringBuilder
Dim sScript As String
Dim oScrollPosX As HiddenField ' 记录水平滚动条位置
Dim oScrollPosY As HiddenField ' 记录垂直滚动条位置

oScript = New StringBuilder()
oScript.Append("function Panel_SaveScrollPosition(PanelID){")
oScript.Append("document.getElementById(PanelID+'_ScrollPosX').value = document.getElementById(PanelID).scrollLeft;")
oScript.Append("document.getElementById(PanelID+'_ScrollPosY').value = document.getElementById(PanelID).scrollTop;}")
oScript.AppendLine()

oScript.Append("function Panel_RestoreScrollPosition(PanelID){")
oScript.Append("document.getElementById(PanelID).scrollLeft = document.getElementById(PanelID+'_ScrollPosX').value;")
oScript.Append("document.getElementById(PanelID).scrollTop = document.getElementById(PanelID+'_ScrollPosY').value;}")
oScript.AppendLine()

Me.Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "PanelScrollFunction", oScript.ToString(), True)

oScrollPosX = New HiddenField()
oScrollPosX.ID = Me.ClientID & "_ScrollPosX"
Me.Controls.Add(oScrollPosX)

oScrollPosY = New HiddenField
oScrollPosY.ID = Me.ClientID & "_ScrollPosY"
Me.Controls.Add(oScrollPosY)

' 页面 Submit 时,记录 Panel 的水平及垂直滚动条位置
sScript = "Panel_SaveScrollPosition('" & Me.ClientID & "');"
Me.Page.ClientScript.RegisterOnSubmitStatement(Me.GetType(), Me.ID & "_SavePanelScroll", sScript)

If Me.Page.IsPostBack Then
' 当 PostBack 时,利用 HiddenField 记录的值来恢复 Panel 滚动条位置
oScrollPosX.Value = Me.Page.Request.Form(oScrollPosX.ClientID)
oScrollPosY.Value = Me.Page.Request.Form(oScrollPosY.ClientID)
sScript = "Panel_RestoreScrollPosition('" & Me.ClientID & "');"
Me.Page.ClientScript.RegisterStartupScript(Me.GetType(), Me.ID & "_SetPanelScroll", sScript, True)
End If
End Sub

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
If Me.Visible AndAlso (Not Me.DesignMode) Then
If Me.MaintainScrollPositionOnPostBack Then
DoMaintainScrollPosition() ' 维护滚动条位置
End If
End If
End Sub
End Class
```

在上述代码中,`DoMaintainScrollPosition` 方法用于维护滚动条的位置。该方法通过两个 HiddenField 控件来记录水平和垂直滚动条的位置,并在页面提交时调用 `Panel_SaveScrollPosition` Javascript 函数保存滚动条位置。当页面 PostBack 后重新加载时,通过 `Panel_RestoreScrollPosition` 函数恢复滚动条的位置。

程序代码下载:
TBPanel.rar
推荐阅读
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 深入解析 HDFS Federation:多命名空间架构详解
    HDFS Federation 是一种扩展 HDFS 架构的方式,通过引入多个独立的 NameNode 来解决单点故障和性能瓶颈问题。本文将详细探讨 HDFS Federation 的工作原理、优势以及潜在挑战。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文介绍了在安装或运行 Python 项目时遇到的 'ModuleNotFoundError: No module named setuptools_rust' 错误,并提供了解决方案。 ... [详细]
author-avatar
mobiledu2502923673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有