webabcd - 专注于asp.net, html5, silverlight

ASP.NET
从现在开始 一切都不晚
posts - 287, comments - 7866, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。
[索引页]
[源码下载]


扩展GridView控件(10) - 自定义分页样式


作者:webabcd


/*正式版的实现 开始*/

介绍
扩展GridView控件:
自定义分页样式。显示总记录数、每页记录数、当前页数、总页数、首页、上一页、下一页、末页和分页按钮

使用方法(设置CustomPagerSettings复合属性):
PagingMode - 自定义分页的显示模式
TextFormat - 自定义分页的文本显示样式(四个占位符:{0}-每页显示记录数;{1}-总记录数;{2}-当前页数;{3}-总页数)


关键代码
using System;
using System.Collections.Generic;
using System.Text;

using System.Web.UI.WebControls;
using System.Web.UI;
using System.ComponentModel;
using System.Collections;
using System.Data;
using System.Web.UI.HtmlControls;

namespace YYControls.SmartGridViewFunction
{
    
/// <summary>
    
/// 扩展功能:自定义分页样式
    
/// </summary>

    public class CustomPagerSettingsFunction : ExtendFunction
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>

        public CustomPagerSettingsFunction()
            : 
base()
        
{

        }


        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="sgv">SmartGridView对象</param>

        public CustomPagerSettingsFunction(SmartGridView sgv)
            : 
base(sgv)
        
{
    
        }


        
/// <summary>
        
/// 扩展功能的实现
        
/// </summary>

        protected override void Execute()
        
{
            
this._sgv.InitPager += new SmartGridView.InitPagerHandler(_sgv_InitPager); 
        }


        
/// <summary>
        
/// SmartGridView的InitPager事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="row">一个 System.Web.UI.WebControls.GridViewRow,表示要初始化的页导航行</param>
        
/// <param name="columnSpan">页导航行应跨越的列数</param>
        
/// <param name="pagedDataSource">一个 System.Web.UI.WebControls.PagedDataSource,表示数据源</param>

        void _sgv_InitPager(object sender, GridViewRow row, int columnSpan, PagedDataSource pagedDataSource)
        
{
            
int recordCount = pagedDataSource.DataSourceCount;

            LinkButton First 
= new LinkButton();
            LinkButton Prev 
= new LinkButton();
            LinkButton Next 
= new LinkButton();
            LinkButton Last 
= new LinkButton();

            TableCell tc 
= new TableCell();

            row.Controls.Clear();

            tc.Controls.Add(
new LiteralControl("&nbsp"));

            
显示总记录数 每页记录数 当前页数/总页数

            
设置“首页 上一页 下一页 末页”按钮

            
添加首页,上一页按钮

            
显示数字分页按钮

            
添加下一页,末页按钮

            tc.Controls.Add(
new LiteralControl("&nbsp"));

            tc.ColumnSpan 
= this._sgv.Columns.Count;

            row.Controls.Add(tc);        
        }

    }

}


/*正式版的实现 结束*/


/*测试版的实现 开始*/

介绍
用着GridView自带的分页样式总觉得不太习惯,我们可以在PagerTemplate中来写一些自定义的样式,但是也挺麻烦的,其实我们可以扩展一下GridView,给它再增加一种分页样式


控件开发
1、新建一个继承自GridView的类。
/// <summary>
/// 继承自GridView
/// </summary>

[ToolboxData(@"<{0}:SmartGridView runat='server'></{0}:SmartGridView>")]
public class SmartGridView : GridView
{
}

2、新建一个Paging类,定义一个分页样式的枚举
using System;
using System.Collections.Generic;
using System.Text;

using System.ComponentModel;

namespace YYControls.SmartGridView
{
    
/// <summary>
    
/// 自定义分页相关
    
/// </summary>

    public class Paging
    
{
        
/// <summary>
        
/// 自定义分页样式
        
/// </summary>

        public enum PagingStyleCollection
        
{
            
/// <summary>
            
/// 不用自定义分页样式
            
/// </summary>

            None,
            
/// <summary>
            
/// 默认自定义分页样式
            
/// </summary>

            Default
        }

    }

}


3、在继承自GridView的类中加一个上面定义的枚举属性
        private Paging.PagingStyleCollection _pagingStyle;
        
/// <summary>
        
/// 自定义分页样式
        
/// </summary>

        [Description("自定义分页样式"), DefaultValue(""), Category("扩展")]
        
public Paging.PagingStyleCollection PagingStyle
        
{
            
get return _pagingStyle; }
            
set { _pagingStyle = value; }
        }

4、如果GridView使用的是数据源控件的话,计算总记录数
        /// <summary>
        
/// OnLoad
        
/// </summary>
        
