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

ASP.NET
从现在开始 一切都不晚
posts - 288, comments - 7870, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
[最后更新: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

评论共6页: 上一页 1 2 3 4 5 6 

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

2008-09-23 08:17 by webabcd      
@MVC不是三层
:)
过奖了
好的控件确实是很多,有时间的话一定会多写几个的

#477楼  回复 引用   

2008-10-06 15:46 by -可乐[未注册用户]
你好,这个控件中,导出数据时,如果表头为数字或字母开头、或包含特殊字符的话就会报错,请问这是什么原因

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

2008-10-07 07:32 by webabcd      
@-可乐
刚才测试了几个有数字和字母的表头
导出时没问题啊

#479楼  回复 引用   

2008-10-07 09:35 by -可乐[未注册用户]
@webabcd
请你试试以数字或字母开头,或特殊字符

#480楼  回复 引用   

2008-10-07 09:52 by -可乐[未注册用户]
--引用--------------------------------------------------
蜗牛身上的一只蚂蚁: 我是存在ViewState了,可是在哪个方法,或哪个事件里加上要显示的代码呢?。因为点“下一页”或"上一页"。他们的事件方法是重新取出数据值来的啊。
<br> /// &lt;summary&gt;
<br> /// 获取或设置选中项的集合
<br> /// &lt;/summary&gt;
<br> protected ArrayList SelectedItems
<br> {
<br> get
<br> {
<br> return (ViewState[&quot;itemCheckBoxProvinceValues&quot;] != null) ? (ArrayList)ViewState[&quot;itemCheckBoxProvinceValues&quot;] : null;
<br> }
<br> set
<br> {
<br> ViewState[&quot;itemCheckBoxProvinceValues&quot;] = value;
<br> }
<br> }
<br>
<br> //这里的处理是为了回显之前选中的情况--
<br>//这代码放哪个事件或方法里面啊。
<br> if (SelectedItemsValues.Count != 0)
<br> {
<br>
<br> for (int i = 0; i &lt; gv.Rows.Count; i++)
<br> {
<br> string id = gv.Rows[i].Cells[1].Text;
<br> CheckBox cb = gv.Rows[i].FindControl(&quot;itemCheckBoxProvince&quot;) as CheckBox;
<br> if (SelectedItemsValues.Contains(id))
<br> cb.Checked = true;
<br> else
<br> cb.Checked = false;
<br> }
<br>
<br> }
<br>谢谢。。。
--------------------------------------------------------


CheckBox的选中状态在哪里保存进ViewState里的,能将这一功能所有代码贴出来吗,谢谢

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

2008-10-07 12:18 by webabcd      
@-可乐
试过以数字或字母开头,没问题

部分代码,参考一下
#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

#482楼  回复 引用 查看   

2008-10-07 17:23 by 蜗牛身上的一只蚂蚁      
@-可乐
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给它就行了。。。

#483楼  回复 引用 查看   

2008-10-07 17:24 by 蜗牛身上的一只蚂蚁      
再次感谢LZ大大的分享。。。谢谢。。。。

#484楼  回复 引用 查看   

2008-10-07 17:33 by -可乐      
@webabcd
谢谢,还有一个问题,就是如上面引用的代码中的问题一样,不知道在哪里调用初始化代码,如果在PageIndexChanged里调用会有问题

#485楼  回复 引用 查看   

2008-10-07 20:48 by -可乐      
虽然效率很低,但搞了一天终于搞定了,打算改源码来提高效率。可以在OnDataBound里调用初始化函数,实现翻页选中和选中导出了,谢谢LZ和蜗牛身上的一只蚂蚁

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

2008-10-08 07:38 by webabcd      
@蜗牛身上的一只蚂蚁
@-可乐
看来没什么需要我回的了
谢谢大家

#487楼  回复 引用 查看   

2008-10-08 09:52 by 蜗牛身上的一只蚂蚁      
@webabcd
感谢LZ大大的分享。嘎嘎。。。

@-可乐
改好后分享下。嘎嘎。。。
最近看他们的MVC呢。。。。

#488楼  回复 引用   

2008-10-08 10:56 by lucasxie[未注册用户]
非常感谢,太热情了,有你这样的人真好

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

