扩展GridView控件(索引) - 增加多个常用功能

来源:互联网 发布:知乎 巅峰科比 编辑:程序博客网 时间:2024/05/29 23:22

文章索引
扩展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)

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
[源码下载]
.pager { text-align:right;}
评论共2页: 1 2 下一页 

Feedback

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

2007-02-13 13:48 by webabcd
@net
:)

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

2007-02-13 14:55 by webabcd
听取了Wyssoft的建议
增加了“是否保持滚动条的状态”的功能

文章已经更新,源码晚上传

#3楼 [TrackBack]   回复  引用  查看    

2007-02-23 10:24 by 胡立新
[引用提示]胡立新引用了该文章, 地址: http://www.cnblogs.com/hulixin08/archive/2007/02/23/654063.html

#4楼    回复  引用  查看    

2007-02-25 10:01 by 小庄
发现bug:
1,跳到最后一页,全选执行成功,但页面左下角提示脚本错误。
2,然后再转到其它页,全选功能不正常(只选择了最后一页的记录数)。
建议:
我的数据是用存储过程实现分页的(nettires生成的getpaged方法),gridview认为它只有一页,怎么用你的分页样式呢?
我现在的方法是自己单独做的分页控件,不太美观。
iamxiaozhuang@hotmail.com 欢迎讨论。

#5楼    回复  引用  查看    

2007-02-25 11:39 by 老夫子系
我做了一个测试界面,一个保存按钮,一个SmartGridView,先点复选框选择几行,然后点击保存按钮,将选择行的ID保存到数据库中。可是在保存事件中,怎么获取选择行的ID。为什么点击保存按钮后,会报错!

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

2007-02-25 13:25 by webabcd
@小庄
找到原因了,RowDataBound事件会被执行两次,索引给隐藏字段赋值的时候就会有问题,想破脑袋也不知道RowDataBound事件为什么会被执行两次。想明白后我再把解决办法贴出来

至于分页样式,我的那个只是改写原来GirdView的分页样式而已,如果用存储过程分页的话,我那个肯定只认为有一页的。
我觉得如果要用存储过程分页的话,肯定是要写一个单独的分页控件的

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

2007-02-25 13:28 by webabcd
@老夫子系
获取选中行的ID就是查看哪个行的复选框被选中了,然后读出这个行的关键字就ok了

#8楼    回复  引用  查看    

2007-02-27 10:05 by Wyssoft
@webabcd
支持你所做出的努力.
刚放完假,测了一下你的新版本.不过,跟我的想象还有点差别.主要是刷新问题,滚动条是可以保持相对位置了,但想避免刷新.我试用一个UpdatePanel套进去,结果滚动条保持不了位置了.

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

2007-02-27 11:39 by webabcd
@Wyssoft
那个需要在updatepanel中注册js,做在控件里不方便,有时间了我会贴出一个解决办法的

#10楼    回复  引用  查看    

2007-02-28 14:51 by 孤叶(学习.net框架)
FireFox好像有的功能不支持,你的这个控件.

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

2007-02-28 16:07 by webabcd
@孤叶(学习.net框架)
确实,我的js水平不够啊,无法为ff写与其适用应的js

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

2007-03-01 22:21 by webabcd
更新列表1
@小庄 发现的bug描述如下
1,跳到最后一页,全选执行成功,但页面左下角提示脚本错误。
2,然后再转到其它页,全选功能不正常(只选择了最后一页的记录数)。

原因
执行分页或者排序事件之类的,重写的RowDataBound事件会执行两次,第一次DataBound老数据,第二次DataBound新数据;重写的PreRender会执行一次(老数据),而其中调用基类的方法base.OnPreRender(e)会执行两次

为什么会出这样?
不知道

解决办法
数据源的Select事件只会执行一次,并且执行之后会RowDataBound新数据,所以,如果设置一个变量来确保只有数据源的Select事件之后才RowDataBound就ok了
把重写的PreRender换为在GridView的构造函数中增加GridView的事件委托,则没有上述问题

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

2007-03-01 22:27 by webabcd
更新列表2
@Wyssoft 提出的问题
如果固定行、列的话刷新后,滚动条是可以保持相对位置了,但想避免刷新。我试用一个UpdatePanel套进去,结果滚动条保持不了位置了。

原因
我的代码是用Page来注册客户端代码的,用了asp.net ajax要用ScriptManager来注册客户端代码

解决办法
暴露两个只可访问的公共属性
ScrollX和ScrollY
在页面的代码中如下注册客户端代码即可
ScriptManager.RegisterStartupScript(UpdatePanel1, typeof(UpdatePanel), "js", "document.getElementById('yy_ScrollDiv').scrollLeft=" + SmartGridView1.ScrollX + ";document.getElementById('yy_ScrollDiv').scrollTop=" + SmartGridView1.ScrollY + ";", true);

#14楼    回复  引用  查看    

2007-03-02 09:26 by Wyssoft
@webabcd
不知道是不是跟UpdatePanel有关,在设计模式下老死掉.

ScriptManager.RegisterStartupScript(UpdatePanel1, typeof(UpdatePanel), "js", "document.getElementById('yy_ScrollDiv').scrollLeft=" + SmartGridView1.ScrollX + ";document.getElementById('yy_ScrollDiv').scrollTop=" + SmartGridView1.ScrollY + ";", true);

这段代码应该放在页面中哪个位置比较合适呢?

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

2007-03-02 10:39 by webabcd
@Wyssoft
如果使用了固定行、列的功能后就会出现这种现象

那段代码可以加到Page_Load里

#16楼    回复  引用  查看    

2007-03-05 09:15 by Wyssoft
@webabcd
为什么会是这样,有没有办法解决呢.我记得以前的版本好像没有吧.
滚动条位置好像可以借助MaintainScrollPositionOnPostback这个属性解决.
你试试,我这没法调了.

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

2007-03-05 10:13 by webabcd
@Wyssoft
MaintainScrollPositionOnPostback这个属性是相对于浏览器的,我的那个是相对于GridView所在的DIV的,不能借用啊

另外,可能会死掉是因为固定了行、列的原因,因为行、列都有可能固定,所以我在每个单元格都用css调js实现这个功能,比较耗cpu,所以有可能会死掉

还有一种用div冻结行、列的实现方法,但是集成到GridView里超麻烦,所以放弃了

#18楼    回复  引用  查看    

2007-03-09 08:53 by Wyssoft
@webabcd
我决得那个耗cpu问题,真是个很大的问题.应该考虑考虑

#19楼    回复  引用  查看    

2007-03-09 10:13 by Wyssoft
刚发现 用SqlDataSource作数据源,标题不能初固定.是怎么回事.

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

2007-03-09 12:39 by webabcd
@Wyssoft
确实,冻结行、列后耗cpu问题同时也出现在客户端显示的时候,但以我现在的水平也确实没什么好的解决办法。如果在设计模式中会死掉,那就用在HTML模式下写代码吧。或者先不加冻结行、列的功能,等都设计得差不多了,再在HTML模式下把冻结行、列的功能加上

我没用SqlDataSource数据源做过测试,实际上我从来都没用过SqlDataSource,它会破坏项目中的层次结构,建议兄弟实际开发中也别用它。

#21楼    回复  引用  查看    

2007-03-15 16:07 by wyz
东西确实很好用,但是有一点在开发的时候,预览这个控件的属性时候经常CPU不够用

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