/// <param name="e"></param>

        protected override void OnLoad(EventArgs e)
        
{
            
// 查找ObjectDataSource
            ObjectDataSource ods = Parent.FindControl(this.DataSourceID) as ObjectDataSource;
            
if (ods != null)
            
{
                ods.Selected 
+= new ObjectDataSourceStatusEventHandler(ods_Selected);
            }


            
base.OnLoad(e);
        }


        
private int? _recordCount = null;
        
/// <summary>
        
/// 计算总记录数
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void ods_Selected(object sender, ObjectDataSourceStatusEventArgs e)
        
{
            
if (e.ReturnValue is IListSource)
            
{
                _recordCount 
= ((IListSource)e.ReturnValue).GetList().Count;
            }

        }

5、重写OnRowCreated以实现自定义分页样式
        /// <summary>
        
/// OnRowCreated
        
/// </summary>
        
/// <param name="e"></param>

        protected override void OnRowCreated(GridViewRowEventArgs e)
        
{
            
if (e.Row.RowType == DataControlRowType.Pager && PagingStyle == Paging.PagingStyleCollection.Default)
            
{
                LinkButton First 
= new LinkButton();
                LinkButton Prev 
= new LinkButton();
                LinkButton Next 
= new LinkButton();
                LinkButton Last 
= new LinkButton();

                TableCell tc 
= new TableCell();

                e.Row.Controls.Clear();
                
                tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));
                
if (_recordCount.HasValue)
                
{
                    tc.Controls.Add(
new LiteralControl(_recordCount.ToString()));
                    tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));
                    tc.Controls.Add(
new LiteralControl(PageSize.ToString()));
                    tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));
                }

                tc.Controls.Add(
new LiteralControl((PageIndex + 1).ToString()));
                tc.Controls.Add(
new LiteralControl("/"));
                tc.Controls.Add(
new LiteralControl(PageCount.ToString()));
                tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;&nbsp;&nbsp;"));

                
if (!String.IsNullOrEmpty(PagerSettings.FirstPageImageUrl))
                
{
                    First.Text 
= "<img src='" + ResolveUrl(PagerSettings.FirstPageImageUrl) + "' border='0'/>";
                }

                
else
                
{
                    First.Text 
= PagerSettings.FirstPageText;
                }

                First.CommandName 
= "Page";
                First.CommandArgument 
= "First";
                First.Font.Underline 
= false;

                
if (!String.IsNullOrEmpty(PagerSettings.PreviousPageImageUrl))
                
{
                    Prev.Text 
= "<img src='" + ResolveUrl(PagerSettings.PreviousPageImageUrl) + "' border='0'/>";
                }

                
else
                
{
                    Prev.Text 
= PagerSettings.PreviousPageText;
                }

                Prev.CommandName 
= "Page";
                Prev.CommandArgument 
= "Prev";
                Prev.Font.Underline 
= false;


                
if (!String.IsNullOrEmpty(PagerSettings.NextPageImageUrl))
                
{
                    Next.Text 
= "<img src='" + ResolveUrl(PagerSettings.NextPageImageUrl) + "' border='0'/>";
                }

                
else
                
{
                    Next.Text 
= PagerSettings.NextPageText;
                }

                Next.CommandName 
= "Page";
                Next.CommandArgument 
= "Next";
                Next.Font.Underline 
= false;

                
if (!String.IsNullOrEmpty(PagerSettings.LastPageImageUrl))
                
{
                    Last.Text 
= "<img src='" + ResolveUrl(PagerSettings.LastPageImageUrl) + "' border='0'/>";
                }

                
else
                
{
                    Last.Text 
= PagerSettings.LastPageText;
                }

                Last.CommandName 
= "Page";
                Last.CommandArgument 
= "Last";
                Last.Font.Underline 
= false;

                
if (this.PageIndex <= 0)
                
{
                    First.Enabled 
= Prev.Enabled = false;
                }

                
else
                
{
                    First.Enabled 
= Prev.Enabled = true;
                }


                tc.Controls.Add(First);
                tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));
                tc.Controls.Add(Prev);
                tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));

                
// 当前页左边显示的数字分页按钮的数量
                int rightCount = (int)(PagerSettings.PageButtonCount / 2);
                
// 当前页右边显示的数字分页按钮的数量
                int leftCount = PagerSettings.PageButtonCount % 2 == 0 ? rightCount - 1 : rightCount;
                
for (int i = 0; i < PageCount; i++)
                