2008-10-08 12:39 by webabcd      
@蜗牛身上的一只蚂蚁
@lucasxie
:)
大家多交流,共同提高

#490楼  回复 引用   

2008-10-15 13:47 by Levi[未注册用户]
你好!谢谢你的努力!真的佩服你!呵呵!
但是我现在我有个问题,项目后台的数据库是Oracle,数据量比较大,所以想实现分页功能,那我怎么去处理呢?应该返回什么值,并且绑定到你的控件什么属性上呢?如果使用你的自定义分页功能的话,怎么处理呢》谢谢你的回答!急需等待中!

#491楼  回复 引用   

2008-10-15 14:15 by Levi[未注册用户]
再接着追加问题,就是如果我想把这个控件做为显示搜索结果作用,那我是不是在objectdatasource写个类文件,返回搜索结果集,然后再绑定到objectdatasource 就可以了,是吗?还有就是右键可以怎么获得该列的datakey的值?

#492楼  回复 引用   

2008-10-15 15:23 by Levi[未注册用户]
再接着追加问题,就是如果我想把这个控件做为显示搜索结果作用,那我是不是在objectdatasource写个类文件,返回搜索结果集,然后再绑定到objectdatasource 就可以了,是吗?还有就是右键可以怎么获得该列的datakey的值?然后跨页传递值到另外页面.

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

2008-10-15 18:22 by webabcd      
@Levi
如果数据源控件的话,那么实现大数据量分页还是很方便的
这里有一个LINQ+GridView的大数据量分页DEMO
http://www.cnblogs.com/webabcd/archive/2007/10/23/933896.html

把行的datakey放到页面里,右键的时候js读取相应的行的datakey

#494楼  回复 引用   

2008-10-15 23:06 by Levi[未注册用户]
谢谢你提供的链接资料!但是对于获取相应行的datakey值,还不是很清楚你的意思?Js读取相应行的datakey,在哪里添加呢?
-----------------------------------------------
@GoogleFans
都是客户端操作,那就更简单了
在生成的右键菜单的li中增加一个标识用的attribute
----------------------------------------
像上面你回答的那样吗?你这边有demo吗?

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

2008-10-16 07:43 by webabcd      
@Levi
做个隐藏控件或tr的属性,放到相应的行里

没有Demo,其实他说的也很清楚了

#496楼  回复 引用 查看   

2008-10-22 15:38 by 阿一      
请问一下,能否解决没有数据时也显示表头。

#497楼  回复 引用 查看   

2008-10-22 15:42 by 阿一      
还有你那脚本库的JS是怎么压缩成一行的!用什么工具,能否共享一份给小弟。
goansonpan@126.com

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

2008-10-23 07:35 by webabcd      
@阿一
参考
http://code.msdn.microsoft.com/AlwaysShowHeaderFoot

压缩js的那个工具是网上找的,完了叫什么名字了,google一下吧

#499楼  回复 引用   

2008-10-23 15:06 by shark0304[未注册用户]
版主,这个可以实现复杂表头吗

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

2008-10-23 19:07 by webabcd      
@shark0304
不可以,要自己写代码

#501楼  回复 引用   

2008-11-12 16:59 by howgoo[未注册用户]
VS2008中,视图界面,老是“创建控件出错”,未能对属性XX设置XX。怎么办啊。老看不到视图设计界面

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

2008-11-12 18:28 by webabcd      
@howgoo
是这个控件吗,刚才用这个demo在vs2008下测试了一下,没问题啊

#503楼  回复 引用   

2008-11-13 10:51 by howgoo[未注册用户]
@webabcd
我要退出vs2008,打开解决方案,才可以在视图界面看到SmartGridView的表格,才不会出现那个错误。
有时候,还要删除C:\Documents and Settings\Administrator\Local Settings\Application Data\Microsoft\VisualStudio\9.0\ProjectAssemblies中的文件,才能正常。
我怀疑可能是Vs2008的问题

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

2008-11-13 12:24 by webabcd      
@howgoo
奇怪了,我倒是没遇到过
呵呵,也许是因为很少在设计视图中写代码的原因

#505楼  回复 引用 查看   

2009-02-23 16:53 by 四喜      
马克之,ths!

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

