4、联动复选框(复选框的全选和取消全选)。选中指定的父复选框,则设置指定的所有子复选框为选中状态;取消选中指定的父复选框,则设置指定的所有子复选框为取消选中状态
Export(string fileName, int[] columnIndexList, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, int[] columnIndexList, string[] headers, ExportFormat exportFormat, Encoding encoding)
CommandArgument属性的值用“;”做分隔符分为两部分,左边的部分为导出Excel的文件名称,右边的部分为需要隐藏的列的索引(列索引用“,”分开)
设置GridView的原有属性PageButtonCount,FirstPageText,PreviousPageText,NextPageText,LastPageText,FirstPageImageUrl,PreviousPageImageUrl,NextPageImageUrl,LastPageImageUrl
Feedback
听取了Wyssoft的建议
增加了“是否保持滚动条的状态”的功能
文章已经更新,源码晚上传
发现bug:
1,跳到最后一页,全选执行成功,但页面左下角提示脚本错误。
2,然后再转到其它页,全选功能不正常(只选择了最后一页的记录数)。
建议:
我的数据是用存储过程实现分页的(nettires生成的getpaged方法),gridview认为它只有一页,怎么用你的分页样式呢?
我现在的方法是自己单独做的分页控件,不太美观。
iamxiaozhuang@hotmail.com 欢迎讨论。
我做了一个测试界面,一个保存按钮,一个SmartGridView,先点复选框选择几行,然后点击保存按钮,将选择行的ID保存到数据库中。可是在保存事件中,怎么获取选择行的ID。为什么点击保存按钮后,会报错!
@小庄
找到原因了,RowDataBound事件会被执行两次,索引给隐藏字段赋值的时候就会有问题,想破脑袋也不知道RowDataBound事件为什么会被执行两次。想明白后我再把解决办法贴出来
至于分页样式,我的那个只是改写原来GirdView的分页样式而已,如果用存储过程分页的话,我那个肯定只认为有一页的。
我觉得如果要用存储过程分页的话,肯定是要写一个单独的分页控件的
@老夫子系
获取选中行的ID就是查看哪个行的复选框被选中了,然后读出这个行的关键字就ok了
@webabcd
支持你所做出的努力.
刚放完假,测了一下你的新版本.不过,跟我的想象还有点差别.主要是刷新问题,滚动条是可以保持相对位置了,但想避免刷新.我试用一个UpdatePanel套进去,结果滚动条保持不了位置了.
@Wyssoft
那个需要在updatepanel中注册js,做在控件里不方便,有时间了我会贴出一个解决办法的
@孤叶(学习.net框架)
确实,我的js水平不够啊,无法为ff写与其适用应的js
更新列表1
@小庄 发现的bug描述如下
1,跳到最后一页,全选执行成功,但页面左下角提示脚本错误。
2,然后再转到其它页,全选功能不正常(只选择了最后一页的记录数)。
原因
执行分页或者排序事件之类的,重写的RowDataBound事件会执行两次,第一次DataBound老数据,第二次DataBound新数据;重写的PreRender会执行一次(老数据),而其中调用基类的方法base.OnPreRender(e)会执行两次
为什么会出这样?
不知道
解决办法
数据源的Select事件只会执行一次,并且执行之后会RowDataBound新数据,所以,如果设置一个变量来确保只有数据源的Select事件之后才RowDataBound就ok了
把重写的PreRender换为在GridView的构造函数中增加GridView的事件委托,则没有上述问题
更新列表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);
@webabcd
不知道是不是跟UpdatePanel有关,在设计模式下老死掉.
ScriptManager.RegisterStartupScript(UpdatePanel1, typeof(UpdatePanel), "js", "document.getElementById('yy_ScrollDiv').scrollLeft=" + SmartGridView1.ScrollX + ";document.getElementById('yy_ScrollDiv').scrollTop=" + SmartGridView1.ScrollY + ";", true);
这段代码应该放在页面中哪个位置比较合适呢?
@Wyssoft
如果使用了固定行、列的功能后就会出现这种现象
那段代码可以加到Page_Load里
@webabcd
为什么会是这样,有没有办法解决呢.我记得以前的版本好像没有吧.
滚动条位置好像可以借助MaintainScrollPositionOnPostback这个属性解决.
你试试,我这没法调了.
@Wyssoft
MaintainScrollPositionOnPostback这个属性是相对于浏览器的,我的那个是相对于GridView所在的DIV的,不能借用啊
另外,可能会死掉是因为固定了行、列的原因,因为行、列都有可能固定,所以我在每个单元格都用css调js实现这个功能,比较耗cpu,所以有可能会死掉
还有一种用div冻结行、列的实现方法,但是集成到GridView里超麻烦,所以放弃了
@webabcd
我决得那个耗cpu问题,真是个很大的问题.应该考虑考虑
刚发现 用SqlDataSource作数据源,标题不能初固定.是怎么回事.
@Wyssoft
确实,冻结行、列后耗cpu问题同时也出现在客户端显示的时候,但以我现在的水平也确实没什么好的解决办法。如果在设计模式中会死掉,那就用在HTML模式下写代码吧。或者先不加冻结行、列的功能,等都设计得差不多了,再在HTML模式下把冻结行、列的功能加上
我没用SqlDataSource数据源做过测试,实际上我从来都没用过SqlDataSource,它会破坏项目中的层次结构,建议兄弟实际开发中也别用它。
东西确实很好用,但是有一点在开发的时候,预览这个控件的属性时候经常CPU不够用
@wyz
这是因为使用了固定行、列功能的原因,因为行、列都有可能固定,所以我在每个单元格都用css调js实现这个功能,比较耗cpu
@webabcd
在ItemTemplate里加一个DropDownList,结果DropDownList跑到固定行的上面进行移动
@Wyssoft
这是IE的BUG,就是当层遇到下拉框时总是挡不了select框
我在针对SmartGridView编程时,
SmartGridView1 = new SmartGridView();
SmartGridView1.RowCommand += new GridViewCommandEventHandler(SmartGridView1_RowCommand);在运行时就是不响应,而如果把SmartGridView中的protected override void OnRowDataBound(GridViewRowEventArgs e)拿掉就可以了,这是为什么呢?
@FrankFei
我试了一下,没问题啊
protected void Page_Load(object sender, EventArgs e)
{
SmartGridView1.RowCommand += new GridViewCommandEventHandler(SmartGridView2_RowCommand);
}
protected void SmartGridView2_RowCommand(object sender, GridViewCommandEventArgs e)
{
}
可是我测试下来确实是这样的,下面为源码,能否帮忙看看,谢谢!
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();
}
}
@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();
}
}
兄弟,你有点生成后界面上的button,然后有调用如下的内容啊?protected void SmartGridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
}
太奇怪了!会不会是VS2005的BUG?
但是我把上面的SmartGridView改为GridView,又是好的,奇怪!
@FrankFei
经验告诉我,这应该不是VS2005的BUG
我只是把你的程序读数据库的部分改成了sqlserver的,删了几个列
然后按了按钮后会执行这句
protected void SmartGridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
Response.Write("dafds");
}
页面显示了dafds
问题找到了,我把你控件中OnRowDataBound的第一行的那个return不小心删除了。只是还不理解真正的原因。
再次感谢你的热心!
向你学习!
@FrankFei
我加那句是为了避免下面情况的发生
执行分页或者排序事件之类的,重写的RowDataBound事件会执行两次,第一次DataBound老数据,第二次DataBound新数据;重写的PreRender会执行一次(老数据),而其中调用基类的方法base.OnPreRender(e)会执行两次
实在是不知道为什么会出现这种情况,所以加了那句避免这种情况
大家互相学习,共同提高
http://www.cnblogs.com/webabcd/archive/2007/02/04/639830.html
[引用提示]MrYoung引用了该文章, 地址:
http://www.cnblogs.com/MatrixMaker/archive/2007/03/20/681214.html
这个一个页面使用两个同样的控件的话,有些功能会失效,如checkbox全选,以及保持滚动条的位置,导出excel。
@kiler
大问题啊,我压根就没想过这个问题,失败
改起来太麻烦,决定不改了,毕竟一个页面有两个或更多GridView的需求不多见啊
也不是很麻烦,调整一下ID和注册脚本的名称就可以了,我改的差不多了,等改好了,我再发回给你吧。
@kiler
:)
感谢兄弟啊
我现在看着那些代码就头大,不明白当初为什么写的那么乱(答曰:水平不够)
@w
记得我原来做合并列上的单元格的时候是写一个方法,把GridView和需要合并的列的索引作为参数传进去,如何合并都是在那个方法里写的,所以我觉得可以写个utility来实现它,因此就没扩展GridView的这个功能
这个控件根本没法用,在设计时CPU狂占100%, 根本没往下进行!
这个控件根本没法用,在设计时CPU狂占100%, 根本没法往下进行!
可能是你没用好吧, 我也碰到这个问题, 不过我去掉一些功能就可以了, 像固定列表头, 没什么用的, 用自己需要的功能就可以了
@zhlmxh
正如“zhoupeng”所说,把固定行、列的功能去掉后就ok了
因为固定行、列的功能使用了css调javascript表达式的方式控制层的高度,在设计模式的时候就会狂刷界面,所以很占cpu
兄弟,请教您一个问题,如何在OnRowUpdating中获得GridView中所绑定的列名(即table中对应的字段),先谢谢了!
PS:
列值可以用((TextBox)this.Rows[e.RowIndex].Cells[0].Controls[0]).Text获得。
@FrankFei
以绑定列为例
((BoundField)GridView.Columns[index]).DataField
问一下怎么让右键菜单直接执行一个JS函数而不要进行页面刷新
等不及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
在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; }
}
在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 += ""οnmοuseοver=/""changeStyle(this, 'on');/"" "";
strShow += ""οnmοuseοut=/""changeStyle(this, 'out');/"" "";
if (this.type == 'Command')
{
// 右键菜单是按钮类型,调用所对应的按钮的click事件
strShow += ""οnclick=/""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 += ""οnclick=/"""";
strShow += this.target;
strShow += "".location='"";
strShow += this.url;
strShow += ""'"";
}
else
{
strShow += ""οnclick=/""window.open('"";
strShow += this.url;
strShow += ""')"";
}
}
else
{
// 右键菜单是客户端脚本类型
strShow += ""οnclick=/"""";
strShow += this.scriptfunction;
strShow += """";
}
strShow += ""/"">"";
strShow += ""<td class='ltdexit' width='16'>"";
if (this.icon == '')
{
strShow += ' ';
}
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'> </td></tr>"";
}
// 右键菜单是分隔线
else if (this.type == 'Separator')
{
strShow += ""<tr><td class='ltdexit'> </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>
如何通过继承GridView来修改在设计时绑定数据源时自动生成的ASP.Net代码?
总所周知,当GridView帮定到一个数据源时,它会自动生成绑定列,这些列会写到aspx文件中。
现在我需要按照一定规则修改这些列的列头HeaderText。
我新建一个控件,继承自GridView。重写CreateColumns方法,然后遍历所有Columns并修改,成功,aspx设计界面上展现的也是修改后的字样,但切换到aspx源码,发现还是原来的。
问:有什么办法使得内存中属性的改变持久化到aspx文件中?
谢谢
@臭石头
是把HeaderText硬编码了吗?
那它是不会在aspx源码中体现出来的
具体情况是这样的,ObjectDataSource绑定到实体类,GridView帮定到ObjectDataSource,这时候,GridView会获取实体类的构架信息,并自动生成一些列,HeaderText就是实体类的属性名,是E文的,我现在想在GridView的CreateColumns方法中进行拦截这个生成过程,硬是把E文改为对应的中文。
结果,在设计时和运行时都可以看到是中文的,但是aspx中就不是中文的。
我就想问问,怎么样,才能让它在aspx中体现中文,GridView自身是怎么样把自动生成的列写入到aspx中的。
我已经把GridView以及几个基类的源码翻了好几遍了,我肯定,我已经把CreateColumns拦截到并修改成功了,但是,它从哪里得到英文HeaderText的BoundColumn写入到aspx中的?难道自动生成列的某些过程不需要调用CreateColumns?
考虑到以后的非常多的修改可能都要“体现”在aspx中,我倒是很想弄清楚,控件中怎么样一些属性的改变“体现”在aspx中。
谢谢^_^
@臭石头
据我所知
你是重写了他的CreateColumns方法,这不会在aspx源码中有所体现的
你要是增加一些自定义GridView属性,就可以在aspx源码出现
我就想知道,GridView它自己是怎么做到的,它怎么生成BoundField的。这一点,我想它应该不是通过属性来实现的吧。
我这里收集了大量信息,但是尚未发现它是怎么写入到aspx中的,目前发现了一点眉头,但是因为项目太紧,暂时没时间研究下去。如果有兴趣,大家可以一起交流一下。我不仅把System.Web命名空间反编译了,还录下了控件在设计时的执行过程(哪个方法到哪个方法)。
我QQ:99363590
E_Mail:gxuhy at 21cn.com
@臭石头
好
不过一般家里才上qq
公司时候msn
webabcd at hotmail.com
多交流
发现一个问题,当我的数据源是空时,页面状态栏显示出错,详细信息是缺少对象,想应该是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;
}
@Allen
是的
当初写代码的时候没有做对象为空的判断
比如全选CheckBox的那个功能,会用getElementById去找CheckBox
如果没有数据的话就找不到它
所以会报缺少对象的错误
谢谢您的解答,那如果要改的话是否是将判断空的条件加到js里面去 还是在smartgridviewd 执行PreRender的时候去判断数据源对像是否为空?不过我觉得在PreRender里应该还抓不到它的datasource吧 请您赐教~ 谢谢~
@Allen
当然,判断如果没有数据就不生成js脚本最好了
在PreRender之前,数据源的Selected事件里可以知道是否有数据
另外的办法就是在js里判断对象是否为空
对本例来说
就是把yy_GetObject(param)函数改成如下这样
function yy_GetObject(param)
{
if (document.getElementById(param))
return document.getElementById(param);
}
我已经改好上传了
谢谢提出bug
当把右键功能代码取消,点右键会出js错误,对象为空.
许多人需要用右键复制信息.所以还是改下比较好.
@shark0304
bug多多啊
感谢兄弟提出来
出现这个问题的原因是,在没有使用右键功能的时候也注册了客户端脚本,加上一句判断就ok了
已经改好上传了
谢谢
不是做技术的,看了还是有点害怕,感觉与时代差距太大了!不敢学了,看的越多发现知道的越少啊!悲哀
@Rain
:)
大家社会分工不一样
在自己的工种上跟上时代就好了
呵呵 因为想转到开发来 才在网上看些资料 想找用户角色权限这块参考 就链接到你这来了 能不能发个请求:有无用户角色权限这方面的数据库(sqlserver2000)设计和.net代码 传给我一份,没写过项目,先只能尽量参考兼抄袭代码了 呵呵
99linsen@163.com
QQ:10204074
@Rain
用户权限、角色这块就用asp.net 2.0的Membership&RoleManager吧
@thyking xiao
:)
多交流,互相学习
大家好,我去掉了固定行列功能,可是在设计的时候CPU占用仍然是100%啊,请问楼上的各位能否传一份修改的给我参考一下?
请教一下楼主,在知道GridView的一个具体GridViewRow实例时,如何通过GridView所绑定的列名,求得此列的值?
PS:
如下是通过列索引求得的值,但在支持列互换时,就不能确定列索引
((TextBox)gridViewRow.Cells[2].Controls[0]).Text;
非常感谢 webabcd 的无私奉献!
向大家学习!
致敬!
@yixianggao
:)
大家多交流
互相学习
请教一下,你在控件中的bool IPostBackDataHandler.LoadPostData是在什么情况下被调用的啊?我怎么没有找到调用者。先谢谢楼主了!
@FrankFei
继承自IPostBackDataHandler接口
在使用固定行、列的功能后,我用这个方法里读GridView滚动条的位置
IDReferenceProperty这个属性为什么我这边用不起来,
.net 2.0自定义控件的一个新属性,定义我就不说拉.MSDN
我就是想要通过他来产生一个下拉列表,这个列表里有我要的一组当前页面的控件ID
@孤叶(学习.net框架)
不错
又跟兄弟学到了一招
我试了一下
就是如果属性是string类型的话,下拉的内容是control,就用这个,哈
测试成功了
@webabcd
兄弟,快把源码发给我,我正在为这个头痛.快
solucky2008@gmail.com
要2.0的教程么? 刚买完1.1的书,这2.0又出来了 听说3.0已经出来了
不想买书了 如果有教程请发我一份好吗? xep.com@163.com
@FrankFei
继承自IPostBackDataHandler接口
在使用固定行、列的功能后,我用这个方法里读GridView滚动条的位置
==>
不好意思,可能我没有表达清楚,我的意思是为什么会自动调用IPostBackDataHandler,我也写了这样的接口,可为什么不能调用呢?是不是还要什么条件啊?
@FrankFei
这个事件仅仅是在回发之后被激发。
在这个事件里实现了IPostBackDataHandler接口的控件从HTTP的POST数据中得到值。注意,textbox控件不能从view state中获得值,而是在此事件中从POST数据中获得值。所以即使有些控件没有启用view state,只要它实现了IPostBackDataHandler接口就可以从HTTP的POST数据中得到值。
不好意思,又来请教你问题了。
我在你的类ContextMenu中新增了一个定义,如下:
public virtual ContextMenus1 ContextMenus1
{
get
{
if (_contextMenus1 == null)
{
_contextMenus1 = new ContextMenus1();
}
return _contextMenus1;
}
}
ContextMenus1的定义和ContextMenus差不多,问题是:
我在设计时,点属性ContextMenus,弹出了“ContextMenu集合编辑器”,在编辑器中新增一个成员,然后再点此成员的ContextMenus1属性,可此时弹出的不是“ContextMenu1集合编辑器”,而是"Object集合编辑器”,怎样处理这个问题呢?先谢了!
@FrankFei
那要看你的ContextMenus1所包含的对象了
这个对象的每个属性的类型就是你集合编辑器里的每个项的类型
ContextMenus1的定义和你的ContextMenus是一样的,ContextMenu1和你的ContextMenu是一样的,我只是把名字改了一下。
@FrankFei
肯定是有不一样的地方的,兄弟可以好好检查一下
实在搞不定的话,可以把代码发我邮箱里,我来试着检查一下
谢谢楼主指点,问题找到了,我没有定义:
public ContextMenu this[int index]
{
get
{
return (ContextMenu)base.List[index];
}
set
{
base.List[index] = (ContextMenu)value;
}
}
我在编码时没有用到这个,就给我删除了,这段代码是不是就是在设计时用到的啊?
我定义了两个控件A和B,其中A有一个属性类型是B,我怎么在设计时实现:从Toolbox上拖一个A和一个B,然后设定A的那个属性为B,先谢楼主了!
@FrankFei
你的意思是一个控件的某个属性指向另一个控件?
那这个就好比指定GridView的数据源控件
那么请参考元数据(一个Attribute)
IDReferenceProperty
就是如果属性是string类型的话,下拉的内容是control,就用这个
具体请查msdn
每次更新都不知道更新了什么代码,建议把更新说明写上去,加个简单的版本号也行。
每次更新都不知道更新了什么代码,建议加个更新说明和版本号。
@shark0304
兄弟说的是
下次如果要改的话肯定是大改了,到时我会加上的
不过最近相当没时间啊
1.我把导出excel、word、xml功能另写了个控件和 扩展GridView一起使用。
现在gridiew导出excel只能导出当前页,我做的控件是取dataset导出全部
数据,现在还没集成进去,只能导出的时候再取一次dataset。楼主要是想完善一下,我可以把源码发给你
2.51aspx上有 GridView自定义分页及可拖动改变列宽的控件可以把这功能也加上去。
3.现在版本不断更新,但不知道具体更新的内容,每次更新能加个更新说明吗?
我觉的还是要把CPU占用率高的问题解决下,解决了用的人才会更多。
@shark0304
1.谢谢,以后如果完善的时候我会把dataset导成excel的功能加进去的
2.那个我也看到了,很好,可是最近实在是没时间啊
3.以后更新的时候肯定会加的,可是最近忙啊,没有更新的打算,cpu占用率高是因为固定行、列的时候会在CSS中用Expression,我实在是没什么好的办法
最近太忙了,实在是没时间啊,以后有空的时候打算整个重写一遍,然后再加一些功能
GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。 控件开发扩展GridView控件(一)——鼠标经过行时改变行的样式扩展GridVi...
[引用提示]希望虫引用了该文章, 地址:
http://www.cnblogs.com/lixzhong/archive/2007/05/23/757008.html
扩展GridView控件(九)——给数据行增加右键菜单
------
如果一个页面用二个以上的girdview,你这种方式就没用了咯,只能是第一个gridview有用,
如果能实现在一个页面上的多个gridview都可以增加不同的右键菜单就好了
@cc
确实有这问题,之前一直忙,最近好一些了,正准备修改这个东东
嗯,希望很快修改出来同一个页面能用二个以上的gridview右键菜单显示
关注,学习ing..................................
@cc
打算整个重写一遍,另外现在空闲时间也不是很多,估计不会很快
如果动态创建模版列,postback的时候,模版列消失了
如果模版列静态生成,但其他列动态生成,postback的时候,模版列还是会消失,各位大大有没有什么高见啊
@andrew
动态创建的话,需要每次页面加载都创建,而不能只在
if (!IsPostBack) {} 创建
感谢@webabcd的回复,
如果仅仅是创建列都还好,还必须每次postback都得重新绑定数据,为什么动态添加的BoundFiled却没有消失呢
"模版列静态生成,但其他列动态生成,postback的时候,模版列还是会消失,其它列却存在"
动态创建的BoundFiled存在,静态创建的模版列却消失了,真是郁闷啊
@webabcd大哥
如果每次都动态生成,绑定数据,在性能方面会不会大大降低呢?
@andrew
确实是让人不解的问题
BoundFiled没问题,而TemplateField却有问题
它们都是继承自DataControlField,DataControlField有TrackViewState()方法,本应该可以保持状态的
没办法,现在的解决方案只能是每次加载都动态创建列,性能的开销应该不大
另外,不管是不是动态创建列,如果你要分页,或者排序之类的都是要再绑定数据的
非常感谢@webabcd的关注.
现在看来目前只能舍弃这种动态创建列的方式了.如果有好的解决方案,别忘了加到SmartGridView中哦,再次感谢!
@andrew
:)
不谢
现在正在重构SmartGridView中……
同时优化,增强,并且支持ie和ff
希望7月底之前能完工
这之后再扩展新的功能
@众吉网信
:)
从现在的进度看,7月底之前应该能出正式版
我觉得没必要扩充那么多功能
多了,也无非是JavaScript
没什么意思啊
@KELLYNIC
关键对我等懒人比较有用
非常讨厌做重复性的工作,所以才写在控件里
@liyunshun83@hotmail.com
:)
这部分重写完后,还会加更多的功能
应该加上列筛选的功能,有时候要显示的列太多了,全部显示出来太难看,能否根据数据源返回的列选择要显示的哪些列
@xunlong
这个功能要通过<Columns />实现啊
webabcd
您好
关于 《扩展GridView控件(五)——固定表头、指定行或指定列》的问题请教
我需要动态的设定我需要固定的行与列,我如何能做到.
我需要动态的绑定我的栏位,如何做到
对了,能留下你的QQ吗,我想请教一些问题
@Alex_li
可以动态地设置相关的属性即可
qq不经常用
一般用msn
webabcd
hotmail
com
@flycat
:)
8月初之前肯定会改完,发上来
SmartGridViewAlpha 和SmartGridView 有什么不 同SmartGridView好象功能少多。
比如 SmartGridView
<CheckboxAlls>
<yyc:CheckboxAll CheckboxAllID="checkall" checkboxItemID="checkitem" />
</CheckboxAlls>
就没上面的属性
请问各位大侠
能不能给 ObjectDataSource之类的数据源控件扩展一下
我希望能够让ObjectDataSource在页面上显示一定的内容:例如标签,按钮等等?
@公木子
正式版还没有完全写完,下个礼拜会放上来的,相对原版本会有很多改进
@秦东国
那不是ObjectDataSource的工作
@webabcd
谢谢回复
我以前没有做过控件开发的事情
最近由于用到分页存储过程,
而.net又没有类似的控件
在网上找了找
发现也有这样的控件
但下下来
就是套不上去
以前也遇到过类似的问题
当时我做了个用户控件
来控制数据源控件的参数
从而达到分页的效果
但感觉不爽
而且用的时候还有点麻烦
还要给ObjectDataSource控件些几句代码
现在我想
如果能够直接把这些分页的动作加在ObjectDataSourc上面
不是很方便吗
但试了试
总给ObjectDataSourc加不上子控件
请问有相关的解决办法吗?
@秦东国
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" />
@webabcd
ObjectDataSource 自带分页功能?
我一直不知道啊,
我昨天还花了很久的时间,自己做了一个分页的控件,
用了两个自定义控件来实现分页功能
我把代码贴出来了
http://www.cnblogs.com/qindgfly/archive/2007/08/06/844424.html
代码可能很糟糕,初学者,希望webabcd指导阿
@webabcd
感谢webabcd提供的资料,
我看了,英文的,虽然看得有些吃力
不过还是基本读懂了
看来我自己做的工作真是白费了
让webabcd见笑了 ^^
兄弟,请问你的最新版本---------正式版何时发布呢? 希望你给的承诺要实现哈, 我们等着米下锅呢!!
@webabcd, 等着你早日发布你的正式版,期待我们盼望已久的控件到来!!
成都领君科技系列中间件产品资料及试用版下载地址
公司网站下载地址:
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,
兄弟,看了你写的控件,感觉还不错,不过基于标准控件GridView的扩展老外也写过很多例子, 希望你能把该控件最重要的一写特性写出来,---------〉如何进行行编辑维护数据,光用于数据浏览感觉用处不大。 希望你目前做的翻页模式能采用客户端模式,包括排序,翻页,单击,双击事件。 不过还是希望你能做得更好,为大家提供更好得控件, 大力支持!!
成都领君科技有限公司
http://www.linjon.cn
欢迎大家看看SuperFlow工作流平台展示!!
QQ: 26326507, E-mail: hy2001al@163.com
very good ,正式版终于出来了,等了好久了,有没有英文版的?
@allen
:)
现在没有啊
把中文注释都翻译成英文的工程太“浩大”了
我决定
把中文注释去了就是英文版了
我记得以前有个可以查看前面的两个列,然后拖动横向滚动条只滚动其余的列的例子啊,这里怎么没有呢?
像EXCEL里的分屏显示一样
你确定demo里有?你的demo里的SmartGridView.aspx这个页面吗?
你自己下载下来看,没有固定列的哦。
@数据绑定者
我重新下了一下,测了一下
就是SmartGridView.aspx这个页面,已经固定了左边的两列啊
另外,只有这个功能是只支持IE的,其他都支持IE和FF
呵呵,不好意思误解你了,我用FireFox看的,呵呵
@数据绑定者
:)
关键是我没说清楚
这个功能搞最长时间了,因为想可以随便固定任何行或任何列,这很难在FF里实现
今天上来看到正式版了,好高兴。
现在很想知道,当数据很多,几w条或10几w条或的时候用Gridview会不会影响数据?
@shark0304
肯定会的,那就应该用存储过程分页了
了解一下ObjectDataSource吧,用它可以轻松地实现大数据量的分页
兄弟,你写的翻页及排序能使用客户端方式就更好! 还有对行选择时采用客户端模式,也就是提供客户端的事件,这样方便完成AJAXZ模式对后台的处理,希望你能好好改进哈!
成都领君科技有限公司网站下载地址:
http://www.linjon.cn 在首页左边导航栏的软件下载进入。
FTP下载地址:
ftp://210.41.107.38 用户名与密码都是openlabftp 在linjon目录下有我公司产品资料。
邮箱下载地址:
JLK_Engine@163.com ,密码:JLKEngine
兄弟,对你开发的控件扩展,我们还是很支持的,希望你努力做得更好!!
@JLKEngine
行的选择有了啊
就是通过复选框选中行的那个
:)
多谢
不错
但下载你的源码后,我的开发环境下注册后,不能正常使用
pghdragon@talkweb.com.cn
@兄弟能发一份给我不
.net的,不用注册dll的
把编译好的dll直接引用进来就行啊
提供的下载地址里的压缩包就是全部的源代码和示例,没有什么保留的
HI,在用您的控件时遇到3个问题,希望能得到您的帮助。
1。导出时,一定要加上前面那个checkbox列吗?
2。导出时,能不能不导出隐藏的列?
3。导出时,如果我的objectdatasource的其中一个参数是取的页面中的一个下拉框的值,因为viewstate要设为false,那么就objectdatasource就取不到我下拉框的值。。。。
期待您的回答,谢谢!
@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)
详细的可以看看每个方法的注释
@shunliy
可以尝试着这样
控件里我加了几个静态方法
如
YYControls.Helper.Common
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
导出的时候调用它就好了
导出的时候有问题。提示数据源必须为DataTable和dataset
但是我的数据源是这样的。怎么出现错误??
@DDD
要先绑定再用SmartGridView的导出方法
或者用
YYControls.Helper.Common.Export()
在UpdatePanel中,滚动条保持不了位置
ScrollX和ScrollY 两个属性没了?
@phis
测试版有
正式版被我给去掉了
以后完善的时候会加上,并提供自动保持滚动条位置的功能
求助求助!!请问在gridview 如果分页每页20条,但是我想每5条进行分段还可以啊,每段间用一条线隔开。
白思不得其解,给小弟一点思路吗???
我今年刚毕业现在工作了,在学校里这些东西都没有学到。工作时发现学校学的东西,,,哎。。。。。
请帮助小弟一下吧。 不努力是不行的啊。
@bili
在RowDataBound里对Row进行操作
今天把这个控件用到自己写的一个小项目,真的很不错!
期待进一步完善......
@phis
@Andychen
:)
不断添加新功能中……
HI ,导出的时候是将objectdatasource指定的datatable导出,那么我要如何控制不导出smartgridview中的隐藏列?不知王兄可有好办法?
情况是这样的:我之前写程序的时候是为每个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对象为空。
@allenzeng
看一下这个方法
Export(string fileName, int[] columnIndexList, string[] headers, ExportFormat exportFormat, Encoding encoding)
可以设置导出哪列,也可以设置标题
@碟子 MSN:archor1126@163.com (推荐) QQ:9997452
请下载新版本,已经改好了
很好!
我把单击事件绑定到selectrow,感觉动作很缓慢,单击后要停一下才有相应,怎么回事?
@anni
为了即可以响应双击事件和也可以响应单击事件
所以我把单击事件设置为单击后的300毫秒后响应
导出EXCEL,在EXCEL里的显示太简单化了,可以先生成网页再导入到EXCEL里那样出来的报表就漂亮整齐多了,我花了两天的时间改进了下
@shark0304
:)
兄弟可以把代码贴出来让大家看看