{
                    
if (PageCount > PagerSettings.PageButtonCount)
                    
{
                        
if (i < PageIndex - leftCount && PageCount - 1 - i > PagerSettings.PageButtonCount - 1)
                        
{
                            
continue;
                        }

                        
else if (i > PageIndex + rightCount && i > PagerSettings.PageButtonCount - 1)
                        
{
                            
continue;
                        }

                    }


                    
if (i == PageIndex)
                    
{
                        tc.Controls.Add(
new LiteralControl("<span style='color:red;font-weight:bold'>" + (i + 1).ToString() + "</span>"));
                    }

                    
else
                    
{
                        LinkButton lb 
= new LinkButton();
                        lb.Text 
= (i + 1).ToString();
                        lb.CommandName 
= "Page";
                        lb.CommandArgument 
= (i + 1).ToString();

                        tc.Controls.Add(lb);
                    }


                    tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));
                }


                
if (this.PageIndex >= PageCount - 1)
                
{
                    Next.Enabled 
= Last.Enabled = false;
                }

                
else
                
{
                    Next.Enabled 
= Last.Enabled = true;
                }

                tc.Controls.Add(Next);
                tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));
                tc.Controls.Add(Last);
                tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));

                tc.ColumnSpan 
= this.Columns.Count;
                e.Row.Controls.Add(tc);
            }


            
base.OnRowCreated(e);
        }



控件使用
添加这个控件到工具箱里,然后拖拽到webform上,设置PagingStyle属性为Default,同时设置GridView的原有属性PageButtonCount,FirstPageText,PreviousPageText,NextPageText,LastPageText,FirstPageImageUrl,PreviousPageImageUrl,NextPageImageUrl,LastPageImageUrl
ObjData.cs
using System;
using System.Data;
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.ComponentModel;

/// <summary>
/// OjbData 的摘要说明
/// </summary>

public class OjbData
{
    
public OjbData()
    
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }


    [DataObjectMethod(DataObjectMethodType.Select, 
true)]
    
public DataTable Select()
    
{
        DataTable dt 
= new DataTable();
        dt.Columns.Add(
"no"typeof(string));
        dt.Columns.Add(
"name"typeof(string));

        
for (int i = 0; i < 30; i++)
        
{
            DataRow dr 
= dt.NewRow();
            dr[
0= "no" + i.ToString().PadLeft(2'0');
            dr[
1= "name" + i.ToString().PadLeft(2'0');

            dt.Rows.Add(dr);
        }


        
return dt;
    }

}


Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" 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>SmartGridView测试</title>
</head>
<body>
    
<form id="form1" runat="server">
        
<div>
            
<yyc:SmartGridView ID="SmartGridView1" runat="server" DataSourceID="ObjectDataSource1"
                AutoGenerateColumns
="False" AllowPaging="true" PagingStyle="Default">
                
<Columns>
                    
<asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" ItemStyle-Width="100px" />
                    
<asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" ItemStyle-Width="100px" />
                    
<asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" ItemStyle-Width="100px" />
                    
<asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" ItemStyle-Width="100px" />
                    
<asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" ItemStyle-Width="100px" />
                    
<asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" ItemStyle-Width="100px" />
                
</Columns>
            
</yyc:SmartGridView>
            
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Select"
                TypeName
="OjbData"></asp:ObjectDataSource>
        
</div>
    
</form>
</body>
</html>

/*测试版的实现 结束*/


OK
[源码下载] 

Feedback

评论共2页: 上一页 1 2 

#34楼[楼主]  回复 引用 查看   

2007-09-14 12:25 by webabcd      
@断箭
要实现的话可以把被选中的行的关键字列表存到ViewState里,每次加载页面的时候再读ViewState,从而设置每行的选中状态

我没有把这个功能放进去,以后有时间的话我会添加上的

#35楼  回复 引用   

2007-10-23 16:06 by jz[未注册用户]
您好!
如果想固定TopPagerRow该如何做?有没有属性设置.

#36楼  回复 引用   

2007-10-23 16:25 by jz[未注册用户]
不好意思·上面的问题我解决了呵呵。

#37楼[楼主]  回复 引用 查看   

2007-10-23 18:11 by webabcd      
@jz
:)
解决了就好

#38楼  回复 引用 查看   

2007-10-29 12:20 by 肖卓耘      
第3页/共7页 这块..怎么绑定到DropDownList里啊?

#39楼[楼主]  回复 引用 查看   

2007-10-29 13:26 by webabcd      
@肖卓耘
msdn上有示例
请参看:
http://msdn2.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.pagertemplate(VS.80).aspx

#40楼  回复 引用 查看   

2007-10-29 15:05 by 肖卓耘      
谢谢啊....这么快就回复了.

#41楼[楼主]  回复 引用 查看   

2007-10-29 16:32 by webabcd      
@肖卓耘
:)
有时间上blog的话肯定有留言必回复的

#42楼  回复 引用   