2009-02-23 17:39 by webabcd      
@四喜
:)
马克之是好习惯啊

#507楼  回复 引用   

2009-03-09 23:55 by Jake2009 [未注册用户]
"result".InnerHtml = s + "<br />";
这个说是当前个result“这个名称不存在呢???这个是为什么呢????

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

2009-03-10 07:31 by webabcd      
@Jake2009
。。。
当然不能是字符串.
而应该是对象.

#509楼  回复 引用   

2009-03-16 16:46 by 雪界冰河
非常感谢楼主,向你学习

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

2009-03-17 07:37 by webabcd      
@雪界冰河
:)
大家互相学习,共同提高

#511楼  回复 引用   

2009-05-14 15:43 by xmlys[未注册用户]
能否在不使用复选框的情况下单击某行(的任一部分)改变该行的样式?(使被点击的行突出显示)

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

2009-05-14 17:27 by webabcd      
@xmlys
这个控件实现不了。其实这个需求的话直接写js也不麻烦

#513楼  回复 引用   

2009-05-22 14:47 by DanieHung[未注册用户]
result.InnerHtml = s + "<br />";

请问上面这一行要怎麽改才能正常执行?
我一直卡在这一行

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

2009-05-22 17:12 by webabcd      
@DanieHung
。。。
没太明白是什么问题,能不能再说详细点?

#515楼  回复 引用 查看   

2009-05-26 17:35 by 小狼狗      
mark

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

2009-05-27 07:40 by webabcd      
@小狼狗
:)
mark是个好习惯

#517楼  回复 引用   

2009-05-27 15:05 by DanieHung[未注册用户]
@webabcd
我已经可以正常执行了
谢谢您

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

2009-05-27 18:10 by webabcd      
@DanieHung
:)
客气了,我应该是什么忙都没帮上,哈

#519楼  回复 引用   

2009-05-29 15:00 by DanieHung[未注册用户]
@webabcd
请问~采用fixrow的资源占用有办法改善吗?
因为我如果有很多笔资料又想fix栏位
可是画面就会变得非常慢
有没有比较好的方法使用呢?

#520楼  回复 引用   

2009-05-29 18:06 by DanieHung[未注册用户]
@webabcd
还有一个问题
就是如果用了fixrow的效果
会有scrollbar
但是当我把scrollbar往下移动之後按了submit的动作
scrollbar又会跑到最上面去了
有没有办法可以让它自动停在我上次停留的位置?
感激不尽!

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

2009-05-30 13:47 by webabcd      
@DanieHung
效率低是没办法的
因为用的是css+expression来实现的
建议别用了,这个到ie8就不支持了

滚动条的话,可以在postback前记下滚动条的位置并以其postback,然后render的时候,再根据此值设置滚动条的位置。可以参考一下alpha版,那个版本实现了这个功能

#522楼  回复 引用   

2009-07-01 16:46 by wumingxiaozu[未注册用户]
可不可以添加,拖动列宽的功能啊!!!!!!

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

2009-07-02 07:39 by webabcd      
@wumingxiaozu
我写的这个不行
不过记得有人实现过这个功能,可以google一下,应该有现成的控件

#524楼  回复 引用   

2009-07-11 15:37 by 第四道[未注册用户]
为什么列重复呢?

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

2009-07-13 07:51 by webabcd      
@第四道
为了演示水平滚动条的效果,所以多加了几列

#526楼  回复 引用   

2009-07-15 14:25 by 学海[未注册用户]
楼主好,我如果在这个控件中添加按钮,然后点击后转到另一个页面,这其中需要该行的某一个的值,我如何把这个值传到另一个页面中,谢谢!

#527楼  回复 引用   

2009-07-15 15:15 by 2[未注册用户]
1、在ASP.NET中,能不能实现GRIDVIEW所有的行都是在可编辑状态
2、上述编辑方式打开后,点击保存后,一次性定入数据
  如何实现这种类似的功能

  求思路

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

2009-07-15 15:26 by webabcd      
@学海
先设置好DataKeyNames属性
然后触发行的RowCommand事件
然后GridView的SelectedDataKey就是你设置的DataKeyNames
当然也可以用 CommandArgument传递参数
如果不需要服务端处理的话,也可以绑定的时候就写好对应的html

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