2007-03-15 20:27 by webabcd
@wyz
这是因为使用了固定行、列功能的原因,因为行、列都有可能固定,所以我在每个单元格都用css调js实现这个功能,比较耗cpu

#23楼    回复  引用  查看    

2007-03-16 13:28 by Wyssoft
@webabcd
在ItemTemplate里加一个DropDownList,结果DropDownList跑到固定行的上面进行移动

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

2007-03-16 15:13 by webabcd
@Wyssoft
这是IE的BUG,就是当层遇到下拉框时总是挡不了select框

#25楼    回复  引用  查看    

2007-03-19 09:30 by FrankFei
我在针对SmartGridView编程时,
SmartGridView1 = new SmartGridView();
SmartGridView1.RowCommand += new GridViewCommandEventHandler(SmartGridView1_RowCommand);在运行时就是不响应,而如果把SmartGridView中的protected override void OnRowDataBound(GridViewRowEventArgs e)拿掉就可以了,这是为什么呢?

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

2007-03-19 10:16 by webabcd
@FrankFei
我试了一下,没问题啊

protected void Page_Load(object sender, EventArgs e)
{
SmartGridView1.RowCommand += new GridViewCommandEventHandler(SmartGridView2_RowCommand);
}

protected void SmartGridView2_RowCommand(object sender, GridViewCommandEventArgs e)
{

}

#27楼    回复  引用  查看    

2007-03-19 11:18 by FrankFei
可是我测试下来确实是这样的,下面为源码,能否帮忙看看,谢谢!

public partial class Default3 : System.Web.UI.Page
{
private SmartGridView smartGridView;
protected void Page_Load(object sender, EventArgs e)
{
string connectionString = "Data Source=dev;User ID=user;Password=pw";
OracleDatabase oracleDatabase = new OracleDatabase(connectionString);
OracleCommand oracleCommand = new OracleCommand();
oracleCommand.CommandType = CommandType.Text;
oracleCommand.CommandText = "select * from hr_absence_type";
DataSet dataSet = oracleDatabase.ExecuteDataSet(oracleCommand);

BoundField absenceTypeId = new BoundField();
absenceTypeId.DataField = "absence_type_id";
absenceTypeId.HeaderText = "假别ID";
BoundField absenceCode = new BoundField();
absenceCode.DataField = "absence_code";
absenceCode.HeaderText = "假别代号";
BoundField absenceName = new BoundField();
absenceName.DataField = "absence_name";
absenceName.HeaderText = "假别名称";

TemplateField dataItemIndex = new TemplateField();
GridViewItemTemplate gridViewItemTemplate = new GridViewItemTemplate();
dataItemIndex.ItemTemplate = gridViewItemTemplate;

SmartGridView1 = new SmartGridView();
SmartGridView1.RowCommand += new GridViewCommandEventHandler(SmartGridView1_RowCommand);

SmartGridView1.AutoGenerateColumns = false;
SmartGridView1.Columns.Add(absenceTypeId);
SmartGridView1.Columns.Add(absenceCode);
SmartGridView1.Columns.Add(absenceName);
SmartGridView1.Columns.Add(dataItemIndex);
SmartGridView1.ApplyStyleSheetSkin(this);

SmartGridView1.DataSource = dataSet;
SmartGridView1.DataBind();
Control form = this.FindControl("form1");
form.Controls.Add(SmartGridView1);
}
protected void SmartGridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
this.TextBox1.Text = "第" + (Convert.ToInt32(e.CommandArgument)).ToString() + "行 ";
}
public SmartGridView SmartGridView1
{
get
{
return smartGridView;
}
set
{
smartGridView = value;
}
}

}
class GridViewItemTemplate : ITemplate
{
public GridViewItemTemplate()
{
}

public void InstantiateIn(Control container)
{
Button button = new Button();
button.ID = "btnRightMenuButton";
button.CommandName = "RightMenuButton";
button.DataBinding += new EventHandler(this.OnDataBinding);

container.Controls.Add(button);
}

public void OnDataBinding(object sender, EventArgs e)
{
Button button = (Button)sender;
GridViewRow gridViewRow = (GridViewRow)button.NamingContainer;
button.CommandArgument = gridViewRow.Cells[0].Text.ToString();
}
}

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

2007-03-19 11:44 by webabcd
@FrankFei
诡异了,我试了一下这个,是可以执行SmartGridView1_RowCommand的

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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.Data.SqlClient;

using YYControls.SmartGridView;

public partial class Default2 : System.Web.UI.Page
{
private SmartGridView smartGridView;
protected void Page_Load(object sender, EventArgs e)
{
string connectionString = "data source=.;database=Test;User ID=sa;Password=sa";
SqlDataAdapter cmd = new SqlDataAdapter("select * from testtable", connectionString);
DataSet dataSet = new DataSet();
cmd.Fill(dataSet);
cmd.Dispose();

BoundField absenceTypeId = new BoundField();
absenceTypeId.DataField = "name";
absenceTypeId.HeaderText = "name";

TemplateField dataItemIndex = new TemplateField();
GridViewItemTemplate gridViewItemTemplate = new GridViewItemTemplate();
dataItemIndex.ItemTemplate = gridViewItemTemplate;

SmartGridView1 = new SmartGridView();
SmartGridView1.RowCommand += new GridViewCommandEventHandler(SmartGridView1_RowCommand);

SmartGridView1.AutoGenerateColumns = false;
SmartGridView1.Columns.Add(absenceTypeId);
SmartGridView1.Columns.Add(dataItemIndex);
SmartGridView1.ApplyStyleSheetSkin(this);

SmartGridView1.DataSource = dataSet;
SmartGridView1.DataBind();
Control form = this.FindControl("form1");
form.Controls.Add(SmartGridView1);
}
protected void SmartGridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
Response.Write("dafds");
}
public SmartGridView SmartGridView1
{
get
{
return smartGridView;
}
set
{
smartGridView = value;
}
}

}

class GridViewItemTemplate : ITemplate
{
public GridViewItemTemplate()
{
}

public void InstantiateIn(Control container)
{
Button button = new Button();
button.ID = "btnRightMenuButton";
button.CommandName = "RightMenuButton";
button.DataBinding += new EventHandler(this.OnDataBinding);

container.Controls.Add(button);
}

public void OnDataBinding(object sender, EventArgs e)
{
Button button = (Button)sender;
GridViewRow gridViewRow = (GridViewRow)button.NamingContainer;
button.CommandArgument = gridViewRow.Cells[0].Text.ToString();
}
}

#29楼    回复  引用  查看    

2007-03-19 14:02 by FrankFei
兄弟,你有点生成后界面上的button,然后有调用如下的内容啊?protected void SmartGridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{

}

太奇怪了!会不会是VS2005的BUG?
但是我把上面的SmartGridView改为GridView,又是好的,奇怪!




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

2007-03-19 15:28 by webabcd
@FrankFei
经验告诉我,这应该不是VS2005的BUG
我只是把你的程序读数据库的部分改成了sqlserver的,删了几个列

然后按了按钮后会执行这句
protected void SmartGridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
Response.Write("dafds");
}

页面显示了dafds

#31楼    回复  引用  查看    

2007-03-19 16:51 by FrankFei
问题找到了,我把你控件中OnRowDataBound的第一行的那个return不小心删除了。只是还不理解真正的原因。
再次感谢你的热心!
向你学习!

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

2007-03-19 18:10 by webabcd
@FrankFei
我加那句是为了避免下面情况的发生

