GridView&ObjectDataSource新特性小记 懒人篇(一) 分页上路

Molflow | 基本介绍之一:Facet Molflow是欧洲核子研究中心开发的一款用于计算任意形状腔体在超高真空下真空度的软件,本文主要介绍此软件中Facet的操作。 阅读详情
 

"懒"序;
         Visual Studio 2005推广的时间不算短了,它为我们带来的很多新特性使得开发更加高效和有趣.相信众多VS开发者抢鲜体验过并为此激动不已了.不论是IDE的格局还是FrameWork的改进,都十分令人赏心悦目.在微软公布的诸多新特性里面,最为让我关注的部分,就是数据绑定.有过经验的朋友一定知道,在FrameWork1.0甚至更早时期的版本,数据绑定控件和数据源提供的可选功能相当薄弱,为实现一个较为复杂的数据显示或操作需要而coding,都是一件颇为恐怖的事情.VS2003中的DataGrid曾凭借其良好的功能集成,与SqlDataSource配合,为我们减轻了一定的负担,一直成为数据绑定的首选.虽然它提供了相应的事件接口,但仍需要大量的代码才得以完成.微软的产品一向是助长开发者们的惰性的.自VS2005推出以来,GridView作为DataGrid不二的继承人,逐渐显露它的强大,慢慢为像我们这样的懒人接受并打算长期使用.加上有FrameWork2.0新品ObjectDatasource的无缝支持,它俩简直就是数据绑定界天造地设的一对,使用非常省心,就一个词:"Perfection"...

"懒"归正传:
         最近开场废话是多了点(可能是参加会议太多闹的.. ^_^!!).马上请出GridView & ObjectDataSource.
下面我将逐步展现一个分页的案例.

案例环境: WindowsXP SP2, VS2005 Team Suite,SqlServer2005(没有比这更糟的了....)
要求:         了解数据绑定控件的结构,数据源的运行机制,以及简单的绑定控件设计实现(那些内容足够再写一篇教程了,这里不再多叙.)
参考:         MSDN中提到,ObjectDataSource是唯一支持界面分页的数据源(除非自己来继承造一个,汗!),但示例仍    然是用SqlDataSource做数据源介绍的GirdView绑定.难道MS这么小气???(ps:打死俺也不说).

那好,就从那句介绍开始,咱们自己动手整出一个来.
按照常规,先准备一张表和一些存储过程,如下:

 

Table:MyUsers 
     UserID (
int,primary key,identity)  --自动增加字段,用户ID标识列
     UserName (nvarchar(50),not null)   --用户名
     Description (nvarchar(50),not null)--备注

Procedure:

CREATE PROCEDURE [dbo].[AddUser] --增加一个用户
    @UserName nvarchar(50),
    
@Description nvarchar(50)
AS
BEGIN
    
SET NOCOUNT ON;

    
begin transaction t
    
    
insert into MyUsers(UserName,Description) 
    
values(@UserName,@Description)
    
    
if @@error <> 0
    
begin 
        
rollback transaction t
    
end
    
else
    
begin 
        
commit transaction
    
end
END

CREATE PROCEDURE [dbo].[DeleteUserByUserID]  --删除一个用户
    @UserID int
AS
BEGIN
    
SET NOCOUNT ON;

    
Begin Transaction t

    
delete from MyUsers where UserID =@UserID

    
if @@error <> 0
        
begin 
            
rollback transaction t
        
end 
    
else
        
begin
            
commit transaction
        
end    
END

CREATE PROCEDURE [dbo].[UpdateUser] --修改用户姓名或备注
    @UserID int,
    
@UserName nvarchar(50),
    
@Description nvarchar(50)
AS
BEGIN
    
SET NOCOUNT ON;

    
begin transaction t
    
    
update MyUsers 
    
set UserName = @UserName,
        Description 
= @Description 
    
where UserID = @UserID

    
if @@error <> 0 
        
begin
            
rollback transaction t
        
end
    
else
        
begin
            
commit transaction  t
        
end
END

CREATE PROCEDURE [dbo].[GetUsers] --得到用户列表,注意这里的参数
    @RowIndex int,
    
@RecordCount int
AS
BEGIN
    
SET NOCOUNT ON;

    
With VUsers as (
        
select *,row_number() over (order by UserID desc) as RowNum
        
from MyUsers 
)

    
select * from VUsers 
    
where RowNum > @RowIndex and RowNum <= (@RowIndex+@RecordCount)    
END

CREATE PROCEDURE [dbo].[GetUsersCount]    
AS
BEGIN
    
SET NOCOUNT ON;
    
select count(UserID) from MyUsers
END