2009-07-15 15:27 by webabcd      
@2
用模板列,全配置成textbox或其他可用于编辑的控件
保存的时候,在服务端遍历GridView控件,取得对应的数据后再批量保存

#530楼  回复 引用   

2009-07-21 15:57 by 学海[未注册用户]
你好,再麻烦楼主一下,我在绑定的时候报错了,我想实现的就是简单的单击一个按钮就调到另个页面来 显示详细信息,我需要的是该条记录的id ,我该如何实现呢,谢谢

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

2009-07-22 07:25 by webabcd      
@学海
传参数啊
绑定gridview时,设置带参数的链接

#532楼  回复 引用 查看   

2009-09-02 14:09 by 四喜      
赞一个。

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

2009-09-02 17:53 by webabcd      
@四喜
:)
多谢支持

#534楼  回复 引用 查看   

2009-10-22 11:26 by 谢作祥      
很好很强大;但如果GridView绑定的是DataTable或者IList数据源,而不是ObjectDataSource,好像用不了啊?

#535楼  回复 引用 查看   

2009-10-22 12:02 by 谢作祥      
比如在页面加载的时候将GridView的DataSource绑定在以下一个Table上:
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("age", typeof(int));
dt.Columns.Add("salary", typeof(int));

DataRow row = dt.NewRow();
row["id"] = 1;
row["name"] = "Test1";
row["age"] = 23;
row["salary"] = 6500;

DataRow row2 = dt.NewRow();
row2["ID"] = 1;
row2["Name"] = "Test1";
row2["Age"] = 23;
row2["salary"] = 6500;

dt.Rows.Add(row);
dt.Rows.Add(row2);

this.sgv1.DataSource = dt;
this.sgv1.DataBind();

this.sgv2.DataSource = dt;
this.sgv2.DataBind();

这样连排序都不支持了

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

2009-10-22 17:19 by webabcd      
@谢作祥
需要自动分页,排序的话需要使用数据源控件

#537楼  回复 引用   

2009-11-03 17:27 by scate[未注册用户]
我是VS2008 在FW2.0下,一个在updatepanel 里放一个div,再放一个table,table里包smartgridview,把空间拖到页面上后,代码页没有东西生成,在“属性页”改ID,加事件什么的,加完之后代码页也还是没有东西,同时再拖一个进页面就会出现同ID的错误,不在updatepanel里则没有问题

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

2009-11-04 08:37 by webabcd      
@scate
。。。
不好意思,我也不知道,好久好久好久没弄过这个了,生疏了啊

#539楼  回复 引用   

2009-11-09 10:53 by scate[未注册用户]
@webabcd
T_T

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

2009-11-09 13:05 by webabcd      
@scate
啥意思???

#541楼  回复 引用   

2009-11-11 12:25 by scate[未注册用户]
@webabcd
就是泪目的意思

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

2009-11-11 12:38 by webabcd      
@scate
:)
晕,不承认不行,确实out了

另外,建议以后别用我写的这个控件了,因为我不打算再更新它了

#543楼  回复 引用 查看   

2010-03-06 10:02 by 方路      
>>我是VS2008 在FW2.0下,一个在updatepanel 里放一个div,...在“属性页”改ID,加事件什么的,加完之后代码页也还是没有东西...不在updatepanel里则没有问题

vs2005没问题,vs2008有问题。且我安装了vs2008-sp1。

#544楼  回复 引用 查看   

2010-03-06 10:05 by 方路      
在updatepanel中保存不了属性,
不仅是SmartGridView,
连其继主GridView都是这样的。

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

2010-03-08 08:30 by webabcd      
@方路
“在updatepanel中保存不了属性”?
这个至少GridView是肯定没问题的

#546楼  回复 引用 查看   

2010-03-08 08:35 by 方路      
@楼主

