[最后更新:2008.03.28]
GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。
[源码下载(C#)]
[源码下载(VB)] 感谢
旌浪提供VB版本
相关文章地址
扩展GridView控件(索引) - 增加多个常用功能
作者:
webabcd
/*正式版的实现 开始*/
文章索引
扩展GridView控件(0) - 基本架构、增加事件和要点汇总
扩展GridView控件(1) - 鼠标经过行时改变行的样式
扩展GridView控件(2) - 复合排序和排序状态提示
扩展GridView控件(3) - 根据按钮的CommandName设置其客户端属性
扩展GridView控件(4) - 联动复选框(复选框的全选和取消全选)
扩展GridView控件(5) - 固定指定行、指定列
扩展GridView控件(6) - 响应行的单击事件和双击事件
扩展GridView控件(7) - 行的指定复选框选中时改变行的样式
扩展GridView控件(8) - 导出数据源的数据为Excel、Word或Text
扩展GridView控件(9) - 给数据行增加右键菜单
扩展GridView控件(10) - 自定义分页样式
扩展GridView控件(11) - 合并指定列的相邻且内容相同的单元格
注:除了“固定指定行、指定列”仅支持IE外,其它均同时支持IE和FF
控件截图
控件使用
1、鼠标经过行的时候改变该行的样式,鼠标离开行的时候恢复该行的样式
使用方法(设置属性):
MouseOverCssClass - 鼠标经过行时行的 CSS 类名
2、对多个字段进行复合排序;升序、降序的排序状态提示
使用方法(设置SmartSorting复合属性):
AllowSortTip - 是否启用排序提示
AllowMultiSorting - 是否启用复合排序
SortAscImageUrl - 升序提示图片的URL(不设置则使用默认图片)
SortDescImageUrl - 降序提示图片的URL(不设置则使用默认图片)
SortAscText - 升序提示文本
SortDescText - 降序提示文本
3、根据按钮的CommandName设置其客户端属性
使用方法(设置ClientButtons集合属性):
BoundCommandName - 需要绑定的CommandName
AttributeKey - 属性的名称
AttributeValue - 属性的值(两个占位符:{0} - CommandArgument;{1} - Text)
Position - 属性的值的位置
4、联动复选框(复选框的全选和取消全选)。选中指定的父复选框,则设置指定的所有子复选框为选中状态;取消选中指定的父复选框,则设置指定的所有子复选框为取消选中状态
使用方法(设置CascadeCheckboxes集合属性):
ParentCheckboxID - 模板列中 父复选框ID
ChildCheckboxID - 模板列中 子复选框ID
YYControls.Helper.SmartGridView中的静态方法
List
GetCheckedDataKey(GridView gv, int columnIndex)
List GetCheckedDataKey(GridView gv, string checkboxId)
5、固定指定行、指定列,根据RowType固定行,根据RowState固定行
使用方法(设置FixRowColumn复合属性):
FixRowType - 需要固定的行的RowType(用逗号“,”分隔)
FixRowState - 需要固定的行的RowState(用逗号“,”分隔)
FixRows - 需要固定的行的索引(用逗号“,”分隔)
FixColumns - 需要固定的列的索引(用逗号“,”分隔)
TableWidth - 表格的宽度
TableHeight - 表格的高度
6、响应行的单击事件和双击事件,并在服务端处理
使用方法(设置属性):
BoundRowClickCommandName - 行的单击事件需要绑定的CommandName
BoundRowDoubleClickCommandName - 行的双击事件需要绑定的CommandName
7、行的指定复选框选中的时候改变该行的样式,行的指定复选框取消选中的时候恢复该行的样式
使用方法(设置CheckedRowCssClass复合属性):
CheckBoxID - 模板列中 数据行的复选框ID
CssClass - 选中的行的 CSS 类名
8、导出数据源的数据为Excel、Word或Text(应保证数据源的类型为DataTable或DataSet)
使用方法:
为SmartGridView添加的方法
Export(string fileName)
Export(string fileName, ExportFormat exportFormat)
Export(string fileName, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, int[] columnIndexList, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, int[] columnIndexList, string[] headers, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, string[] columnNameList, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, string[] columnNameList, string[] headers, ExportFormat exportFormat, Encoding encoding)
9、给数据行增加右键菜单,响应服务端事件或超级链接
使用方法(设置ContextMenus集合属性):
Text - 菜单的文本内容
BoundCommandName - 需要绑定的CommandName
NavigateUrl - 链接的URL
Target - 链接的目标窗口或框架
SmartGridView的属性ContextMenuCssClass - 右键菜单的级联样式表 CSS 类名(右键菜单的结构div ul li a)
10、自定义分页样式。显示总记录数、每页记录数、当前页数、总页数、首页、上一页、下一页、末页和分页按钮
使用方法(设置CustomPagerSettings复合属性):
PagingMode - 自定义分页的显示模式
TextFormat - 自定义分页的文本显示样式(四个占位符:{0}-每页显示记录数;{1}-总记录数;{2}-当前页数;{3}-总页数)
11、合并指定列的相邻且内容相同的单元格
使用方法(设置属性):
MergeCells - 需要合并单元格的列的索引(用逗号“,”分隔)
/*正式版的实现 结束*/
/*测试版的实现 开始*/
控件开发
扩展GridView控件(一)——鼠标经过行时改变行的样式
扩展GridView控件(二)——给字段标题加上排序状态
扩展GridView控件(三)——单击命令按钮弹出确认框
扩展GridView控件(四)——每行复选框的全选与取消全选
扩展GridView控件(五)——固定表头、指定行或指定列
扩展GridView控件(六)——数据行响应鼠标的单击和双击事件
扩展GridView控件(七)——改变通过复选框选中的行的样式
扩展GridView控件(八)——导出为Excel
扩展GridView控件(九)——给数据行增加右键菜单
扩展GridView控件(十)——扩展分页功能
控件截图
控件使用
1、鼠标经过行时改变行的样式
CssClassMouseOver - 鼠标经过行时行的样式的CSS类名
2、给字段标题加上排序状态
设置其SortTip下的4个属性即可
SortAscImage - 升序提示图片
SortAscText - 升序提示文本
SortDescImage - 降序提示图片
SortDescText - 降序提示文本
3、单击命令按钮弹出确认框
设置其ConfirmButtons属性
CommandName - 命令按钮的CommandName属性
ConfirmMessage - 弹出的确认框所显示的文字
4、每行复选框的全选与取消全选
在模板列的头模板处添加一个复选框,在模板列的项模板处添加一个复选框,然后设置控件的CheckboxAlls属性
CheckboxAllID - 模板列全选复选框ID
CheckboxItemID - 模板列项复选框ID
5、固定表头、指定行或指定列
设置其FixRowCol下的6个属性
IsFixHeader - 固定表头否?
IsFixPager - 固定分页行否?
FixRowIndices - 需要固定的行的索引(用逗号“,”分隔)
FixColumnIndices - 需要固定的列的索引(用逗号“,”分隔)
TableWidth - 表格的宽度
TableHeight - 表格的高度
EnableScrollState - 是否保持滚动条的状态
6、数据行响应鼠标的单击和双击事件
RowClickButtonID - 行单击事件所对应的按钮的ID
RowDoubleClickButtonID - 行双击事件所对应的按钮的ID
7、改变通过CheckBox选中的行的样式
CheckBoxID - 模板列的项复选框的ID
CssClassRowSelected - 选中行的样式的CSS类名
8、导出为Excel
在GridView内加一个按钮
CommandName属性设置为“ExportToExcel”
CommandArgument属性的值用“;”做分隔符分为两部分,左边的部分为导出Excel的文件名称,右边的部分为需要隐藏的列的索引(列索引用“,”分开)
9、给数据行增加右键菜单
ItemType - 右键菜单的项的类别(Link,Command,Custom,Separator)
Icon - 文字左边的图标的链接
Text - 菜单的文字
CommandButtonId - 所调用的命令按钮的ID
NavigateUrl - 链接的url
Target - 链接的target(Blank,Self,Top)
Key - 自定义属性key
Value - 自定义属性value
10、扩展分页功能
设置PagingStyle属性为Default
设置GridView的原有属性PageButtonCount,FirstPageText,PreviousPageText,NextPageText,LastPageText,FirstPageImageUrl,PreviousPageImageUrl,NextPageImageUrl,LastPageImageUrl
/*测试版的实现 结束*/
OK
[源码下载]
Feedback
动态载模板的话,如下
BoundField bc = new BoundField();
bc.HeaderText = header;
bc.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
bc.HeaderStyle.Wrap = false;
bc.DataField = colname;
bc.ItemStyle.Wrap = false;
bc.DataFormatString = "{0}";
bc.SortExpression = colname;
bc.HtmlEncode = false;
_sgv.Columns.Add(bc);
最后显示的时候多了这一列,搞不懂啊.
注:加了一条this._sgv.Load += new EventHandler(_sgv_Load);
在其中写的,真是整不明白了,哪位帮忙解释一下啊.
全部应该是这样的:
if (edit.Equals("datetime")) {
TemplateField DropField = new TemplateField();
DropField.ItemTemplate = new TextBoxTemplate(DataControlRowType.DataRow, colname);
_sgv.Columns.Add(DropField);
}
else {
BoundField bc = new BoundField();
bc.HeaderText = header;
bc.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
bc.HeaderStyle.Wrap = false;
bc.DataField = colname;
bc.ItemStyle.Wrap = false;
bc.DataFormatString = "{0}";
bc.SortExpression = colname;
bc.HtmlEncode = false;
_sgv.Columns.Add(bc);
}
最后发现多出了整个表,即原来列还在.
在前面加入_sgv.Columns.Clear();也不成.
疯了!
睡了.
能否考虑将多选功能完善一下,支持夸页多选?
还有行的单击和双击最好也支持客户端事件
@克隆
嗯,都是很好的建议
不过最近是不可能了,忙得很啊。。。
忙没关系,问题先记下来,有空再改
当表头固定时,样式表也被锁定了,比如粗线问题
@克隆
:)
其实也还有好多别的想法
呵呵,不知道什么时候才能有空闲时间并且不犯懒了
其实你的控件我已经感觉很是好用,而且设计思路很清晰,我也从中受教不少
你能写出来已经是很有国际主义精神了
希望继续加油
关于GroupView右键加图片那个例子,在GridView上根据不同条件,来变化ContextMenu上的显示内容
SmartGridViewAlpha,加入两个这Gridview右键显示的信息都是一样得,并且第二个GridView还不能用,
@飒风
是的
Alpha版本的问题多多
请用SmartGridView正式版
控件在firefox下的firbug报错:
[Exception... "'JavaScript component does not have a method named: "handleEvent"' when calling method: [nsIDOMEventListener::handleEvent]" nsresult: "0x80570030 (NS_ERROR_XPC_JSOBJECT_HAS_NO_FUNCTION_NAMED)" location: "<unknown>" data: no]
今天把SmartGridView/Resources/ScriptLibraryDebug.js
中的最后其中一条代码注释掉,就不出这个错了,代码是
// window.addEventListener('load', yy_sgv_rightMenu = new yy_sgv_rightMenu(), false);
可能注释了gridview右键用不了了,望斑主改一下,要不在firfox中用firfox调试项目,有时会有上百个错误信息,全是这个,看着不舒服。
@shark0304
呵呵,终于被发现了,虽然不影响使用,但是,确实firebug会报错
咳,惭愧啊,曾经试图解决过,但是没搞定
vs 2008 环境中在页面的设计视图中总是报错“创建控件时出错”,提示和页面其它某控件ID冲突,但该ID是唯一的。
@米黄色衬衫
没精力继续更新这个了
不过,我也是用VS2008,没出现过你所说的情况
使用文档已经在文中写了,呵呵,很简单
开发文档的话,看注释吧,都很详细
请问非动态创建怎么能够让这个控件的宽度跟页面的宽度相同呢?我动态创建的时候设置sgv1.Width = Unit.Percentage(100);就可以,但是按照例子中的创建方式,在page_load里面这样设置就不行
@ozai
“非动态创建”的话,直接在aspx中设置GridView的Width不就行吗
直接在aspx中设置GridView的Width,只是增加滚动条的长度,好像是只对里面的表格的整体宽度有效,感觉控件外面还有一层似的,不知道我的表达你是否明白
你在示例代码里面设一下就明白了
不知道有没有什么办法能解决呢
这个控件的确省了很多力气
但是有个问题,在点击页数时会验证本页的textbox,CausesValidation=true
还有就是无法固定列的宽度了,找了好多方法都不能实现,用了其他的GridView扩展控件也不行,不知道是什么缘故
@ozai
如果使用固定行、列的功能的话
因为外面要包一个div
所以要设置外面的width的话,可以设置FixRowColumn的TableWidth
@monsoon
通过设置ValidationGroup属性解决
先感谢楼主提供了这么好的控件给大家。
我最近使用vs2008开发,出现了一个问题,不知道怎么回事
只要在updatepanel中使用SmartGridView控件,经常会出现视图状态与代码不同步的情况,就是有时候明明在属性设置里改动了某个属性,视图状态也有了改变,代码却没变,然后也不能保存,重新关闭打开这个文件后又恢复到没有改变之前的样子了。
3月份的时候我们刚开始做项目,本来打算用vs2008,结果发现了这个问题,还一直以为是vs2008的bug,几个同事的电脑上都是一样的,这段时间sp1出来了,我就再安装了2008试了一下,结果还是同样的问题,而且更频繁了,以前只是时不是,现在每次都这样。我是专门重新安装了操作系统测试过的,然后用vs2008将你的代码重新编译过,问题依旧,我在想@米黄色衬衫应该是跟我相同的问题,因为我这里也是这样。
@Derek.shi
抱歉了,很难定位问题
之前我也用过updatepanel+smartgridview开发过的,并没有此类问题
如果有问题的话,和vs版本也是没关系的
@webabcd
在vs2005里是完全没有问题的,2008就不行了。
@Derek.shi
那就怪了
程序是根据.net版本走的,和vs没关系的
gridview调用的都是.net2.0(clr)的
@webabcd
我的同事电脑上只要使用vs2008就有这样的问题,我也重装系统试过了,应该不是我一个人才有这样的问题啊,你有条件的话试一下吧,就是在updatepanel里边放smartgridview,我是很想用你这个控件的,但项目又要求vs2008,没办法取舍啊,或者你有什么其它的推荐?像你这个这样的。
@webabcd
其实也不是在vs2008下有问题,只是在vs2008下的updatepanel控件中会有问题,只要页面上不放updatepanel就啥问题都没有。
@webabcd
还有一个现象,在页面上面了updatepanel之后,在updatepanel之外添加一个smartgridview没问题,只要把smartgridview拖到updatepanel里边,这个smartgridview在代码里边就消失了,没有它的代码了,但视图里又看得到,这个时候只要在视图状态里边点右键刷新,这个smartgridview在视图里也消失了,但只要不刷新或关了文件重打开,再把smartgridview拖到updatepanel之外,代码视图又会恢复正常。
SmartGridView若使用EmptyDataTemplate,EmptyDataTemplate放了一个表格,滚动条出现异常,两个滚动条在滚动的过程中不断变短,但无论如何也滚不到另一端,请你测试一下,但不固定任何表头、列就没有问题(去掉FixRowColumn)。
问题出现在没有数据的情况下,即使用EmptyDataTemplate的情况下,有数据时则没有问题,滚动正常。我在EmptyDataTemplate放置了一个最简单的没有用任何样式的table也是出现问题。
@米黄色衬衫
这个是IE7下面出现的,IE6正常,我也刚好遇到。
@Derek.shi
那确实很难理解了
我的项目中也有updatepanel加smartgridview
每什么问题
推荐的话,extjs里有不错的表格控件
@米黄色衬衫
@Derek.shi
EmptyDataTemplate
里的内容要与相应的GridView生出来的HTML结构一致才可以
@shark0304
比较麻烦,特别是数据源的绑定上
还是网上找找例子,然后应用到项目中吧
楼主,感觉你的控件做的很不错。谢谢!
我试用过SmartGrid这个控件。感觉也比较符合国人的习惯。
楼主有时间研究一下SmartGrid,丰富一下YYControls。
呵呵。
再次感谢!!!
@MVC不是三层
:)
过奖了
好的控件确实是很多,有时间的话一定会多写几个的
你好,这个控件中,导出数据时,如果表头为数字或字母开头、或包含特殊字符的话就会报错,请问这是什么原因
@-可乐
刚才测试了几个有数字和字母的表头
导出时没问题啊
@webabcd
请你试试以数字或字母开头,或特殊字符
--引用--------------------------------------------------
蜗牛身上的一只蚂蚁: 我是存在ViewState了,可是在哪个方法,或哪个事件里加上要显示的代码呢?。因为点“下一页”或"上一页"。他们的事件方法是重新取出数据值来的啊。
<br> /// <summary>
<br> /// 获取或设置选中项的集合
<br> /// </summary>
<br> protected ArrayList SelectedItems
<br> {
<br> get
<br> {
<br> return (ViewState["itemCheckBoxProvinceValues"] != null) ? (ArrayList)ViewState["itemCheckBoxProvinceValues"] : null;
<br> }
<br> set
<br> {
<br> ViewState["itemCheckBoxProvinceValues"] = value;
<br> }
<br> }
<br>
<br> //这里的处理是为了回显之前选中的情况--
<br>//这代码放哪个事件或方法里面啊。
<br> if (SelectedItemsValues.Count != 0)
<br> {
<br>
<br> for (int i = 0; i < gv.Rows.Count; i++)
<br> {
<br> string id = gv.Rows[i].Cells[1].Text;
<br> CheckBox cb = gv.Rows[i].FindControl("itemCheckBoxProvince") as CheckBox;
<br> if (SelectedItemsValues.Contains(id))
<br> cb.Checked = true;
<br> else
<br> cb.Checked = false;
<br> }
<br>
<br> }
<br>谢谢。。。
--------------------------------------------------------
CheckBox的选中状态在哪里保存进ViewState里的,能将这一功能所有代码贴出来吗,谢谢
@-可乐
试过以数字或字母开头,没问题
部分代码,参考一下
#region 记录复选框选中状态的逻辑
void SetCheckedItems()
{
var checkedItems = new List<string>();
CheckBox chkParent = null;
HiddenField hdnProductId = null;
ListView lvChild = null;
checkedItems = CheckedItems;
foreach (ListViewItem lvi in lvParent.Items)
{
chkParent = lvi.Controls[0].FindControl("chkParent") as CheckBox;
hdnProductId = lvi.Controls[0].FindControl("hdnProductId") as HiddenField;
lvChild = lvi.Controls[0].FindControl("lvChild") as ListView;
if (chkParent.Checked)
{
if (!checkedItems.Contains(hdnProductId.Value))
checkedItems.Add(hdnProductId.Value);
}
else
{
checkedItems.Remove(hdnProductId.Value);
}
if (lvChild != null)
{
CheckBox chkChild = null;
foreach (ListViewItem lviChild in lvChild.Items)
{
chkChild = lviChild.Controls[0].FindControl("chkChild") as CheckBox;
hdnProductId = lviChild.Controls[0].FindControl("hdnProductId") as HiddenField;
if (chkChild.Checked)
{
if (!checkedItems.Contains(hdnProductId.Value))
checkedItems.Add(hdnProductId.Value);
}
else
{
checkedItems.Remove(hdnProductId.Value);
}
}
}
}
CheckedItems = checkedItems;
}
public List<string> CheckedItems
{
get
{
if (ViewState["CheckedItems"] == null)
return new List<string>();
return ViewState["CheckedItems"] as List<string>;
}
set
{
ViewState["CheckedItems"] = value;
}
}
#endregion
@-可乐
List<string> selectedItems = null;
if (AdminWebUtility.SelectedUnPicFolderItems == null)
selectedItems = new List<string>();
else
selectedItems = AdminWebUtility.SelectedUnPicFolderItems;
for (int i = 0; i < this.gvVideoFilePicUnCatalog.Rows.Count; i++)
{
string id = this.gvVideoFilePicUnCatalog.Rows[i].Cells[1].Text;
CheckBox cb = this.gvVideoFilePicUnCatalog.Rows[i].FindControl("itemCheckBoxUnPicFolder") as CheckBox;
if (selectedItems.Contains(id) && !cb.Checked)
selectedItems.Remove(id);
if (!selectedItems.Contains(id) && cb.Checked)
selectedItems.Add(id);
}
就是先定义一个数组对象A(我现在这个定义的是一个List<string>,它跟数组ArrayList 差不多)。循环当前选中的项。如果选中则存在A中。。。最后把A给它就行了。。。
@webabcd
谢谢,还有一个问题,就是如上面引用的代码中的问题一样,不知道在哪里调用初始化代码,如果在PageIndexChanged里调用会有问题
虽然效率很低,但搞了一天终于搞定了,打算改源码来提高效率。可以在OnDataBound里调用初始化函数,实现翻页选中和选中导出了,谢谢LZ和蜗牛身上的一只蚂蚁
@蜗牛身上的一只蚂蚁
@-可乐
看来没什么需要我回的了
谢谢大家
@webabcd
感谢LZ大大的分享。嘎嘎。。。
@-可乐
改好后分享下。嘎嘎。。。
最近看他们的MVC呢。。。。
@蜗牛身上的一只蚂蚁
@lucasxie
:)
大家多交流,共同提高
你好!谢谢你的努力!真的佩服你!呵呵!
但是我现在我有个问题,项目后台的数据库是Oracle,数据量比较大,所以想实现分页功能,那我怎么去处理呢?应该返回什么值,并且绑定到你的控件什么属性上呢?如果使用你的自定义分页功能的话,怎么处理呢》谢谢你的回答!急需等待中!
再接着追加问题,就是如果我想把这个控件做为显示搜索结果作用,那我是不是在objectdatasource写个类文件,返回搜索结果集,然后再绑定到objectdatasource 就可以了,是吗?还有就是右键可以怎么获得该列的datakey的值?
再接着追加问题,就是如果我想把这个控件做为显示搜索结果作用,那我是不是在objectdatasource写个类文件,返回搜索结果集,然后再绑定到objectdatasource 就可以了,是吗?还有就是右键可以怎么获得该列的datakey的值?然后跨页传递值到另外页面.
谢谢你提供的链接资料!但是对于获取相应行的datakey值,还不是很清楚你的意思?Js读取相应行的datakey,在哪里添加呢?
-----------------------------------------------
@GoogleFans
都是客户端操作,那就更简单了
在生成的右键菜单的li中增加一个标识用的attribute
----------------------------------------
像上面你回答的那样吗?你这边有demo吗?
@Levi
做个隐藏控件或tr的属性,放到相应的行里
没有Demo,其实他说的也很清楚了
还有你那脚本库的JS是怎么压缩成一行的!用什么工具,能否共享一份给小弟。
goansonpan@126.com
VS2008中,视图界面,老是“创建控件出错”,未能对属性XX设置XX。怎么办啊。老看不到视图设计界面
@howgoo
是这个控件吗,刚才用这个demo在vs2008下测试了一下,没问题啊
@webabcd
我要退出vs2008,打开解决方案,才可以在视图界面看到SmartGridView的表格,才不会出现那个错误。
有时候,还要删除C:\Documents and Settings\Administrator\Local Settings\Application Data\Microsoft\VisualStudio\9.0\ProjectAssemblies中的文件,才能正常。
我怀疑可能是Vs2008的问题
@howgoo
奇怪了,我倒是没遇到过
呵呵,也许是因为很少在设计视图中写代码的原因
"result".InnerHtml = s + "<br />";
这个说是当前个result“这个名称不存在呢???这个是为什么呢????
@Jake2009
。。。
当然不能是字符串.
而应该是对象.
能否在不使用复选框的情况下单击某行(的任一部分)改变该行的样式?(使被点击的行突出显示)
@xmlys
这个控件实现不了。其实这个需求的话直接写js也不麻烦
result.InnerHtml = s + "<br />";
请问上面这一行要怎麽改才能正常执行?
我一直卡在这一行
@DanieHung
。。。
没太明白是什么问题,能不能再说详细点?
@DanieHung
:)
客气了,我应该是什么忙都没帮上,哈
@webabcd
请问~采用fixrow的资源占用有办法改善吗?
因为我如果有很多笔资料又想fix栏位
可是画面就会变得非常慢
有没有比较好的方法使用呢?
@webabcd
还有一个问题
就是如果用了fixrow的效果
会有scrollbar
但是当我把scrollbar往下移动之後按了submit的动作
scrollbar又会跑到最上面去了
有没有办法可以让它自动停在我上次停留的位置?
感激不尽!
@DanieHung
效率低是没办法的
因为用的是css+expression来实现的
建议别用了,这个到ie8就不支持了
滚动条的话,可以在postback前记下滚动条的位置并以其postback,然后render的时候,再根据此值设置滚动条的位置。可以参考一下alpha版,那个版本实现了这个功能
@wumingxiaozu
我写的这个不行
不过记得有人实现过这个功能,可以google一下,应该有现成的控件