ant's profilemicroantPhotosBlogListsMore Tools Help

Blog


    August 25

    gridview存储过程分页(二)

    在服务器端主要是初始化gridview,也就是第一页。然后就是页码按钮的处理事件,代码如下:
    protected void Page_Load(object sender, EventArgs e)
        
    {
            
    if (!IsPostBack)
            
    {
                BindGV(
    this.gvTest, "A101"5,11"CID""CID"null);

                
    this.lbtnPrev.Enabled = false;
                
    this.lblCurrentInfo.Text = "1";
                
    this.lblCount.Text =  getPageNum("A101"5).ToString() ;
            }

        }


        
    public int getPageNum(string tableName, int pagesize)
        
    {
            
    using (SqlDataObject sodo = new SqlDataObject())
            
    {
                
    string strSql = "select count(*) from " + tableName;
                
    int count =Convert.ToInt32(sodo.ExecuteScalar(strSql));

                
    int pagenum =Convert.ToInt32(Math.Ceiling(Convert.ToDouble(count/pagesize)));

                
    return pagenum;
            }

        }


        
    /**//// <summary>
        
    /// 按钮处理事件
        
    /// </summary>
        
    /// <param name="sender"></param>
        
    /// <param name="e"></param>

        public void PageIndex_Changed(object sender, EventArgs e)
        
    {
            LinkButton linkbtn 
    = (LinkButton)sender;
            
    switch (linkbtn.ID.Trim())
            
    {
                
    case "lbtnFirst":
                    BindGV(
    this.gvTest, "A101"511"CID""CID"null);

                    
    this.lblCurrentInfo.Text = "1";

                    
    break;
                
    case "lbtnPrev":

                    BindGV(
    this.gvTest, "A101"5, Convert.ToInt32(this.lblCurrentInfo.Text) - 11"CID""CID"null);

                    
    this.lblCurrentInfo.Text = (Convert.ToInt32(this.lblCurrentInfo.Text) - 1).ToString();


                    
    break;
                
    case "lbtnNext":

                    BindGV(
    this.gvTest, "A101"5, Convert.ToInt32(this.lblCurrentInfo.Text) + 11"CID""CID"null);

                    
    this.lblCurrentInfo.Text = (Convert.ToInt32(this.lblCurrentInfo.Text) + 1).ToString();



                    
    break;
                
    case "lbtnLast":
                    BindGV(
    this.gvTest, "A101"5, Convert.ToInt32(this.lblCount.Text), 1"CID""CID"null);

                    
    this.lblCurrentInfo.Text = this.lblCount.Text;

                    
    break;
            }

            
    if (Convert.ToInt32(this.lblCurrentInfo.Text) >= Convert.ToInt32(this.lblCount.Text) && Convert.ToInt32(this.lblCurrentInfo.Text) <=1)
            
    {
                
    this.lbtnPrev.Enabled = false;
                
    this.lbtnNext.Enabled = false;
                
    this.lbtnFirst.Enabled = false;
                
    this.lbtnLast.Enabled = false;
            }

            
    else if (Convert.ToInt32(this.lblCurrentInfo.Text) >= Convert.ToInt32(this.lblCount.Text))
            
    {
                
    this.lbtnPrev.Enabled = true;
                
    this.lbtnNext.Enabled = false;
                
    this.lbtnFirst.Enabled = true;
                
    this.lbtnLast.Enabled = false;
            }

            
    else if (Convert.ToInt32(this.lblCurrentInfo.Text) <= 1)
            
    {
                
    this.lbtnPrev.Enabled = false;
                
    this.lbtnNext.Enabled = true;
                
    this.lbtnFirst.Enabled = false;
                
    this.lbtnLast.Enabled = true;
            }

            
    else
            
    {
                
    this.lbtnPrev.Enabled = true;
                
    this.lbtnNext.Enabled = true;
                
    this.lbtnFirst.Enabled = true;
                
    this.lbtnLast.Enabled = true;
            }

                    
            
        }


        
    /**//// <summary>
        
    /// 绑定到gridview
        
    /// </summary>
        
    /// <param name="gv">gridview</param>
        
    /// <param name="tableName">分页的表名</param>
        
    /// <param name="size">页码大小</param>
        
    /// <param name="pageindex">第几页</param>
        
    /// <param name="isAsc">升降序</param>
        
    /// <param name="OderColumName">排序的列</param>
        
    /// <param name="KeyID">主键</param>
        
    /// <param name="condictions">查询条件</param>

        private void BindGV(GridView gv, string tableName, int size, int pageindex, int isAsc, string OderColumName,string KeyID, string condictions)
        
    {
            
    using (SqlDataObject sodo = new SqlDataObject())
            
    {
                SqlParameter[] sps 
    = new SqlParameter[7];
                sps[
    0= new SqlParameter("@TableName", tableName);
                sps[
    1= new SqlParameter("@PageSize", size);
                sps[
    2= new SqlParameter("@PageIndex", pageindex);
                sps[
    3= new SqlParameter("@IsAsc"1);
                sps[
    4= new SqlParameter("@OderColumName", OderColumName);
                sps[
    5= new SqlParameter("@KeyID", KeyID);
                sps[
    6= new SqlParameter("@Conditions", condictions);
     
       
               DataTable dt = sodo.getDataTable("sp""sp_CTE", sps);
                gv.DataSource 
    = dt.DefaultView;
                gv.DataBind();
            }

        }
     

    gridview存储过程分页(一)

         抽空写一下自己用的关于GridView存储过程分页的代码,优点就不用多说了,主要是用于数据库端分页,解决数据量过大的分页问题。存储过程还是以前写的CTE方法的分页,还是在这里贴一下代码吧,具体请见存储过程分页实现代码,2005 T-SQL新增功能一文。
    USE [WGSMSDbase]
    GO
    /**//****** 对象:  StoredProcedure [dbo].[sp_CTE]    脚本日期: 08/25/2007 11:39:01 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO


    -- =============================================
    --
     Author:        <Author,,microant>
    --
     Create date: <Create Date,,20070705>
    --
     Description:    <Description,,CTE分页>
    --
     =============================================
    CREATE PROCEDURE [dbo].[sp_CTE]
        
    -- Add the parameters for the stored procedure here
        @TableName nvarchar(200= 'testTable',    --表名
        @PageSize int = 15,        --页面大小
        @PageIndex int =2    ,    --页面的序号
        --@IsCountNull bit =1,    --返回记录是否为空
        @IsAsc bit = 1    ,    --是否卫升序,升序为1,降序为0
        @OderColumName nvarchar(200= null,        --排序字段名
        @KeyID nvarchar(50= 'id',        --主键
        @Conditions nvarchar(500= null --查询条件
    )
    AS

        
    -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;

        
    declare @strSql nvarchar(1000)
        
    declare @tempstr nvarchar(1000)
        
    declare @orderstr nvarchar(400)
        
    declare @ctestr nvarchar(400)
        
        
    --判断排序方式,@IsAsc =1 升序, 0降序,设置排序语句
        if @IsAsc = 1
        
    begin
            
    if(@OderColumName is null or @OderColumName = '')
                
    set @orderstr = ' order by ' + @KeyID + ' asc'
            
    else
                
    set @orderstr = ' order by ' + @OderColumName + ' asc'
        
    end
        
    else
        
    begin
            
    if(@OderColumName is null or @OderColumName = '')
                
    set @orderstr = ' order by ' + @KeyID + ' desc'
            
    else
                
    set @orderstr = ' order by ' + @OderColumName + ' desc'
        
    end
        
        
    --CTE
        set @ctestr ='with Table_CET
        as
        (
            select 
                CEILING((ROW_NUMBER() OVER (
    ' + @orderstr + '))/' + str(@PageSize+ ') as page_num, * 
            from 
    ' + @TableName +
        
    ')' ;
        
    begin
        
    if(@Conditions is null or @Conditions = '')
            
    set @strSql = @ctestr + 'select * from Table_CET where page_num = ' + str(@PageIndex);
        
    else
            
    set @strSql = @ctestr + 'select * from Table_CET where page_num = ' + str(@PageIndex)+ ' and ' + @Conditions;
        
    print @strSql
    end    
        
    begin
            
    exec sp_executesql  @strSql
        
    end



    客户端代码如下,主要包含首页,末页,上一页,下一页,当前页码,总页码等一些必要信息,最主要的就是给按钮添加处理事件OnClick。
    August 23

    关于updatepanel中注册执行javascript

        好些天都在糊里糊涂,最近也比较懒,居然看到了个留言,永远不更新的博客一等奖,相当尴尬,哈哈。写一些最近自己或别人遇到的小问题吧。
        1、关于updatepanel注册js
          最近在项目里需要用到altas,本人也是新手,老用最简单的updatepanel,在注册脚本时也遇到了困难,无法注册。本来是在updatepanel中放了一个gridview,偶想在girdview中一个模板列点击弹出一个窗体,注册 window.open()来解决问题。本来不是在updatepanel中,所以用 ClientScript.RegisterStartupScript直接注册挺好使。
          在拖入updatepanel后发现无法注册脚本,想想RegisterStartupScript本来是在页面加载时启动js的,在updatepanel中部分刷新,肯定是无法注册的。
        后来发现了ScriptManager.RegisterStartupScript方法,挺好使,呵呵。
         ScriptManager.RegisterClientScriptBlock(UpdatePanelName, typeof(UpdatePanel), "标识key", "脚本", true);
        下面是一个demo,模板列定义如下:


    protected void gvClientInfo_RowCommand(object sender, GridViewCommandEventArgs e)
        {
    & nbsp;       
    //如果是linkButton被点击
            if(e.CommandName.Equals("linkbtnCID"))
            {
                LinkButton lbtn 
    = (LinkButton)e.CommandSource;
                GridViewRow dgRow 
    = (GridViewRow)lbtn.Parent.Parent;
                
    string tmpText = lbtn.Text.ToString();          
                tmpText 
    ="window.open('customerDetailsInfo.aspx?CID=" + tmpText + "' ,'newwindow','height=550,
                    width=700, menubar=no ')
    ";
                ScriptManager.RegisterStartupScript(
    this.UpdatePanel2, this.GetType(), "click", tmpText, true);      
          
            }
        }


        2、关于RegisterStartupScript,RegisterClientScriptBlock 

          RegisterStartupScript 将 js嵌入到页面的底部,</form> 的前面< br />         RegisterClientScriptBlock 将 js嵌入到页面中开启元素 <form> 后面

        3、关于“该行已经属于另一个表”错误
           这个问是出现在不同dataTable之间的行复制出现的问题。
           看这个代码:

     DataTable tmpdt = sodo.getDataTable("text", strSql, sp);             
     dt.Rows.Add(tmpdt.Rows[
    0]);
         
           这个明显的错误就是tmpdt的行是一个对象引用,相当于一个指针,错误是难免的,可有以下解决办法:< br />
    DataTable tmpdt = sodo.getDataTable("text", strSql, sp);             
    1、 dt.Rows.Add(tmpdt.Rows[
    0].ItemArray);
    2、 dt.ImportRow(tmpdt.Rows[0]);