比如:我在设计界面中给GridView1加了几个字段,但源界面里面不会同步更新。
在vs2005中正常,vs2008打了sp1。
<form id="form1" runat="server">
    <div>
            <yyc:SmartGridView ID="sgvList" runat='server' AllowPaging="True" 
                AllowSorting="True" AutoGenerateColumns="False"> <!--此处OK, 跟着属性编辑器变了 -->
                <Columns>
                    <asp:BoundField />
                    <asp:BoundField />
                    <asp:BoundField />
                </Columns>
                <PagerSettings Mode="NumericFirstLast" PageButtonCount="5" Position="Top" />
            </yyc:SmartGridView>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <yyc:SmartGridView ID="SmartGridView1" runat='server'> <!--此处不会跟着属性编辑器变-->
            </yyc:SmartGridView>
            <asp:GridView ID="GridView1" runat="server"> <!--此处不会跟着属性编辑器变 -->
            </asp:GridView>

        <table width="100%" border="1">
            <tr>
                <td>

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

2010-03-08 12:19 by webabcd      
@方路
如果是这样的话,就只能认定是IDE的bug了
建议,直接在“源”视图编码

#548楼  回复 引用 查看   

2010-03-08 12:26 by 方路      
嗯,应该是IDE的bug。
奇怪的是,只有#537楼的scate一样见到此问题?难道很少人用ajax?

现在把SmartGridView放到updatepanel外面了。
当然也可以在外面编辑好再剪到里边,只是修改的时候剪来剪去很麻烦。

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

2010-03-08 13:11 by webabcd      
@方路
呵呵,我原来倒是挺常用的
不过只在“源”视图里写代码,基本不会在“设计”视图里开发

#550楼  回复 引用 查看   

2010-03-17 14:21 by AnsonChen      
你这个自定义控件是不是一定要在WEB.CONFIG里面定义皮肤的呀?如果在那里定义的话,会导致整个项目都会用这个皮肤的,但如果不在WEB.CONFIG里面定义的话,那个控件会出错.

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

2010-03-18 08:07 by webabcd      
@AnsonChen
当然是可以不用的
主题就是设置样式而已,和控件没有什么依赖关系的

#552楼  回复 引用 查看   

2010-06-09 18:05 by 方路      
今天想导出 YYGrid 中的数据到Excel中,用了这么久现在才发现有正式版与Alpha版之分,我说怎么 headertemplate.btnExportToExcel 没效果哩,正式版只能用 div.btnExcel,而要用此按钮必需设置 EnableViewState="false",偏偏我用的是:


<asp:ObjectDataSource ID="dsList" runat="server" OldValuesParameterFormatString="original_{0}"
OnSelecting="dsList_Selecting" SelectMethod="GetListByCode" TypeName="myBll">
<SelectParameters>
<asp:Parameter Name="sCode" Type="String" />
</SelectParameters>
////////////////////////////////////////
protected void dsList_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
e.InputParameters["sCode"] = this.Code; //from ViewState
}
////////////////////////////////////////
public string Code
{
get
{
if (this.ViewState["Code"] == null) return "";
return this.ViewState["Code"].ToString();
}
set
{
this.ViewState["Code"] = value;
}
}

#553楼  回复 引用 查看   

2010-06-09 19:27 by 方路      
只要把EnableViewState设为true,就会提示数据源不是DataTable/DataSet,我的数据源明明是DataTable,后来仿照demo在类前加[DataObject]、在方法前加[DataObjectMethod(DataObjectMethodType.Select, true)]问题依旧,后来试改了demo的EnableViewState也提示这个问题:


Server Error in '/YYC' Application.
--------------------------------------------
若要导出SmartGridView,应保证其数据源为DataTable或DataSet类型
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidCastException: 若要导出SmartGridView,应保证其数据源为DataTable或DataSet类型
Source Error:
Line 114: dt = ((DataSet)this._dataSourceObject).Tables[0];
Line 115: else
Line 116: throw new InvalidCastException("若要导出SmartGridView,应保证其数据源为DataTable或DataSet类型");
Line 117:
Line 118: if (dt == null)

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

2010-06-10 08:03 by webabcd      
@方路
嗯。。。
抱歉,这个控件已经停止维护了

如果有问题的话,只能靠自己调试了,源代码都有的

#555楼  回复 引用 查看   

2010-06-10 09:51 by 方路      
@webabcd
调试时发现是启用了 ViewState 的话 this._dataSourceObject 就是null,没启用的话就是正常的(aDataTable)。我不清楚这个与ViewState有什么关系。

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