2007-11-20 09:27 by 我是农民[未注册用户]
我下了你的分页控件试了,但你的控件在你自己写的页码点击时不触发原有的PageIndexChanging系列事件的了?

#43楼[楼主]  回复 引用 查看   

2007-11-20 12:10 by webabcd      
@我是农民

刚才测试了一下,果然

但是RowCommand事件是进的去的,要做一些处理的话,可以在这里做

#44楼  回复 引用   

2007-12-14 10:51 by 老张啊[未注册用户]
如果我填加一些按钮在列后,分页行里会出现填加的那一页的表格

#45楼[楼主]  回复 引用 查看   

2007-12-14 14:46 by webabcd      
@老张啊
我试了一下,加了一个按钮列
分页没问题啊

#46楼  回复 引用   

2007-12-22 22:15 by mybabyes[未注册用户]
请问您一个问题:
怎样才能去掉"上一页"和"下一页"中间的数字

#47楼  回复 引用   

2007-12-22 22:15 by mybabyes[未注册用户]
请问您一个问题:
怎样才能去掉"上一页"和"下一页"中间的数字

#48楼  回复 引用   

2007-12-22 22:16 by mybabyes[未注册用户]
请问您一个问题:
怎样才能去掉"上一页"和"下一页"中间的数字

#49楼  回复 引用   

2007-12-22 22:17 by mybabyes[未注册用户]
请问一下:
怎样能去掉"上一页"和"下一页"中间的数字?

#50楼[楼主]  回复 引用 查看   

2007-12-24 08:38 by webabcd      
@mybabyes
在源代码中将
“#region 显示数字分页按钮”
内的代码全部去掉

#51楼  回复 引用   

2008-01-07 16:36 by maya[未注册用户]
请问一下,怎么获取当前页的信息,从而在刷新加载页面时直接进入分页中的某一页呢?

#52楼[楼主]  回复 引用 查看   

2008-01-08 07:47 by webabcd      
@maya
获取当前页就是
GridView.PageIndex

#53楼  回复 引用   

2008-01-08 16:55 by maya[未注册用户]
回楼主的,我的GridView.PageIndex方法在pageload里就是不对,这个方法在datasource绑定和onrowdatabound方法里得到的页面页数就是对的,不解!

#54楼[楼主]  回复 引用 查看   

2008-01-09 08:04 by webabcd      
@maya
了解一下GridView的生命周期就很容易理解了

它肯定要绑定后,你才能知道当前被绑定的是第几页
如果在绑定前GridView.PageIndex,那肯定是绑定之前的页数

#55楼  回复 引用   

2008-01-31 11:49 by stone_gridviewtest[未注册用户]
我想问一下,怎么能让页面数,当前第几页,还有上一页,下一页,末页等这些信息在一行上显示,我用的时候总是跟第一列的宽度一样,不好看,我该怎么调整和设置参数

#56楼[楼主]  回复 引用 查看   

2008-01-31 16:47 by webabcd      
@stone_gridviewtest
合并这个行的所有单元格就好
而且用GridView自带的分页或我扩展的这个分页是没有这个问题的

#57楼  回复 引用   

2008-02-01 10:13 by stone_gridviewtest[未注册用户]
你说:合并这个行的所有单元格就好 ,怎么合并能指点一下吗!谢谢!

#58楼  回复 引用   

2008-02-01 10:36 by stone_gridviewtest[未注册用户]
您好!能把你的qq或者msn发给我吗?sxy-302@sohu.com!谢谢!

#59楼[楼主]  回复 引用 查看   

2008-02-01 17:52 by webabcd      
@stone_gridviewtest
比如我的这个控件中的这行代码
tc.ColumnSpan = this.Columns.Count;

就是类似这样写


msn:
webabcd
hotmail
com

#60楼  回复 引用   

2008-02-22 15:11 by 尼莫[未注册用户]
哈哈。。。我又来问问题了
假如我从数据库中查询出来的结果数小于我分页设置的每页显示的数目,分页那一行就不会显示了,怎么才能不管有多少记录都显示的呢

#61楼[楼主]  回复 引用 查看   

2008-02-22 17:57 by webabcd      
@尼莫
可以参考一下这篇文章
http://weblogs.asp.net/joewrobel/archive/2008/01/30/a-more-elegant-solution-to-display-gridview-header-and-footer-when-the-data-source-is-empty.aspx

#62楼  回复 引用   

2008-02-26 09:05 by 尼莫[未注册用户]
@webabcd
嘿嘿,这两天一直在忙着处理数据,刚看到回复
我看了一下那个文章,为了在没有查询结果记录时显示出控件,自己增加了一条记录,并且给隐藏了哪一行,换成分页的话不会是比较显示的记录比分页设置的记录数要是少多少条就增加多少条,然后再隐藏掉吧。。。。
我一直以为只要设置某个属性就能设置分页显示还是隐藏掉。。。。迷糊了