执行分页或者排序事件之类的,重写的RowDataBound事件会执行两次,第一次DataBound老数据,第二次DataBound新数据;重写的PreRender会执行一次(老数据),而其中调用基类的方法base.OnPreRender(e)会执行两次

实在是不知道为什么会出现这种情况,所以加了那句避免这种情况

大家互相学习,共同提高

#33楼 [TrackBack]   回复  引用  查看    

2007-03-20 15:03 by MrYoung
http://www.cnblogs.com/webabcd/archive/2007/02/04/639830.html
[引用提示]MrYoung引用了该文章, 地址: http://www.cnblogs.com/MatrixMaker/archive/2007/03/20/681214.html

#34楼    回复  引用  查看    

2007-03-22 09:23 by kiler
这个一个页面使用两个同样的控件的话,有些功能会失效,如checkbox全选,以及保持滚动条的位置,导出excel。

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

2007-03-22 11:54 by webabcd
@kiler
大问题啊,我压根就没想过这个问题,失败

改起来太麻烦,决定不改了,毕竟一个页面有两个或更多GridView的需求不多见啊

#36楼    回复  引用  查看    

2007-03-22 16:35 by kiler
也不是很麻烦,调整一下ID和注册脚本的名称就可以了,我改的差不多了,等改好了,我再发回给你吧。

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

2007-03-22 17:02 by webabcd
@kiler
:)
感谢兄弟啊

我现在看着那些代码就头大,不明白当初为什么写的那么乱(答曰:水平不够)

#38楼    回复  引用  查看    

2007-03-23 08:41 by w
最好有如何进行合并单元格的程序标准

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

2007-03-23 13:01 by webabcd
@w
记得我原来做合并列上的单元格的时候是写一个方法,把GridView和需要合并的列的索引作为参数传进去,如何合并都是在那个方法里写的,所以我觉得可以写个utility来实现它,因此就没扩展GridView的这个功能

#40楼    回复  引用  查看    

2007-03-27 13:56 by zhlmxh
这个控件根本没法用,在设计时CPU狂占100%, 根本没往下进行!

#41楼    回复  引用  查看    

2007-03-27 13:57 by zhlmxh
这个控件根本没法用,在设计时CPU狂占100%, 根本没法往下进行!

#42楼    回复  引用  查看    

2007-03-27 15:14 by zhoupeng
可能是你没用好吧, 我也碰到这个问题, 不过我去掉一些功能就可以了, 像固定列表头, 没什么用的, 用自己需要的功能就可以了

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

2007-03-27 16:12 by webabcd
@zhlmxh
正如“zhoupeng”所说,把固定行、列的功能去掉后就ok了
因为固定行、列的功能使用了css调javascript表达式的方式控制层的高度,在设计模式的时候就会狂刷界面,所以很占cpu

#44楼    回复  引用  查看    

2007-03-29 11:16 by 慕名而来
俺是菜鸟 前来学习

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

2007-03-29 17:31 by webabcd
@慕名而来
:)
大家互相学习

#46楼    回复  引用  查看    

2007-03-29 17:58 by FrankFei
兄弟,请教您一个问题,如何在OnRowUpdating中获得GridView中所绑定的列名(即table中对应的字段),先谢谢了!

PS:
列值可以用((TextBox)this.Rows[e.RowIndex].Cells[0].Controls[0]).Text获得。

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

2007-03-29 22:26 by webabcd
@FrankFei
以绑定列为例

((BoundField)GridView.Columns[index]).DataField

#48楼    回复  引用  查看    

2007-03-30 12:58 by FrankFei
谢谢webabcd兄。

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

2007-03-30 21:32 by webabcd
@FrankFei
:)
不谢,大家多交流

#50楼    回复  引用  查看    

2007-04-04 14:54 by wwei
你真是太有才了.

#51楼    回复  引用  查看    

2007-04-04 14:55 by Bruse
问一下怎么让右键菜单直接执行一个JS函数而不要进行页面刷新

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

2007-04-04 16:31 by webabcd
@wwei
还是有待提高啊

#53楼    回复  引用  查看    

2007-04-04 16:35 by Bruse
等不及Webabcd兄弟给出答案了,自己改了一下SmartGrid的源代码,给右键菜单添加了一种菜单类型叫Script,为了回报Webabcd兄弟,把修改的方式贴上来:
SmartGridView.cs的516行开始
#region 给数据行增加右键菜单
if (ContextMenus.Count > 0)
{
StringBuilder sb = new StringBuilder();
foreach (ContextMenu cm in ContextMenus)
{
// item = new contextItem("", "", "", "", "", "", "");
// 1-菜单项的文本
// 2-图标链接
// 3-所调用的命令按钮的ID
// 4-链接地址
// 5-链接的target
// 6-右键菜单的项的类别
// 7-右键菜单对应的客户端脚本函数名称

// 命令按钮
if (cm.ItemType == ContextMenu.ItemTypeCollection.Command)
{
sb.Append("item = new contextItem(/"" + cm.Text +
"/", /"" + ResolveUrl(cm.Icon) + "/", /"" +
cm.CommandButtonId + "/", /"/", /"/", /"Command/",/"/");");
}
// 链接
else if (cm.ItemType == ContextMenu.ItemTypeCollection.Link)
{
sb.Append("item = new contextItem(/"" + cm.Text +
"/", /"" + ResolveUrl(cm.Icon) + "/", /"/", /"" +
cm.NavigateUrl + "/", /"" +
cm.Target + "/", /"Link/",/"/");");
}
// 分隔线
else if (cm.ItemType == ContextMenu.ItemTypeCollection.Separator)
{
sb.Append("item = new contextItem(/"/", /"/", /"/", /"/", /"/", /"Separator/",/"/");");
}
// 客户端脚本
else if (cm.ItemType == ContextMenu.ItemTypeCollection.Script)
{
sb.Append("item = new contextItem(/"" + cm.Text +
"/", /"" + ResolveUrl(cm.Icon) + "/", /"/", /"/", /"/", /"Script/",/"" + cm.ScriptFunction + "/");");
}

sb.Append("myMenu.addItem(item);");
}

// 注册客户端代码
if (!Page.ClientScript.IsClientScriptBlockRegistered("jsContextMenu"))
{
Page.ClientScript.RegisterClientScriptBlock(
this.GetType(),
"jsContextMenu", JavaScriptConstant.jsContextMenu.Replace("[$MakeMenu$]", sb.ToString())
);
}
}
#endregion

#54楼    回复  引用  查看    

2007-04-04 16:35 by Bruse
在ContextMenu.cs中增加两个属性
1.增加temType
/// <summary>
/// 右键菜单的项的类别
/// </summary>
public enum ItemTypeCollection
{
/// <summary>
/// 链接
/// </summary>
Link,
/// <summary>
/// 按钮
/// </summary>
Command,
/// <summary>
/// 分隔线
/// </summary>
Separator,
/// <summary>
/// 分隔线
/// </summary>
Script
}
2. 客户端脚本所对应的函数
private string _scriptFunction;
/// <summary>
/// 客户端脚本所对应的函数
/// </summary>
public string ScriptFunction
{
get { return _scriptFunction; }
set { _scriptFunction = value; }
}

#55楼    回复  引用  查看    