2010-06-10 13:09 by webabcd      
@方路
看了一下源代码,这部分是这么写的
/// <summary>
/// OnLoad
/// </summary>
/// <param name="e"></param>
protected override void OnLoad(EventArgs e)
{
if (this._dataSourceObject == null)
{
_dataSourceObject = this.DataSource;
}

base.OnLoad(e);
}
我猜测,有了ViewState的话,不再重新绑定,所以DataSource就是null了

#557楼  回复 引用 查看   

2010-06-10 20:12 by 方路      
现在把 SmartGridViewAlpha 中的导出Excel相关代码搬到正式版中了。两个版本都有不足:一个是取数据源中的内容,也就是说我不需要显示、导出的字段也导出来了;另一个取的是网页(网格)表面的内容,在分页的情况下只能一页一页地导。
看了网格的字段定义,网格的各个列分别对应数据源中的哪个字段是且根本是取不到的,因为有的是绑定列、有的是模板列,模板列变化万千,是不可能有对应字段名的。

protected override void OnRowCommand(GridViewCommandEventArgs e)
	{
	    if (e.CommandName.ToLower() == "exporttoexcel")
	    {
		//Page.RegisterStartupScript("aaa", "<script language='javascript'>alert('aaa');</script>");

	    }

	    #region 导出为Excel
	    if (e.CommandName.ToLower() == "exporttoexcel")
	    {
		System.Web.HttpContext.Current.Response.ClearContent();
		// e.CommandArgument用“;”隔开两部分,左边的部分为导出Excel的文件名称
		System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + e.CommandArgument.ToString().Split(';')[0] + ".xls");
		System.Web.HttpContext.Current.Response.ContentType = "application/excel";

		System.IO.StringWriter sw = new System.IO.StringWriter();
		HtmlTextWriter htw = new HtmlTextWriter(sw);

		// e.CommandArgument用“;”隔开两部分,右边的部分为需要隐藏的列的索引(列索引用“,”分开)
		if (e.CommandArgument.ToString().Split(';').Length > 1)
		{
		    foreach (string s in e.CommandArgument.ToString().Split(';')[1].Split(','))
		    {
			int i;

			if (!Int32.TryParse(s, out i))
			{
			    throw new ArgumentException("需要隐藏的列的索引不是整数");
			}

			if (i > this.Columns.Count)
			{
			    throw new ArgumentOutOfRangeException("需要隐藏的列的索引超出范围");
			}

			this.Columns[i].Visible = false;
		    }
		}

		// 隐藏“导出Excel”按钮
		((Control)e.CommandSource).Visible = false;

		// 如果HeaderRow里的控件是button的话,则把它替换成文本
		foreach (TableCell tc in this.HeaderRow.Cells)
		{
		    // TableCell里的每个Control
		    foreach (Control c in tc.Controls)
		    {
			// 如果控件继承自接口IButtonControl
			if (c.GetType().GetInterface("IButtonControl") != null && c.GetType().GetInterface("IButtonControl").Equals(typeof(IButtonControl)))
			{
			    // 如果该控件不是“导出Excel”按钮则把button转换成文本
			    if (!c.Equals(e.CommandSource))
			    {
				tc.Controls.Clear();
				tc.Text = ((IButtonControl)c).Text;
			    }
			}
		    }
		}
		for (int i = 0; i < this.Rows.Count; i++)
		{
		    foreach (TableCell tc in this.Rows[i].Cells)
		    {
			foreach (Control c in tc.Controls)
			{
			    if (c is Button)
			    {
				tc.Controls.Clear();
				tc.Text = (c as Button).Text;
			    } //else
			    if (c is CheckBox)
			    {
				tc.Controls.Clear();
				tc.Text = (c as CheckBox).Checked ? "1" : "0";
			    }
			    if (c is ImageButton)
			    {
				tc.Controls.Clear();
			    }
			    if (c is TextBox)
			    {
				tc.Controls.Clear();
				tc.Text = (c as TextBox).Text;
			    }
			    if (c is DropDownList)
			    {
				tc.Controls.Clear();
				tc.Text = (c as DropDownList).Text;
			    }
			}
		    }
		}

		// 将服务器控件的内容输出到所提供的 System.Web.UI.HtmlTextWriter 对象中
		this.RenderControl(htw);

		System.Web.HttpContext.Current.Response.Write(sw.ToString());
		System.Web.HttpContext.Current.Response.End();
	    }
	    #endregion

	    base.OnRowCommand(e);
	}

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