#63楼  回复 引用   

2008-02-26 11:25 by 尼莫[未注册用户]
@webabcd
我刚试了试,假如默认分页我设置的是一页显示10行,我查询出来5条记录的话,必须再增加6行才能显示出分页,但是要是隐藏的话还需要修改分页的代码,否则会显示出来有两页(1/2页),是不是我的思路错了

#64楼[楼主]  回复 引用 查看   

2008-02-26 16:01 by webabcd      
@尼莫
用GridView现有的属性是不行了
只能自己去构造行,然后插进去,麻烦啊

#65楼  回复 引用   

2008-02-28 11:33 by 尼莫[未注册用户]
@webabcd
55555555555555........
多谢

#66楼[楼主]  回复 引用 查看   

2008-02-28 21:57 by webabcd      
@尼莫
:)
可以挑战一下

#67楼  回复 引用   

2008-04-01 10:19 by kuan[未注册用户]
不错……

#68楼[楼主]  回复 引用 查看   

2008-04-01 14:52 by webabcd      
@kuan
:)
过奖了
有bug的话也麻烦兄弟提醒一下

#69楼  回复 引用   

2008-04-07 19:19 by wxf[未注册用户]
关于分页的问题!
1.第一方式:我在CustomPagerSettingsFunction类的_sgv_InitPager方法中,添加一个dropDownList控件,和你添加linkbutton类似
DropDownList YYControlList = new DropDownList();
for (int i = 1; i <= pagedDataSource.PageCount; i++)
{
YYControlList.Items.Add(i.ToString());
}
YYControlList.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged);

YYControlList.AutoPostBack = true;
tc.Controls.Add(YYControlList);
但是dropdownlist 选择的数字显示总是1,不是你点的数字,但他确实也绑了第2或3页的数据. 因为他重写绑定了,但我不知道怎么继续了
方式二:
按照msdn的方式,我重写 protected override void OnDataBound 了它,但是 总是无法获取 GridViewRow pagerRow = this.BottomPagerRow; 他总是null 的. 当然这个是在自定义控件中,我不用自定义控件的方式,是可以实现的!

#70楼  回复 引用   

2008-04-07 19:23 by wxf[未注册用户]
我的方式二 也是在_sgv_InitPager中添加的dropdownlist. 此时是没有绑定数据 的,准备在OnDataBound 中添加, 还有个问题,方式2的事件在哪写呢?在_sgv_InitPager? 还是OnDataBound 中注册?

#71楼[楼主]  回复 引用 查看   

2008-04-08 08:36 by webabcd      
@wxf
1、"但是dropdownlist 选择的数字显示总是1,不是你点的数字"
动态控件的ViewState的问题,简单解决的话就每次postback后都给它赋值就好

2、也是动态添加控件的问题

#72楼  回复 引用   

2008-04-08 10:55 by wxf[未注册用户]
楼主啊,还是不知道怎么操作啊! 因为在CustomPagerSettingsFunction类中,所以我在DropDownList.SelectedIndexChanged中不能使用ViewState,
也就无法在_sgv_InitPager添加个判断if(!ViewStae["t"]) DropDownList.SelectItem.Text=ViewState["t"].ToString().
还有你说的2、也是动态添加控件的问题, 我搞不懂为什么msdn就可以获得,我就获得不了GridViewRow pagerRow = this.BottomPagerRow! 能不能详细点,我太笨了,谢谢了 或者发到我邮箱,搞了好久了

#73楼[楼主]  回复 引用 查看   

2008-04-08 11:35 by webabcd      
@wxf
:)
看个现成的例子吧
http://www.codeproject.com/KB/grid/ExtendingGridViewControl.aspx

#74楼  回复 引用   

2008-04-08 18:17 by wxf[未注册用户]
太谢谢了,不管怎么样 问题解决了,只加了一句 就是dropdownlist .selectindex = this._sgv.PageIndex

#75楼[楼主]  回复 引用 查看   

2008-04-09 08:54 by webabcd      
@wxf
:)
问题解决了就好

#76楼  回复 引用   

2008-05-20 21:53 by 尧宇[未注册用户]
| :)

#77楼[楼主]  回复 引用 查看   

2008-05-21 08:25 by webabcd      
@尧宇
???啥意思???

#78楼  回复 引用   

2008-06-26 09:33 by saturn[未注册用户]
我先做的查询把数据绑定到SmartGridView中没有问题,可是上下翻页的时候数据又做了重新查询! 有办法再翻页后还是显示我先前查询的数据吗?谢谢...

#79楼[楼主]  回复 引用 查看   