这里详细说明一下倒数两个存储过程,GetUsers的参数RowIndex,不是页码(传说中的PageIndex),而是行索引,且从0开始.这点特别要注意,因为要让ObjectDataSource自动取得当前需要的数据(界面级分页意味着当前需要显示多少数据只向数据库取多少,并不会像其他数据源全总取出消耗性能.),依据也就是行索引和增量.GetUsersCount这个存储过程是为ObjectDataSource分页提供总数的,它与分页的存储过程要保持一致.特别指的是有分页条件的情况,本人经常忘记(^_^||).否则GridView显示会不正常.

在WebSite新建一个DAL,假定类名为DataManager,给出代码片段如下:

 

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;
using System.Collections.Generic;

/**//// <summary>
/// DataAccessLayer
/// </summary>
public class DataManager
{
    
private SqlConnection con = null; //连接对象
    private SqlCommand cmd = null;  //command执行对象
    private SqlDataAdapter da = null; //适配器对象

    
/**//// <summary>
    
/// DAL对象构造
    
/// </summary>

    public DataManager()
    
{
        
//
        
// TODO: Add constructor logic here
        
//
    }

    
/**//// <summary>
    
/// 打开数据库连接
    
/// </summary>
    private void OpenConnection()
    
{
        
try
        
{
            
string conString = ConfigurationManager.ConnectionStrings["localDB"].ConnectionString;
            con 
= new SqlConnection(conString);
            
if (ConnectionState.Closed == con.State)
            
{
                con.Open();                    
            }

        }

        
catch (SqlException ex)
        
{
            
throw new Exception("数据库无法访问", ex);
        }

    }


    
/**//// <summary>
    
/// 关闭数据库连接
    
/// </summary>
    private void CloseConnection()
    
{
        
if (ConnectionState.Open == con.State)
        
{
            
try
            
{
                con.Close();
            }

            
catch (SqlException ex)
            
{
                
throw new Exception("数据库无法关闭", ex);
            }

        }

    }


    
/**//// <summary>
    
/// 取得用户列表
    
/// </summary>
    
/// <param name="rowIndex">行索引</param>
    
/// <param name="recordCount">页显示量(增量)</param>
    
/// <returns>用户列表数据集</returns>
    public DataSet GetUsers(int rowIndex, int recordCount)
    
{
        OpenConnection();
        
try
        
{
            cmd 
= new SqlCommand();
            cmd.Connection 
= con;
            cmd.CommandType 
= CommandType.StoredProcedure;
            cmd.CommandText 
= "GetUsers";
            
            SqlParameter spRowIndex 
= new SqlParameter("@RowIndex",SqlDbType.Int,4);
            spRowIndex.Direction 
= ParameterDirection.Input;        
            SqlParameter spRecordCount 
= new SqlParameter("@RecordCount",SqlDbType.Int,4);
            spRecordCount.Direction 
= ParameterDirection.Input;

            cmd.Parameters.Add(spRowIndex);
            cmd.Parameters.Add(spRecordCount);

            spRowIndex.Value 
= rowIndex;
            spRecordCount.Value 
= recordCount;

            da 
= new SqlDataAdapter(cmd);
            DataSet ds 
= new DataSet();
        
            da.Fill(ds, 
"MyUsers");

            
return ds;           
        }

        
catch (SqlException ex)
        
{
            
throw new Exception("无法取得有效数据", ex);
        }

        
finally
        
{
            CloseConnection();
        }

    }


    
/**//// <summary>
    
/// 取得用户总数
    
/// </summary>
    
/// <returns>用户总数</returns>
    public int GetUsersCount()
    
{
        OpenConnection();
        
try
        
{
            cmd 
= new SqlCommand();
            cmd.Connection 
= con;
            cmd.CommandType 
= CommandType.StoredProcedure;
            cmd.CommandText 
= "GetUsersCount";
            
int count = Convert.ToInt32(cmd.ExecuteScalar().ToString());
            
return count;
        }

        
catch (SqlException ex)
        
{
            
throw new Exception("无法取得有效数据", ex);
        }

        
finally
        
{
            CloseConnection();
        }

    }

 

对DAL也有几项说明,DataManager.GetUsers(int rowIndex, int recordCount)方法的参数只能有两个,
参数名可以随意,但意义却要与调用的存储过程GetUsers要一致,rowIndex必须是行索引,recordCount必须是页显示量.
OK!接下来在页面上放上一个GridView和一个ObjectDataSource,设置代码片段如下:


<asp:GridView ID="gvMyUsers" runat="server" AllowPaging="True" CellPadding="4" DataSourceID="objMyUsers" ForeColor="#333333" GridLines="None" AutoGenerateDeleteButton="True" AutoGenerateEditButton="True" AutoGenerateColumns="False" DataKeyNames="UserID" PageSize="10">
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#EFF3FB" />
<EditRowStyle BackColor="#2461BF" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>    
<asp:ObjectDataSource ID="objMyUsers" runat="server" EnablePaging="True" MaximumRowsParameterName="recordCount" 
SelectCountMethod
="GetUsersCount" SelectMethod="GetUsers" StartRowIndexParameterName="rowIndex" TypeName="DataManager">
</asp:ObjectDataSource>

指定每页显示最大数据量(页显示量)的参数:
MaximumRowsParameterName="recordCount"
指定取得数据总数方法:
SelectCountMethod="GetUsersCount"
指定分页方法:
SelectMethod="GetUsers"
指定起始行参数:
StartRowIndexParameterName="rowIndex"
指定前面方法所属类名(全限定名):
TypeName="DataManager
这几个设置是必须的,一定要对应.

现在轻轻的点击一下运行吧(什么什么?还没写事件?...我说老铁,都啥年月了,懒人还有用那玩儿吗?).到这里,一个最快速的分页其实已经做完了.

前面的步骤都是必须的,但仍然可以有一些变化.比如,若你已经按以往的办法写好了一个类似于

Create Procedure GetUsers
    
@PageIndex int,
    
@PageSize int
as
begin
    
end