2010-06-11 08:13 by webabcd      
@方路
可以直接调用以下这几个方法
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)

#559楼  回复 引用 查看   

2010-06-11 09:22 by 方路      
@webabcd
谢谢,这个控件做得真够细的 :)
用数据源导出的话,也只能这样硬写字段了。

像我们搞数据开发的,网格是最最重要的控件,对于网格我们最需要的就是 显示数据源中的数据(废话)、过滤、分页、排序、导出,这个网格基本上的功能都实现了。


Export类中,觉得C#中方法的多态给程序员们添了不少麻烦,看到你写的文章讲 .net4 改进了参数的定义,允许默认值、允许在调用时调整参数顺序,这功能可以让代码清晰多了,只可惜我们仍然停留在vs2008下。

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

2010-06-11 12:32 by webabcd      
@方路
:)
可以网上找找,比我写的好的网格控件有很多的

嗯,vs2008往vs2010迁移还是挺简单的

#561楼  回复 引用 查看   

2010-11-12 19:45 by MarkWq      
mark

#562楼  回复 引用 查看   

2010-11-13 18:25 by bossky      
mark

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

2010-11-15 08:03 by webabcd      
@MarkWq
@bossky
:)
多谢支持

#564楼  回复 引用 查看   

2011-05-31 09:56 by frank666      
yycontrols 的GRIDVIEW在ie9.0不能固定表头及指定行或指定列

#565楼  回复 引用 查看   

2011-05-31 09:57 by frank666      
YYControls中的GRIDVIEW在ie9.0不能固定表头及指定行或指定列,请发布修正新版本.

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

2011-05-31 12:05 by webabcd      
@frank666
这个控件不再更新了,因为有很多好得多的选择
推荐用jqGrid

#567楼  回复 引用 查看   

2011-06-10 15:06 by GossZhang      
怎么右键时获取Gridview当前点击的列号呢?
求专家给个解吧

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

2011-06-11 11:23 by webabcd      
@GossZhang
:)
在RowDataBound里把行索引赋值给相关脚本,或者纯在js中判断tr在table中的索引,或者转用其他控件
我的这个不再维护了,因为比我写的好的Grid控件太多了

#569楼  回复 引用 查看   

2011-08-15 13:58 by 落忆无痕      
楼主你好啊.我照着你的源码,重新自己试着写了一下
在这一段中,
void LamGridView_PreRender(object sender, EventArgs e)
{
if (!this.Page.ClientScript.IsClientScriptIncludeRegistered(this.GetType(), "yy_sgv_ScriptLibrary"))
{
//注册所需脚本
this.Page.ClientScript.RegisterClientScriptInclude
(
this.GetType(),
"yy_sgv_ScriptLibrary",
ResolveClientUrl
(
this.GetType(), "LamControl.ScriptLibrary.js"
)
);

.不知为何.JS文件总是没有加载成功.
在鼠标经过行时,行变色的JS事件都是不存在
不知道楼主能否提点一点思路.已琢磨三天了...百思不解啊

#570楼  回复 引用 查看   

2011-08-15 16:29 by 落忆无痕      
已解决了.多有打扰

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

2011-08-15 17:28 by webabcd      
@落忆无痕
:)
不打扰,解决了就好

#572楼  回复 引用 查看   

2011-10-22 23:15 by 一一一      
LZ太强大了。。。拜膜下。
能不能导出excel表以后进行分组合并项。
如图:

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

2011-10-24 08:11 by webabcd      
@一一一
我这个导出实际上就是导出csv,不能是实现这样的

#574楼  回复 引用   

2012-02-02 17:45 by dfsr2dsfds[未注册用户]
ffdfdsdsfds

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

2012-02-02 17:54 by webabcd      
@dfsr2dsfds
???什么意思???
评论共6页: 上一页 1 2 3 4 5 6 
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

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

0 639830 4cJTc/cUCTQ=