2008-06-26 12:32 by webabcd      
@saturn
翻页肯定是要重新查询啊,这是GridView的逻辑

可以啊,把已经查询过的数据缓存下来,下回从缓存里读就好了

#80楼  回复 引用   

2008-07-04 11:18 by justinaoeiu[未注册用户]
webabc:
你好!我也在用你的smartgridview控件,感觉不错。但是我在用的过程中发现一个问题。

SmartGridView分页问题,如果让控件根据数据源自动生成列(即:设置AutoGenerateColumns为true),横向滑动条不会出现无限制向右拖动的bug,但是却出现分页栏属于第一列的bug;如果不自动生成列,而是通过代码生成列(即

sgvResult.Columns.Clear();

foreach (DataColumn newDC in dt.Columns)

{

BoundField newBF = new BoundField();

newBF.HeaderText = newDC.ColumnName;

newBF.DataField = newDC.ColumnName;

newBF.HeaderStyle.Wrap = false;

newBF.ItemStyle.Wrap = false;

sgvResult.Columns.Add(newBF);

}),不会出现分页栏属于第一列的bug,但是当页数多于1页时,却出现横向滑动条可以无限制向右拖动的bug。

声明:我的数据源是动态生产的。

我想问一下,怎么能让页面数,当前第几页,还有上一页,下一页,末页等这些信息在一行上显示,我用的时候总是跟第一列的宽度一样,不好看,我该怎么调整和设置参数。
谢谢!我的QQ:46252836

#81楼[楼主]  回复 引用 查看   

2008-07-04 12:13 by webabcd      
@justinaoeiu
:)
所有扩展功能都是在GridView的OnInit上扩展的
所以不支持动态设置

你可以调整一下源代码,以实现你想要的功能
最近超忙,也没时间改它的bug了
抱歉

#82楼  回复 引用   

2008-07-04 16:45 by justinaoeiu[未注册用户]
谢谢

#83楼[楼主]  回复 引用 查看   

2008-07-04 18:57 by webabcd      
@justinaoeiu
:)
不谢

没能帮上忙

#84楼  回复 引用 查看   

2008-08-07 10:30 by 落木      
如果页面存在验证控件,分页中的按钮会触发验证,建议把验证去掉

#85楼[楼主]  回复 引用 查看   

2008-08-07 13:59 by webabcd      
@落木
使用验证控件的ValidationGroup属性来解决这个问题

#86楼  回复 引用   

2008-08-11 10:47 by 6224409[未注册用户]
不知楼主是否在ajax中使用过你的控件,比如分页就有问题,点击分页会出现未处理的pageindexchanging事件

#87楼  回复 引用   

2008-08-11 11:20 by 6224409[未注册用户]
在ajax中手动添加pageindexchanging事件后运行正常,而不在ajax中就不需要,为什么?

#88楼[楼主]  回复 引用 查看   

2008-08-11 13:27 by webabcd      
@6224409
怪了,我刚在asp.net ajax下测试过,没发现你说的问题啊

#89楼  回复 引用   

2008-09-18 15:45 by 思科[未注册用户]
太复杂了~

#90楼[楼主]  回复 引用 查看   

2008-09-18 18:05 by webabcd      
@思科
:)
看明白了,就简单了

#91楼  回复 引用 查看   

2008-12-06 15:29 by xwfvictor      
请问下载源代码之后要如何使用呢?原先我已经有gridview了,想要实现自定义分页。要把我下载到的源代码放在哪里呢?不好意思啊,我是新手。

#92楼[楼主]  回复 引用 查看   

2008-12-08 07:50 by webabcd      
@xwfvictor
把dll导进工具箱,然后和gridview一样,拖进来就可以用

#93楼  回复 引用   

2008-12-19 11:42 by 徐龙[未注册用户]
在GridView的某一行敲击回车,想让它能拿到某一行某一列的值传到下一个布面,请问怎么实现??

#94楼[楼主]  回复 引用 查看   

2008-12-19 12:46 by webabcd      
@徐龙
首先要知道当前行是哪一行,保存在js变量里,然后js监听键盘事件,按回车键进到某个方法,再去在table里找你想要的值

#95楼  回复 引用 查看   

2009-01-06 16:05 by L君      


楼主,你好,请问我在试用的时候,怎么会出现这种情况

#96楼  回复 引用 查看   

2009-01-06 16:06 by L君      
那个分页行,只显示在第一列,把第一列撑开了

#97楼  回复 引用 查看   

2009-01-06 21:36 by L君      
兄台,经测试,原来是这样,如果选择自动生成字段,不手动添加字段,就会发生这种情况

#98楼[楼主]  回复 引用 查看   