        这样的存储过程了,没关系,你在DAL的DataManager.GetUsers(int rowIndex, int recordCount)这里,
把rowIndex,recordCount在调用存储过程前转换成PageIndex,PageSize就好了,也不过是
PageIndex = rowIndex/recordCount +1; PageSize =recordCount;这样的语句就能搞定啦.再或者改存储过程里面也行(虽然有点不值得),不多说了.自己耍一把就知道了.
        你一定心里还有疑问,没错,DataManager.GetUsers(int rowIndex, int recordCount)这个方法,更多时候需要多一些参数,也就是说,我们分页取数据的过程,还需要一些筛选条件,但这个方法是要给ObjectDataSource的selectMethod方法,不能增加别的参数,形成矛盾怎么办??欲知解决之道,且等下回分解.....(快跑啊.....鸡蛋来啦!!)

Molflow高效建模技巧:如何用Facet参数优化真空模拟精度 本文深入探讨了Molflow中Facet参数对真空模拟精度的关键影响,详细解析了粘附系数、双面属性等核心参数的物理意义与优化策略。通过CERN实验室的实战案例,展示了如何通过精确配置Facet参数显著提升模拟精度与计算效率,为超高真空系统设计提供可靠的分析工具。 阅读详情

相关推荐

Molflow新手必看:Facet基础操作全解析(从2D建模到3D拉伸)

本文为Molflow新手提供了Facet基础操作的全面解析,涵盖从2D图形创建到3D模型拉伸的完整流程。详细介绍了Facet作为几何建模基石的核心概念、顶点编辑、布尔运算以及拉伸、放样等关键操作,并深入讲解了如何为其配置物理参数以实现真空系统的蒙特卡洛模拟。

prometheus9mon的博客 417

Molflow | 操作实例之一:真空仿真

Molflow的真空仿真的操作实例

zhxiao2015的博客 7663

Molflow | Facet参数详解:从基础到高级设置

本文深入解析了Molflow软件中Facet参数的核心设置,涵盖从基础的出气率、粘附系数到高级的传送与结构优化。通过详细阐述Desorption Type、Sticking Factor、Teleport等关键参数,并结合溅射离子泵模拟案例,指导用户如何精准配置以模拟真实真空物理过程,提升模拟效率与准确性。

day7的博客 422

Molflow | 基本介绍之二:Vertex

Molflow软件中Vertex的基本介绍

zhxiao2015的博客 1113

真空干燥工艺仿真分析vacuum_drying

真空干燥是制药和食品工业中常用于除去潮湿粉末中的水分或有机溶剂的化工工艺。设计真空干燥系统时,工程师会在确保产品高质量的同时,尽可能地缩短干燥过程所需的时间。该模型研究 Nutsche 过滤干燥机中的真空干燥,这种干燥机由内含湿滤饼的圆柱滚筒构成。湿滤饼的上方为一个低压顶部空间,侧壁面和底部壁面有受热流体流过。干燥机工作时,由于运行压力非常低且温度较高,提高了液体的蒸发速率,从而加速了粉末的干燥过程。本示例模拟了粉末中溶剂的传热和蒸发,研究了温度曲线和液相分布。本案例基于 Murru 等人发表的有关在静态条件下用正丙醇干燥粉末的论文。

STM32CUBEMX | STM32L431RCT6的内部Flash操作

一、STM32CUBEMX配置 1、选择芯片型号: 2、配置时钟源 1、 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC; 2、 如果使用默认内部时钟(HSI),这一步可以略过; 3、配置时钟树 STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可: 4、代码生成设置 点击GENERATE CODE即可生成MDK-V5工程: 二、在MDK中编写、编译、下载用户代码 1、STM32内部Flash及HAL库API 查看所使用芯片的信息,

yongridada的博客 5567

输出一个在没有.Net 环境的机器也可以跑得安装包

Step by step:1. open your solution2. right click on solution explorer to add a setup project3. right click on setup project new created to add a new project output, OK4. right click on setu...

bajiu1997的博客 158

Cadence IC618/Spectre231安装避坑指南:详解License配置、环境变量隔离与依赖检查

本文详细介绍了Cadence IC618/Spectre231的安装与配置避坑指南,包括许可证系统精妙控制、环境隔离模块化实践、依赖管理进阶技巧以及长期维护的黄金法则。通过实战案例和解决方案,帮助工程师构建稳定可靠的EDA工作环境,提升芯片设计效率。

weixin_28683065的博客 460

GridView&ObjectDataSource新特性小记 懒人篇

GridView&ObjectDataSource新特性小记 懒人篇(一) 分页上路 Posted on 2006-04-13 19:34 笑看千秋_R <!--<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:dc="http://purl.org/dc/elemen

清风阁 1377

详细解读文字识别工具———Tesseract-OCR