2007-04-04 16:36 by Bruse
在JavascriptConstant.cs文件中重写contextItem函数
function contextItem(text, icon, cmd, url, target, type, scriptfunction)
{
this.text = text ? text : '';
this.icon = icon ? icon : '';
this.cmd = cmd ? cmd : '';
this.url = url ? url : '';
this.target =target ? target : '';
this.type = type ? type : 'Link';
this.scriptfunction = scriptfunction ? scriptfunction : '';

this.show = function (oDoc)
{
var strShow = '';

if(this.type == 'Link' || this.type == 'Command' || this.type == 'Script')
{
strShow += ""<tr "";
strShow += ""onmouseover=/""changeStyle(this, 'on');/"" "";
strShow += ""onmouseout=/""changeStyle(this, 'out');/"" "";

if (this.type == 'Command')
{
// 右键菜单是按钮类型,调用所对应的按钮的click事件
strShow += ""onclick=/""document.getElementById("";
strShow += ""_rowClientId + "";
strShow += ""'_"";
strShow += this.cmd;
strShow += ""').click()"";
}
else if (this.type == 'Link')
{
// 右键菜单是链接类型
if (this.target == 'Top') this.target = 'top';
if (this.target == 'Self') this.target = 'self';

if (this.target == 'top' || this.target == 'self')
{
strShow += ""onclick=/"""";
strShow += this.target;
strShow += "".location='"";
strShow += this.url;
strShow += ""'"";
}
else
{
strShow += ""onclick=/""window.open('"";
strShow += this.url;
strShow += ""')"";
}
}
else
{
// 右键菜单是客户端脚本类型
strShow += ""onclick=/"""";
strShow += this.scriptfunction;
strShow += """";
}
strShow += ""/"">"";
strShow += ""<td class='ltdexit' width='16'>"";

if (this.icon == '')
{
strShow += '&nbsp;';
}
else
{
strShow += ""<img border='0' src='"";
strShow += this.icon;
strShow += ""' width='16' height='16' style='POSITION: relative'></img>"";
}

strShow += ""</td><td class='mtdexit'>"";
strShow += this.text;
strShow += ""</td><td class='rtdexit' width='5'>&nbsp;</td></tr>"";
}
// 右键菜单是分隔线
else if (this.type == 'Separator')
{
strShow += ""<tr><td class='ltdexit'>&nbsp;</td>"";
strShow += ""<td class='mtdexit' colspan='2'><hr color='#000000' size='1'></td></tr>"";
}

oDoc.write(strShow);
}
}

做完上面几步,你就可以在SmartGridView的ContextMenu里一下面的方式来添加一种新的右键菜单:
<ContextMenus>
<pc:ContextMenu ItemType="Script" Text="新建" ScriptFunction="NewTask(2)" Icon="../../App_Themes/Default/Images/Common/New.GIF" />
</ContextMenus>
 
更新列表3
感谢@Bruse提供右键菜单执行一个JS函数的实现,详细的是实现过程请看他的相关评论

我稍微修改了一下,具体实现请看源码
针对右键菜单增加的功能
ItemType - 右键菜单的项的类别增加“Custom”选项
Key - 自定义属性key
Value - 自定义属性value

示例
让右键菜单的某一选项弹出一个警告框
<ContextMenus>
<yyc:ContextMenu ItemType="Custom" Text="右键菜单自定义属性测试" Icon="~/Images/button.gif" Key="onclick" Value="alert('右键菜单自定义属性测试')" />
</ContextMenus>

#59楼    回复  引用  查看    

2007-04-05 00:22 by 臭石头
如何通过继承GridView来修改在设计时绑定数据源时自动生成的ASP.Net代码?

总所周知,当GridView帮定到一个数据源时,它会自动生成绑定列,这些列会写到aspx文件中。
现在我需要按照一定规则修改这些列的列头HeaderText。

我新建一个控件,继承自GridView。重写CreateColumns方法,然后遍历所有Columns并修改,成功,aspx设计界面上展现的也是修改后的字样,但切换到aspx源码,发现还是原来的。

问:有什么办法使得内存中属性的改变持久化到aspx文件中?

谢谢

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

2007-04-05 08:22 by webabcd
@臭石头
是把HeaderText硬编码了吗?
那它是不会在aspx源码中体现出来的

#61楼    回复  引用  查看    

2007-04-05 09:08 by 臭石头
具体情况是这样的,ObjectDataSource绑定到实体类,GridView帮定到ObjectDataSource,这时候,GridView会获取实体类的构架信息,并自动生成一些列,HeaderText就是实体类的属性名,是E文的,我现在想在GridView的CreateColumns方法中进行拦截这个生成过程,硬是把E文改为对应的中文。

结果,在设计时和运行时都可以看到是中文的,但是aspx中就不是中文的。
我就想问问,怎么样,才能让它在aspx中体现中文,GridView自身是怎么样把自动生成的列写入到aspx中的。

我已经把GridView以及几个基类的源码翻了好几遍了,我肯定,我已经把CreateColumns拦截到并修改成功了,但是,它从哪里得到英文HeaderText的BoundColumn写入到aspx中的?难道自动生成列的某些过程不需要调用CreateColumns?

#62楼    回复  引用  查看    

2007-04-05 09:09 by 臭石头
考虑到以后的非常多的修改可能都要“体现”在aspx中,我倒是很想弄清楚,控件中怎么样一些属性的改变“体现”在aspx中。

谢谢^_^

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

2007-04-05 12:42 by webabcd
@臭石头
据我所知
你是重写了他的CreateColumns方法,这不会在aspx源码中有所体现的
你要是增加一些自定义GridView属性,就可以在aspx源码出现

#64楼    回复  引用  查看    

2007-04-05 13:02 by 臭石头
我就想知道,GridView它自己是怎么做到的,它怎么生成BoundField的。这一点,我想它应该不是通过属性来实现的吧。

我这里收集了大量信息,但是尚未发现它是怎么写入到aspx中的,目前发现了一点眉头,但是因为项目太紧,暂时没时间研究下去。如果有兴趣,大家可以一起交流一下。我不仅把System.Web命名空间反编译了,还录下了控件在设计时的执行过程(哪个方法到哪个方法)。

我QQ:99363590
E_Mail:gxuhy at 21cn.com

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

2007-04-05 17:45 by webabcd
@臭石头

不过一般家里才上qq
公司时候msn
webabcd at hotmail.com
多交流

#66楼    回复  引用  查看    

2007-04-06 22:23 by Allen
发现一个问题,当我的数据源是空时,页面状态栏显示出错,详细信息是缺少对象,想应该是javascript函数抓取了空值对象的缘故,但偶的js比较菜,调了几次均没有成功,近崩溃中。
如我将objData的select() 返回的table改成空表或null
[DataObjectMethod(DataObjectMethodType.Select, false)]
public DataTable Select()
{
return null
//or
DataTable dt = new DataTable();
dt.Columns.Add("no", typeof(string));
dt.Columns.Add("name", typeof(string));
return dt;
}

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

2007-04-07 11:27 by webabcd
@Allen
是的

当初写代码的时候没有做对象为空的判断

比如全选CheckBox的那个功能,会用getElementById去找CheckBox
如果没有数据的话就找不到它
所以会报缺少对象的错误

#68楼    回复  引用  查看    

2007-04-07 11:38 by Allen
谢谢您的解答,那如果要改的话是否是将判断空的条件加到js里面去 还是在smartgridviewd 执行PreRender的时候去判断数据源对像是否为空?不过我觉得在PreRender里应该还抓不到它的datasource吧 请您赐教~ 谢谢~

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

2007-04-07 11:54 by webabcd
@Allen
当然,判断如果没有数据就不生成js脚本最好了
在PreRender之前,数据源的Selected事件里可以知道是否有数据

另外的办法就是在js里判断对象是否为空
对本例来说
就是把yy_GetObject(param)函数改成如下这样

function yy_GetObject(param)
{
if (document.getElementById(param))
return document.getElementById(param);
}

我已经改好上传了

谢谢提出bug

#70楼    回复  引用  查看    

2007-04-09 18:09 by shark0304
当把右键功能代码取消,点右键会出js错误,对象为空.
许多人需要用右键复制信息.所以还是改下比较好.

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

2007-04-09 20:47 by webabcd
@shark0304
bug多多啊
感谢兄弟提出来

出现这个问题的原因是,在没有使用右键功能的时候也注册了客户端脚本,加上一句判断就ok了

已经改好上传了

谢谢

#72楼    回复  引用  查看    

2007-04-10 21:10 by Rain
不是做技术的,看了还是有点害怕,感觉与时代差距太大了!不敢学了,看的越多发现知道的越少啊!悲哀

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

2007-04-10 21:57 by webabcd
@Rain
:)
大家社会分工不一样
在自己的工种上跟上时代就好了

#74楼    回复  引用  查看    

2007-04-11 10:00 by Rain
呵呵 因为想转到开发来 才在网上看些资料 想找用户角色权限这块参考 就链接到你这来了 能不能发个请求:有无用户角色权限这方面的数据库(sqlserver2000)设计和.net代码 传给我一份,没写过项目,先只能尽量参考兼抄袭代码了 呵呵
99linsen@163.com
QQ:10204074

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

2007-04-11 11:43 by webabcd
@Rain
用户权限、角色这块就用asp.net 2.0的Membership&RoleManager吧

#76楼    回复  引用  查看    

2007-04-11 23:30 by thyking xiao
不错,学习了,谢谢

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

2007-04-12 08:31 by webabcd
@thyking xiao
:)
多交流,互相学习

#78楼    回复  引用  查看    

2007-04-16 09:27 by 碟子[匿名]
大家好,我去掉了固定行列功能,可是在设计的时候CPU占用仍然是100%啊,请问楼上的各位能否传一份修改的给我参考一下?

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

2007-04-16 12:19 by webabcd
@碟子[匿名]
最好的办法就是在源视图里写代码

#80楼    回复  引用  查看    

2007-04-17 16:02 by FrankFei
请教一下楼主,在知道GridView的一个具体GridViewRow实例时,如何通过GridView所绑定的列名,求得此列的值?

PS:
如下是通过列索引求得的值,但在支持列互换时,就不能确定列索引
((TextBox)gridViewRow.Cells[2].Controls[0]).Text;

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

2007-04-17 17:15 by webabcd
@FrankFei
不要想了,那是不可能的

#82楼    回复  引用  查看    

2007-04-18 10:02 by yixianggao
非常感谢 webabcd 的无私奉献!

向大家学习!

致敬!

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

2007-04-18 10:34 by webabcd
@yixianggao
:)
大家多交流
互相学习

#84楼    回复  引用  查看    

2007-04-18 17:53 by FrankFei
请教一下,你在控件中的bool IPostBackDataHandler.LoadPostData是在什么情况下被调用的啊?我怎么没有找到调用者。先谢谢楼主了!

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

2007-04-18 18:17 by webabcd
@FrankFei
继承自IPostBackDataHandler接口

在使用固定行、列的功能后,我用这个方法里读GridView滚动条的位置

#86楼    回复  引用  查看    

2007-04-18 18:47 by 孤叶(学习.net框架)
IDReferenceProperty这个属性为什么我这边用不起来,

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

2007-04-18 19:21 by webabcd
@孤叶(学习.net框架)
?啥玩意?

#88楼    回复  引用  查看    

2007-04-18 19:25 by 孤叶(学习.net框架)
.net 2.0自定义控件的一个新属性,定义我就不说拉.MSDN
我就是想要通过他来产生一个下拉列表,这个列表里有我要的一组当前页面的控件ID

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

2007-04-18 22:01 by webabcd
@孤叶(学习.net框架)
不错
又跟兄弟学到了一招

我试了一下
就是如果属性是string类型的话,下拉的内容是control,就用这个,哈
测试成功了

#90楼    回复  引用  查看    

2007-04-18 22:08 by 孤叶(学习.net框架)
@webabcd
兄弟,快把源码发给我,我正在为这个头痛.快
solucky2008@gmail.com

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

2007-04-18 23:06 by webabcd
@孤叶(学习.net框架)
已发
请收

#92楼    回复  引用  查看    

2007-04-19 08:32 by xep
要2.0的教程么?  刚买完1.1的书,这2.0又出来了 听说3.0已经出来了

不想买书了  如果有教程请发我一份好吗?  xep.com@163.com

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

2007-04-19 08:51 by webabcd
@xep
2.0
原版
http://www.asp.net/learn/dataaccess/default.aspx?tabid=63
中文
http://www.cnblogs.com/lovecherry/archive/2006/07/02/440840.html

3.0
中文的不多
去查msdn吧
http://msdn2.microsoft.com/en-us/library/

#94楼    回复  引用  查看    

2007-04-19 10:15 by FrankFei
@FrankFei
继承自IPostBackDataHandler接口

在使用固定行、列的功能后,我用这个方法里读GridView滚动条的位置

==>
不好意思,可能我没有表达清楚,我的意思是为什么会自动调用IPostBackDataHandler,我也写了这样的接口,可为什么不能调用呢?是不是还要什么条件啊?

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

2007-04-19 10:40 by webabcd
@FrankFei
这个事件仅仅是在回发之后被激发。
在这个事件里实现了IPostBackDataHandler接口的控件从HTTP的POST数据中得到值。注意,textbox控件不能从view state中获得值,而是在此事件中从POST数据中获得值。所以即使有些控件没有启用view state,只要它实现了IPostBackDataHandler接口就可以从HTTP的POST数据中得到值。

#96楼    回复  引用  查看    

2007-04-20 13:11 by FrankFei
不好意思,又来请教你问题了。
我在你的类ContextMenu中新增了一个定义,如下:
public virtual ContextMenus1 ContextMenus1
{
get
{
if (_contextMenus1 == null)
{
_contextMenus1 = new ContextMenus1();
}
return _contextMenus1;
}
}
ContextMenus1的定义和ContextMenus差不多,问题是:
我在设计时,点属性ContextMenus,弹出了“ContextMenu集合编辑器”,在编辑器中新增一个成员,然后再点此成员的ContextMenus1属性,可此时弹出的不是“ContextMenu1集合编辑器”,而是"Object集合编辑器”,怎样处理这个问题呢?先谢了!

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

2007-04-20 13:43 by webabcd
@FrankFei
那要看你的ContextMenus1所包含的对象了

这个对象的每个属性的类型就是你集合编辑器里的每个项的类型

#98楼    回复  引用  查看    

2007-04-20 14:15 by FrankFei
ContextMenus1的定义和你的ContextMenus是一样的,ContextMenu1和你的ContextMenu是一样的,我只是把名字改了一下。

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

2007-04-20 17:53 by webabcd
@FrankFei
肯定是有不一样的地方的,兄弟可以好好检查一下

实在搞不定的话,可以把代码发我邮箱里,我来试着检查一下

#100楼    回复  引用  查看    

2007-04-23 10:21 by FrankFei
谢谢楼主指点,问题找到了,我没有定义:
   public ContextMenu this[int index]
{
get
{
return (ContextMenu)base.List[index];
}
set
{
base.List[index] = (ContextMenu)value;
}
}
我在编码时没有用到这个,就给我删除了,这段代码是不是就是在设计时用到的啊?

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

2007-04-23 10:44 by webabcd
@FrankFei
会用到地

#102楼    回复  引用  查看    

2007-04-23 17:41 by FrankFei
我定义了两个控件A和B,其中A有一个属性类型是B,我怎么在设计时实现:从Toolbox上拖一个A和一个B,然后设定A的那个属性为B,先谢楼主了!

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

2007-04-23 21:40 by webabcd
@FrankFei
你的意思是一个控件的某个属性指向另一个控件?
那这个就好比指定GridView的数据源控件

那么请参考元数据(一个Attribute)
IDReferenceProperty
就是如果属性是string类型的话,下拉的内容是control,就用这个

具体请查msdn

#104楼    回复  引用  查看    

2007-04-25 10:46 by shark0304
每次更新都不知道更新了什么代码,建议把更新说明写上去,加个简单的版本号也行。

#105楼    回复  引用  查看    

2007-04-25 10:48 by shark0304
每次更新都不知道更新了什么代码,建议加个更新说明和版本号。

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

2007-04-25 12:11 by webabcd
@shark0304
兄弟说的是

下次如果要改的话肯定是大改了,到时我会加上的
不过最近相当没时间啊

#107楼    回复  引用  查看    

2007-05-02 15:23 by shark0304
1.我把导出excel、word、xml功能另写了个控件和 扩展GridView一起使用。
现在gridiew导出excel只能导出当前页,我做的控件是取dataset导出全部
数据,现在还没集成进去,只能导出的时候再取一次dataset。楼主要是想完善一下,我可以把源码发给你
2.51aspx上有 GridView自定义分页及可拖动改变列宽的控件可以把这功能也加上去。
3.现在版本不断更新,但不知道具体更新的内容,每次更新能加个更新说明吗?
我觉的还是要把CPU占用率高的问题解决下,解决了用的人才会更多。

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

2007-05-02 22:54 by webabcd
@shark0304
1.谢谢,以后如果完善的时候我会把dataset导成excel的功能加进去的
2.那个我也看到了,很好,可是最近实在是没时间啊
3.以后更新的时候肯定会加的,可是最近忙啊,没有更新的打算,cpu占用率高是因为固定行、列的时候会在CSS中用Expression,我实在是没什么好的办法

最近太忙了,实在是没时间啊,以后有空的时候打算整个重写一遍,然后再加一些功能

#109楼 [TrackBack]   回复  引用  查看    

2007-05-23 13:22 by 希望虫
GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。 控件开发扩展GridView控件(一)——鼠标经过行时改变行的样式扩展GridVi...
[引用提示]希望虫引用了该文章, 地址: http://www.cnblogs.com/lixzhong/archive/2007/05/23/757008.html

#110楼    回复  引用  查看    

2007-06-11 15:02 by cc
扩展GridView控件(九)——给数据行增加右键菜单

------

如果一个页面用二个以上的girdview,你这种方式就没用了咯,只能是第一个gridview有用,

如果能实现在一个页面上的多个gridview都可以增加不同的右键菜单就好了

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

2007-06-11 15:59 by webabcd
@cc
确实有这问题,之前一直忙,最近好一些了,正准备修改这个东东

#112楼    回复  引用  查看    

2007-06-12 08:28 by cc
嗯,希望很快修改出来同一个页面能用二个以上的gridview右键菜单显示
关注,学习ing..................................

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

2007-06-12 12:19 by webabcd
@cc
打算整个重写一遍,另外现在空闲时间也不是很多,估计不会很快

#114楼    回复  引用  查看    

2007-06-26 11:44 by 辛 磊
绝对的支持!

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

2007-06-26 12:04 by webabcd
@辛 磊
:)
尽力7月底之前把它重写完

#116楼    回复  引用  查看    

2007-06-26 23:56 by andrew
如果动态创建模版列,postback的时候,模版列消失了
如果模版列静态生成,但其他列动态生成,postback的时候,模版列还是会消失,各位大大有没有什么高见啊

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

2007-06-27 08:01 by webabcd
@andrew
动态创建的话,需要每次页面加载都创建,而不能只在
if (!IsPostBack) {} 创建

#118楼    回复  引用  查看    

2007-06-27 08:39 by andrew
感谢@webabcd的回复,
如果仅仅是创建列都还好,还必须每次postback都得重新绑定数据,为什么动态添加的BoundFiled却没有消失呢

#119楼    回复  引用  查看    

2007-06-27 08:42 by andrew
"模版列静态生成,但其他列动态生成,postback的时候,模版列还是会消失,其它列却存在"
动态创建的BoundFiled存在,静态创建的模版列却消失了,真是郁闷啊

#120楼    回复  引用  查看    

2007-06-27 08:45 by andrew
@webabcd大哥
如果每次都动态生成,绑定数据,在性能方面会不会大大降低呢?

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

2007-06-27 10:09 by webabcd
@andrew
确实是让人不解的问题
BoundFiled没问题,而TemplateField却有问题
它们都是继承自DataControlField,DataControlField有TrackViewState()方法,本应该可以保持状态的

没办法,现在的解决方案只能是每次加载都动态创建列,性能的开销应该不大
另外,不管是不是动态创建列,如果你要分页,或者排序之类的都是要再绑定数据的

#122楼    回复  引用  查看    

2007-06-27 11:04 by andrew
非常感谢@webabcd的关注.
现在看来目前只能舍弃这种动态创建列的方式了.如果有好的解决方案,别忘了加到SmartGridView中哦,再次感谢!

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

2007-06-27 11:32 by webabcd
@andrew
:)
不谢

现在正在重构SmartGridView中……
同时优化,增强,并且支持ie和ff
希望7月底之前能完工

这之后再扩展新的功能

#124楼    回复  引用  查看    

2007-06-29 08:57 by 众吉网信
加油,当下来研究研究,一起努力

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

2007-06-29 10:18 by webabcd
@众吉网信
:)
从现在的进度看,7月底之前应该能出正式版

#126楼    回复  引用  查看    

2007-07-03 12:50 by KELLYNIC
我觉得没必要扩充那么多功能

多了,也无非是JavaScript

没什么意思啊

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

2007-07-03 17:11 by webabcd
@KELLYNIC
关键对我等懒人比较有用
非常讨厌做重复性的工作,所以才写在控件里

#128楼    回复  引用  查看    

2007-07-12 12:28 by
好贴

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

2007-07-12 14:39 by webabcd
@式
:)

#130楼    回复  引用  查看    

2007-07-14 23:48 by liyunshun83@hotmail.com
哥们知道你这里有,我就不费大事写了,搞的累死了

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

2007-07-16 08:09 by webabcd
@liyunshun83@hotmail.com
:)
这部分重写完后,还会加更多的功能

#132楼    回复  引用  查看    

2007-07-20 18:50 by xunlong
应该加上列筛选的功能,有时候要显示的列太多了,全部显示出来太难看,能否根据数据源返回的列选择要显示的哪些列

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

2007-07-23 07:47 by webabcd
@xunlong
这个功能要通过<Columns />实现啊

#134楼    回复  引用  查看    

2007-07-23 19:30 by xunlong
我想要的是动态的控制,而不是在页面上写死

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

2007-07-24 07:41 by webabcd
@xunlong
可以在codebehind里动态地创建列
参考一下
http://www.cnblogs.com/webabcd/archive/2006/12/19/596349.html
http://www.cnblogs.com/webabcd/archive/2006/12/21/598819.html

#136楼    回复  引用  查看    

2007-07-26 09:39 by Alex_li
webabcd
您好
关于 《扩展GridView控件(五)——固定表头、指定行或指定列》的问题请教

我需要动态的设定我需要固定的行与列,我如何能做到.
我需要动态的绑定我的栏位,如何做到
对了,能留下你的QQ吗,我想请教一些问题

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

2007-07-26 11:08 by webabcd
@Alex_li
可以动态地设置相关的属性即可

qq不经常用
一般用msn
webabcd
hotmail
com

#138楼    回复  引用  查看    

2007-07-26 14:52 by flycat


这个控件真是不错,等米下锅了,期待正式版的推出。

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

2007-07-26 18:19 by webabcd
@flycat
:)
8月初之前肯定会改完,发上来

#140楼    回复  引用  查看    

2007-08-03 14:21 by 公木子
SmartGridViewAlpha 和SmartGridView 有什么不 同SmartGridView好象功能少多。

#141楼    回复  引用  查看    

2007-08-03 14:29 by 公木子
比如 SmartGridView

<CheckboxAlls>
<yyc:CheckboxAll CheckboxAllID="checkall" checkboxItemID="checkitem" />
</CheckboxAlls>

就没上面的属性

#142楼    回复  引用  查看    

2007-08-03 16:53 by 秦东国
请问各位大侠
能不能给 ObjectDataSource之类的数据源控件扩展一下
我希望能够让ObjectDataSource在页面上显示一定的内容:例如标签,按钮等等?

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

2007-08-03 18:37 by webabcd
@公木子
正式版还没有完全写完,下个礼拜会放上来的,相对原版本会有很多改进

@秦东国
那不是ObjectDataSource的工作

#144楼    回复  引用  查看    

2007-08-04 09:05 by 秦东国
@webabcd
谢谢回复
我以前没有做过控件开发的事情

最近由于用到分页存储过程,
而.net又没有类似的控件

在网上找了找
发现也有这样的控件
但下下来
就是套不上去

以前也遇到过类似的问题
当时我做了个用户控件
来控制数据源控件的参数
从而达到分页的效果
但感觉不爽
而且用的时候还有点麻烦
还要给ObjectDataSource控件些几句代码

现在我想
如果能够直接把这些分页的动作加在ObjectDataSourc上面
不是很方便吗
但试了试
总给ObjectDataSourc加不上子控件

请问有相关的解决办法吗?

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

2007-08-06 08:03 by webabcd
@秦东国
ObjectDataSourc自带高效分页的方法的
SelectCountMethod
SortParameterName

<asp:Parameter Name="sort" Type="String" />
<asp:Parameter Name="filter" Type="String" />
<asp:Parameter Name="startRowIndex" Type="Int32" />
<asp:Parameter Name="maximumRows" Type="Int32" />

#146楼    回复  引用  查看    

2007-08-06 10:48 by 东国
@webabcd
ObjectDataSource 自带分页功能?
我一直不知道啊,
我昨天还花了很久的时间,自己做了一个分页的控件,
用了两个自定义控件来实现分页功能
我把代码贴出来了
http://www.cnblogs.com/qindgfly/archive/2007/08/06/844424.html
代码可能很糟糕,初学者,希望webabcd指导阿

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

2007-08-06 12:27 by webabcd
@东国
:)
不用自己写的
参考这篇
http://www.dotnetbips.com/articles/b6787e60-b0c9-496e-9d10-19bc7af4add2.aspx

#148楼    回复  引用  查看    

2007-08-06 15:39 by 东国
@webabcd
感谢webabcd提供的资料,
我看了,英文的,虽然看得有些吃力
不过还是基本读懂了
看来我自己做的工作真是白费了
让webabcd见笑了 ^^

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

2007-08-06 18:34 by webabcd
@东国
:)
不谢

#150楼    回复  引用  查看    

2007-08-07 12:20 by JLKEngine
兄弟,请问你的最新版本---------正式版何时发布呢? 希望你给的承诺要实现哈, 我们等着米下锅呢!!

#151楼    回复  引用  查看    

2007-08-07 12:21 by JLKEngine
@webabcd, 等着你早日发布你的正式版,期待我们盼望已久的控件到来!!

#152楼    回复  引用  查看    

2007-08-07 12:23 by JLKEngine
成都领君科技系列中间件产品资料及试用版下载地址
公司网站下载地址:
http://www.linjon.cn 在首页左边导航栏的软件下载进入。
FTP下载地址:
ftp://210.41.107.38 用户名与密码都是openlabftp,位置在linjon目录下。
邮箱下载地址:
JLK_Engine@163.com ,密码:JLKEngine

欢迎大家看看SuperFlow工作流平台展示!!
QQ: 26326507, E-mail: hy2001al@163.com,

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

2007-08-07 13:25 by webabcd
@JLKEngine
明天会放上来的

#154楼    回复  引用  查看    

2007-08-08 18:21 by JLKEngine
兄弟,看了你写的控件,感觉还不错,不过基于标准控件GridView的扩展老外也写过很多例子, 希望你能把该控件最重要的一写特性写出来,---------〉如何进行行编辑维护数据,光用于数据浏览感觉用处不大。 希望你目前做的翻页模式能采用客户端模式,包括排序,翻页,单击,双击事件。 不过还是希望你能做得更好,为大家提供更好得控件, 大力支持!!

成都领君科技有限公司 http://www.linjon.cn
欢迎大家看看SuperFlow工作流平台展示!!
QQ: 26326507, E-mail: hy2001al@163.com

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

2007-08-08 18:43 by webabcd
@JLKEngine
:)
嗯,努力中……

#156楼    回复  引用  查看    

2007-08-09 17:23 by allen
very good ,正式版终于出来了,等了好久了,有没有英文版的?

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

2007-08-09 19:00 by webabcd
@allen
:)
现在没有啊

把中文注释都翻译成英文的工程太“浩大”了
我决定
把中文注释去了就是英文版了

#158楼    回复  引用  查看    

2007-08-09 20:52 by 数据绑定者
链接已经是正式版了吗?下来研究下

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

2007-08-10 07:41 by webabcd
@数据绑定者
:)
是地

#160楼    回复  引用  查看    

2007-08-10 08:45 by 数据绑定者
我记得以前有个可以查看前面的两个列,然后拖动横向滚动条只滚动其余的列的例子啊,这里怎么没有呢?

像EXCEL里的分屏显示一样

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

2007-08-10 09:04 by webabcd
@数据绑定者
带的demo里有啊
固定了左边两列

#162楼    回复  引用  查看    

2007-08-10 13:56 by 数据绑定者
你确定demo里有?你的demo里的SmartGridView.aspx这个页面吗?
你自己下载下来看,没有固定列的哦。

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

2007-08-10 14:35 by webabcd
@数据绑定者
我重新下了一下,测了一下
就是SmartGridView.aspx这个页面,已经固定了左边的两列啊

另外,只有这个功能是只支持IE的,其他都支持IE和FF

#164楼    回复  引用  查看    

2007-08-10 15:28 by 数据绑定者
呵呵,不好意思误解你了,我用FireFox看的,呵呵

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

2007-08-10 16:23 by webabcd
@数据绑定者
:)
关键是我没说清楚

这个功能搞最长时间了,因为想可以随便固定任何行或任何列,这很难在FF里实现

#166楼    回复  引用  查看    

2007-08-12 09:50 by shark0304
今天上来看到正式版了,好高兴。
现在很想知道,当数据很多,几w条或10几w条或的时候用Gridview会不会影响数据?

#167楼    回复  引用  查看    

2007-08-12 09:51 by shark0304
速度。

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

2007-08-13 07:41 by webabcd
@shark0304
肯定会的,那就应该用存储过程分页了
了解一下ObjectDataSource吧,用它可以轻松地实现大数据量的分页

#169楼    回复  引用  查看    

2007-08-13 13:00 by JLKEngine
兄弟,你写的翻页及排序能使用客户端方式就更好! 还有对行选择时采用客户端模式,也就是提供客户端的事件,这样方便完成AJAXZ模式对后台的处理,希望你能好好改进哈!

#170楼    回复  引用  查看    

2007-08-13 13:02 by JLKEngine
成都领君科技有限公司网站下载地址:
http://www.linjon.cn 在首页左边导航栏的软件下载进入。
FTP下载地址:
ftp://210.41.107.38 用户名与密码都是openlabftp 在linjon目录下有我公司产品资料。
邮箱下载地址:
JLK_Engine@163.com ,密码:JLKEngine


兄弟,对你开发的控件扩展,我们还是很支持的,希望你努力做得更好!!

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

2007-08-13 17:53 by webabcd
@JLKEngine
行的选择有了啊
就是通过复选框选中行的那个

:)
多谢

#172楼    回复  引用  查看    

2007-08-22 16:44 by 兄弟能发一份给我不
不错

但下载你的源码后,我的开发环境下注册后,不能正常使用
pghdragon@talkweb.com.cn

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

2007-08-22 18:29 by webabcd
@兄弟能发一份给我不
.net的,不用注册dll的
把编译好的dll直接引用进来就行啊

提供的下载地址里的压缩包就是全部的源代码和示例,没有什么保留的

#174楼    回复  引用  查看    

2007-08-27 16:38 by wikdd
我怎么下载下来没有DLL文件呢?

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

2007-08-27 17:44 by webabcd
@wikdd
编译一下就出来了

#176楼    回复  引用  查看    

2007-08-27 19:03 by allen
HI,在用您的控件时遇到3个问题,希望能得到您的帮助。
1。导出时,一定要加上前面那个checkbox列吗?
2。导出时,能不能不导出隐藏的列?
3。导出时,如果我的objectdatasource的其中一个参数是取的页面中的一个下拉框的值,因为viewstate要设为false,那么就objectdatasource就取不到我下拉框的值。。。。
期待您的回答,谢谢!

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

2007-08-27 19:41 by webabcd
@allen
其实我做的导出,就是将DataTable导出
为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)

详细的可以看看每个方法的注释

#178楼    回复  引用  查看    

2007-08-28 07:49 by shunliy
如果我动态设置数据源,怎么不能导出?

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

2007-08-28 08:16 by webabcd
@shunliy
可以尝试着这样
控件里我加了几个静态方法


YYControls.Helper.Common
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
导出的时候调用它就好了

#180楼    回复  引用  查看    

2007-09-07 10:49 by DDD
导出的时候有问题。提示数据源必须为DataTable和dataset
但是我的数据源是这样的。怎么出现错误??

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

2007-09-07 12:09 by webabcd
@DDD
要先绑定再用SmartGridView的导出方法

或者用
YYControls.Helper.Common.Export()

#182楼    回复  引用  查看    

2007-09-20 01:22 by phis
在UpdatePanel中,滚动条保持不了位置

ScrollX和ScrollY 两个属性没了?

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

2007-09-20 08:13 by webabcd
@phis
测试版有
正式版被我给去掉了

以后完善的时候会加上,并提供自动保持滚动条位置的功能

#184楼    回复  引用  查看    

2007-09-20 09:36 by bili


求助求助!!请问在gridview 如果分页每页20条,但是我想每5条进行分段还可以啊,每段间用一条线隔开。

白思不得其解,给小弟一点思路吗???

我今年刚毕业现在工作了,在学校里这些东西都没有学到。工作时发现学校学的东西,,,哎。。。。。

请帮助小弟一下吧。 不努力是不行的啊。

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

2007-09-20 12:22 by webabcd
@bili
在RowDataBound里对Row进行操作

#186楼    回复  引用  查看    

2007-09-20 22:12 by phis
今天把这个控件用到自己写的一个小项目,真的很不错!
期待进一步完善......

#187楼    回复  引用  查看    

2007-09-20 23:28 by Andychen
很好的控件。感谢楼主,加油完善

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

2007-09-21 07:36 by webabcd
@phis
@Andychen
:)
不断添加新功能中……

#189楼    回复  引用  查看    

2007-09-21 10:34 by allenzeng
HI ,导出的时候是将objectdatasource指定的datatable导出,那么我要如何控制不导出smartgridview中的隐藏列?不知王兄可有好办法?

#190楼    回复  引用  查看    

2007-09-21 11:47 by 碟子 MSN:archor1126@163.com (推荐) QQ:9997452
情况是这样的:我之前写程序的时候是为每个SmartGridView控件设置样式,后来为了统一修改颜色的方便,就在skin文件里面加了一段:
<yyc:SmartGridView runat="server" skinid="SmartGrid" Width="100%"
CellPadding="5" GridLines="Horizontal" EmptyDataText="无" EnableSortingAndPagingCallbacks="True">
<HeaderStyle BackColor="Silver" />
<AlternatingRowStyle BackColor="#FFC0C0" />
</yyc:SmartGridView>

然后我在页面的控件属性里面设置了skinid="SmartGrid",再把控件的样式设置代码去掉,这个时候问题出现了:如果去掉<HeaderStyle BackColor="#6B7EBF" />这一行,程序运行时会报错。
YYControls.SartGridViewFunction.FixRowColumnFunction的_sgv_RowDataBoundCell(object sender, GridViewTableCell gvtc)函数里,
// 固定列
if (Array.Exists(this._sgv.FixRowColumn.FixColumns.Split(','), delegate(string s) { return s == gvtc.ColumnIndex.ToString(); }))

该语句抛出NullReferenceException,this._sgv.FixRowColumn.FixColumns对象为空。

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

2007-09-21 11:59 by webabcd
@allenzeng
看一下这个方法
Export(string fileName, int[] columnIndexList, string[] headers, ExportFormat exportFormat, Encoding encoding)

可以设置导出哪列,也可以设置标题

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

2007-09-21 12:02 by webabcd
@碟子 MSN:archor1126@163.com (推荐) QQ:9997452
请下载新版本,已经改好了

#193楼    回复  引用  查看    

2007-09-25 16:39 by anni
很好!
我把单击事件绑定到selectrow,感觉动作很缓慢,单击后要停一下才有相应,怎么回事?

#194楼    回复  引用  查看    

2007-09-25 16:40 by anni
响应

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

2007-09-25 17:07 by webabcd
@anni
为了即可以响应双击事件和也可以响应单击事件
所以我把单击事件设置为单击后的300毫秒后响应

#196楼    回复  引用  查看    

2007-09-27 21:37 by shark0304
导出EXCEL,在EXCEL里的显示太简单化了,可以先生成网页再导入到EXCEL里那样出来的报表就漂亮整齐多了,我花了两天的时间改进了下

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

2007-09-28 07:48 by webabcd
@shark0304
:)
兄弟可以把代码贴出来让大家看看
 
原创粉丝点击