2009-01-07 07:40 by webabcd      
@L君
:)
嗯,是的,原来好像也是有人说过
还是手工配置字段吧

#99楼  回复 引用   

2009-01-08 15:23 by kitlei[未注册用户]
楼主,您好,
我我在试用的时候,
不知道怎么样通过后台编程的方式绑定一个数据源,
比如说绑定一个自己生成的一个dataset类,
请赐教,非常感谢

#100楼[楼主]  回复 引用 查看   

2009-01-08 17:12 by webabcd      
@kitlei
一样啊,设置DataSource,然后DataBind,不过分页、排序等功能都要手写了

#101楼  回复 引用   

2009-01-08 17:19 by kitlei[未注册用户]
。。。主要是想使用分页功能的,不能通过简单的修改支持编程的方式绑定一个数据源吗?

#102楼[楼主]  回复 引用 查看   

2009-01-08 17:46 by webabcd      
@kitlei
可以啊
那就要字节写分页代码,和DataGrid差不多,也不难

#103楼  回复 引用   

2009-01-16 09:11 by fenger111[未注册用户]
this.SmartGridView1.DataSource = dt;//DataTable
this.SmartGridView1.DataBind();
这种形式时 分页出错:
GridView“SmartGridView1”激发了未处理的事件“PageIndexChanging”。

#104楼[楼主]  回复 引用 查看   

2009-01-19 07:21 by webabcd      
@fenger111
:)
当然,如果不用数据源控件的话,就需要你自己写分页逻辑

#105楼  回复 引用   

2009-01-21 10:14 by ranma0912[未注册用户]
--引用--------------------------------------------------
webabcd: @fenger111
:)
当然,如果不用数据源控件的话,就需要你自己写分页逻辑
--------------------------------------------------------
总算明白我的分页老出错是怎么回事了

#106楼[楼主]  回复 引用 查看   

2009-01-21 13:18 by webabcd      
@ranma0912
:)
可以说,支持数据源控件是GridView与DataGrid的最大区别了

#107楼  回复 引用 查看   

2009-03-04 16:26 by DOGNET      
楼主辛苦了

请问我在使用这个自定义控件(上面的测试版)时,为何不能在设计环境下正常设置文件中定义的属性?

若在属性窗口里设置其属性(属性和属性值选项都能正常显示)后,控件不能显示,报以下错误提示:"呈现该控件时出错。未能对属性“PagingStyle”设置“Default” ,

#108楼[楼主]  回复 引用 查看   

2009-03-05 07:24 by webabcd      
@DOGNET
:)
可能是部分属性的attribute声明的有问题
可以参考一下正式版的

#109楼  回复 引用 查看   

2009-03-05 09:02 by DOGNET      
谢谢回复

上面用到attribute声明的不就是PagingStyle属性吗?我的程序里就没写这个声明,这个attribute声明类是.net内置的吗,不使用就能导致VS设计器不能正常识别和使用吗?

我也没用到数据源控件,这个没多大影响吧,因为我们的DAL层是基于Ibatis.net动态生成sql的,使用数据源控件好像不大方便吧,在分页时,我们会将查到的数据放在第三方缓存,这个也不太影响性能的


麻烦楼主将源码包给我发邮箱里,上面的链接不知为何不能下载,多谢!!!

#110楼  回复 引用 查看   

2009-03-05 09:36 by DOGNET      
谢谢楼主提醒,我找到了

为上面的PagingStyle属性添加如下属性即可:
[BrowsableAttribute(true)]
[DescriptionAttribute("获取和设置自定义样式")]
[DefaultValueAttribute("Default")]
[CategoryAttribute("Appearance")]
说明:
[BrowsableAttribute(true)] 可指示属性浏览器显示该属性的名称和值.默认情况下,每个公共的属性都可考虑使用BrowsableAttribute,对于只读属性(Property)不需要进行修改值,显示名称和值没有意义.
[DescriptionAttribute("获取和设置自定义样式")] 当开发人员选中该属性(Property)时,显示文本"获取和设置自定义样式"
[DefaultValueAttribute("Default")] 显示默认值Default
[CategoryAttribute("Appearance")] 在外观类别显示该属性(Property)

#111楼[楼主]  回复 引用 查看   

2009-03-05 11:50 by webabcd      
@DOGNET
:)
找到问题就好

提供的链接肯定可以下载的,你可以再试一下

#112楼  回复 引用   

2009-04-06 14:05 by Liu_wmw[未注册用户]
我是个初学者。在使用SmartGridView时动态的使用了数据源,在点击导出Excel按钮时出错:
行 116: throw new InvalidCastException("若要导出SmartGridView,应保证其数据源为DataTable或DataSet类型");
请问怎样解决这个问题。

#113楼[楼主]  回复 引用 查看   