   在尝试破解12306验证码的时候,提前了解了一下应对各种验证码的解决方案,这里主要是学习到了面对文字图片验证码,例如亚马逊、豆瓣等平台的登录时会遇到的情况,效果还不错。 一、工具介绍 ​    Tesseract-OCR 是一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition...

别看我只是一只羊 2万+

如何解决Elsevier和IEEE期刊之间参考文献的转换问题

Elsevier期刊和IEEE旗下的期刊两者模版互相转换的时候,会发现Elsevier模版的参考文献是存放在.bib文件下的,然后在.tex文件中直接引用即可。3. 在IEEE的.tex文件中的\end{document}命令行之前,添加下面的这句话(ps:\bibliography{**}中的**名称即为.bib文件的名称)如何将Elsevier的参考文献快速的转成IEEE期刊可用的格式,是本博客需要解决的问题。2. 将下载好的.bib文件,上传到IEEE的latex文件中。

薰珞婷紫小亭子的博客 1674

GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速

Posted on 2006-04-17 18:43 笑看千秋_R Table: MyUsers  @UserID (int,primary key,identity),  @UserName (nvarchar(50),not null),  @Description (nvarchar(50),not null),  @Status (bit,not null)Procedure:  cr

关注技术 1096

机器学习项目实战案例数据集

本专栏整理了《机器学习项目实战案例》,内包含了各种不同的机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 3633

2024年6月12日Arxiv人工智能相关论文

双重思维框架考虑了快速、直觉性处理和较慢、逻辑性处理。在视觉中对双重思维的感知需要图像,其中从直觉和逻辑处理中推断出的结果不同。我们引入了一个对抗性数据集,为人类视觉中的双重思维框架提供证据,这也有助于研究深度学习模型的定性行为。我们的研究还通过使用定位对象的实例分割模型来解决使用分类模型作为人类视觉计算模型的一个主要批评。证据强调了在人类视觉中识别实例的形状的重要性,并显示出深度学习模型缺乏对子结构的理解,这表明与子组件的位置和数量相关的错误。

数智笔记 1945

Nacos 从困惑到蒙圈(9)Nacos 适配 达梦数据库【最新版】

介绍Nacos适配达梦数据库的详细步骤,包括对最新版本的支持改造。

甘蓝的专栏 1376

游戏“中台”的故事——架构演进、团队协同与产品创新的深度剖析

什么是中台?在游戏行业里,中台并不是把所有技术都归口管理、统一“圈养”。更不是简单的工具集合。它代表的,是一种“模块化底座”——把业务的通用能力、基础支撑和数据结合,变成可复用、可扩展、可创新的技术体系。让“前台”专注于创新玩法、极致体验;让“后台”稳健保障数据、安全、性能;让“中台”统合各种资源、流程、工具,形成平台型生产力。游戏中台是团队协同、技术创新、业务增长并行的产物。它让开发从重复劳动解脱,带着创新冲锋;让运营靠数据说话,精准制胜;让产品实现高效迭代,生态爆发。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1948
上一篇: C#操作配置文件app.config
下一篇: GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
Alexantao
博客等级 码龄19年 86粉丝 185原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值