2009-04-06 18:02 by webabcd      
@Liu_wmw
先DataBind后再导出,否则找不到数据源

#114楼  回复 引用   

2009-04-06 20:18 by Liu_wmw[未注册用户]
在导出按钮事件中加了DataBind,还是不行。

#115楼[楼主]  回复 引用 查看   

2009-04-07 07:25 by webabcd      
@Liu_wmw
那就直接调方法吧
YYControls.Helper.Common类下的
Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataSet ds, string[] headers, string[] fields, ExportFormat exportFormat, string fileName, Encoding encoding)

#116楼  回复 引用   

2009-04-07 18:55 by Liu_wmw[未注册用户]
不好意思,又要麻烦你了。我用动态数据源后,用你说的办法还是没有成功,后来改成ObjectDataSource,导出时还是出现_dataSourceObject为Null的问题,这是怎么回事。我参照了你做的Demo,没有多大的区别呀。

#117楼  回复 引用   

2009-04-07 20:15 by Liu_wmw[未注册用户]
我刚调试了一下,页面装载成功后_dataSourceObject有值,一点击导出按钮后在OnLoad方法中就为Null了,真郁闷。

#118楼[楼主]  回复 引用 查看   

2009-04-08 07:40 by webabcd      
@Liu_wmw
像我上面说的,你可以直接调方法
Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
传进去DataTable的数据源就可以导出

#119楼  回复 引用   

2009-05-21 14:17 by 等等[未注册用户]
你好 分页就有问题,点击分页会出现未处理的pageindexchanging事件
如何自己扩展啊,能给点提示吗

#120楼[楼主]  回复 引用 查看   

2009-05-21 18:11 by webabcd      
@等等
分页需要自己写分页事件的
当然,如果使用数据源控件的话就不用再自己写分页事件了

#121楼  回复 引用 查看   

2010-02-03 13:24 by 问天何必      
引用wxf:关于分页的问题!

1.第一方式:我在CustomPagerSettingsFunction类的_sgv_InitPager方法中,添加一个dropDownList控件,和你添加linkbutton类似


 DropDownList YYControlList = new DropDownList();
     for (int i = 1; i <= pagedDataSource.PageCount; i++)
          {
              YYControlList.Items.Add(i.ToString()...
YYControlList.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged);

我想请问, 你的list_SelectedIndexChanged方法写在哪的?

OnPageIndexChanging(new GridViewPageEventArgs(((DropDownList)sender).SelectedIndex));

写在哪?


#122楼[楼主]  回复 引用 查看   

2010-02-04 08:47 by webabcd      
@问天何必
是想实现DropDownList分页吧
请参考这个,这里有详细的解释
http://www.codeproject.com/KB/grid/ExtendingGridViewControl.aspx

#123楼  回复 引用 查看   

2010-04-24 20:36 by 源总      
你好。刚接触你的控件。请问自带的分页支持储存过程分页吗?
PageCount只读。无法赋值。。。

如果能分页。谢谢告诉我下方案

#124楼[楼主]  回复 引用 查看   

2010-04-26 08:22 by webabcd      
@源总
我的这个分页只是扩展内置的分页样式
分页功能的话还是GridView自身的

可以通过数据源控件来支持存储过程分页

#125楼  回复 引用 查看   

2010-07-08 17:49 by hll0319      
GridView如何绑定数据的?

#126楼[楼主]  回复 引用 查看   

2010-07-09 08:15 by webabcd      
@hll0319
可以指定数据源然后绑定或者用数据源控件

#127楼  回复 引用 查看   

2010-11-10 15:39 by 风三少      
请问你这个GridView是不是一定要绑定数据源控件啊?

#128楼  回复 引用 查看   

2010-11-10 15:46 by 风三少      
@webabcd
不行啊 ,会报错

#129楼[楼主]  回复 引用 查看   

2010-11-10 17:30 by webabcd      
@风三少
测试时,只试了用数据源控件的情况
源代码里有demo,可以看看demo中是怎么使用的

#130楼  回复 引用 查看   

2010-12-10 15:47 by 风三少      
楼主,我点查询以后怎么就没有分页了呢?

#131楼[楼主]  回复 引用 查看   

2010-12-13 08:39 by webabcd      
@风三少
如果不用数据源控件的话,需要重新绑定

#132楼  回复 引用 查看   

2011-04-26 11:37 by kr      
搞不懂为什么 有正式版 和测试版 呢 而且还要自己创建 smartgridview的对象

#133楼[楼主]  回复 引用 查看   

2011-04-26 16:29 by webabcd      
@kr
:)
因为我当时犯病呢,grid控件推荐用jqGrid
评论共2页: 上一页 1 2 
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 639793 4aVxU7trXpM=