Posted on 2007-04-22 20:45
webabcd 阅读(12834)
评论(97) 编辑 收藏 网摘 所属分类:
Translation翻译.NET Control
Feedback
@哈密瓜牌牛奶
:)
同感,正准备应用到一些项目中
不知道有没有想过把这个功能结合你之前扩展的那个gridview控件那里呢?
效果不错.
不过一般的项目赶时间不敢用...
学习了.....
谢谢,,
让我试试(呵呵),他这个编辑的原理好像就是用一个button模拟出编辑更新按钮,是吗?如果加上判断,数据没有更新时不回发,那可能性能上会有很大的改进。
能不能做到点击后整行处于编辑状态啊?这样要改一行数据的时候就方便多了
楼主试试在SQL里跟踪一下,一点击他做了9次的select操作,如果数据量大的话这可不简单啊。你那里是这样吗?
@ivw
是,更新就是用GridView.UpdateRow方法
没有更新时也要会回发的,比如要把TextBox变成Label
点击后整行处于编辑状态其实就是响应一下行的单击事件,让鼠标单击行后相当于单击了行的CommandName="Edit"的按钮就ok
跟踪了一下,一次select操作
改成这个我这里试不成功。CommandName="Edit";
我改用了SQL2000,跟踪的确发生了9次select操作,你那就没有,真的奇怪了,代码我没有改过。
把这功能放到你那扩展的gridview控件里基本成功,不过如果还有一些问题没解决。
@ivw
没问题的,当然要有EditItemTemplate
列索引是事件的参数,读取的时候这么读Request.Form["__EVENTARGUMENT"]
列索引知道了,列的值就能读出来了
请问EditItemTemplate这里是添加一个编辑、更新、取消那个按钮吗?
@ivw
Render那段是为了实现事件验证(EventValidation),是出于安全目的的,所以去掉也没问题
可以用CommandField
或者自己写按钮然后设置CommandName
我用了edit后他只能编辑第1列,其它不能编辑啊。
如果把 private const int _firstEditCellIndex = 1;设成1下面这两句就会提示超出范围。你有试过吗/
Control _displayControl = _gridView.Rows[e.RowIndex].Cells[i].Controls[1];
Control _editControl = _gridView.Rows[e.RowIndex].Cells[i].Controls[3];
好像看到他一定要保留一列不给编辑,否则就会在查找控件的时候出错,超出范围。
@ivw
CommandName="Edit",就是现实编辑模板,看看你的编辑模板里怎么写的,就知道了
那是因为你的索引为1的这个单元格没有文中所谓的显示控件或编辑控件
本文的示例并不通用,需要具体需求做具体修改
文中示例的第一列其实就是按钮
不错。
如果能做到批量提交就更好了。每次可以编辑很多行,然后一次性提交
页面的数据量会稍微大一些,但是我想没关系。只要做好分页,也不会达到哪里去。
对,这种方法只合适单个单元格编辑使用,而且如果数据量大对速度影响很大。如果能做到像Winform的grid那样就完美了,呵呵
@随心所欲
@ivw
肯定是可以,曾经做过一个有相似需求的项目
我的实现方法是这样
在客户端对table编辑还算是简单,更新相关td的innerHTML就行了,插入行删除行用js也都能实现
把所有对table的更新放到js的dom中,然后与一个hiddenfield同步,然后提交后批量更新数据库
@ivw
公司项目,不能放上来啊
原理就如我上面所说的
兄弟想要实现的话
google一下js操作table以及js的dom,把这两个搞通了,实现那个功能就小case了
我的意思是说如果列中用的是checkbox或下拉框,那用js怎样编辑table啊?
@ivw
原来我做的都是文本的,哈
如果给td增加checkbox或下拉框,我觉得一样是设置td的innerHTML
如果是下拉的话就要读库中的资料那怎么办啊,编辑TD的时候读库很麻烦的啊。
还有啊,兄弟,一直都想问问你,自己写的控件库怎么做才能不给别人随便调用啊?
@ivw
既然想全客户端的就尽量不读数据库,不用ajax
有下拉的话就要在起初加载的时候把数据放到页面上
写的库不让别人调用?那就让你库里的所有类都继承自一个基类,然后在这个基类里按mac之类的做判断
要想不让别人篡改就用snk
这样做是不是别人不能从工具栏那里添加自己写的DLL来调用控件啊?
@ivw
控件的话就在构造函数里判断mac之类的,以决定让谁用
判断网卡MAC地址啊?继承自一个基类,他半身要继承例如Controls这样的类,还可以再继承其它类吗?
@ivw
单纯类库的话最好继承自一个基类
控件的话写在构造函数里就ok了
判断mac还是cpu序列号之类的要看你的需求了
有个问题就是,如果使用WMI取硬件的信息很多时候会出现问题。你有API取mac或cpu序列号的资料吗?
@ronglj
测试过,没问题的
看看sqlserver2005 express的服务启没启
程序没问题的,我试过了,他本来用的是SQL2005,如果你机上的是SQL2000就要把连接串改,还 有表名也要改的。
兄弟,有个菜问题问问你。自定义控件的构造函数在那啊?
@ivw
以我写的扩展GridView为例
public class SmartGridView : GridView
{
public SmartGridView()
{
// 构造函数
}
}
如果是这样,那不是要每个控件里都做判断吗?如果判断硬件信息的话那如果把程序放到其它机上就用不了啦?
@ivw
是这样的
你不是不想让别人用吗,那要根据一些信息判断啊
请问为什么我在gridview控件里做了行的单击事件,用ajax调用后台进行select,如果查找带return的话他会做两次的select操作啊?gridview控件放在UpdatePanel控件里。
@ivw
是用数据源控件吗?数据源控件会自动select的,所以你自己再select的话就是两遍
是用数据源,但如果我没有返回值他就不会select两次了。有办法解决吗
但他出现两次的不是数据源那条sql语句,而是我调用时使用的sql语句。
刚才我跟踪多次发现问题可能出现在Fill()跟ExecuteNonQuery()这里的问题,他们各自都要select一次,把数据填充到dataset里除了Fill()还有什么更好的办法啊?
@ivw
兄弟确实奇怪的问题
填充到dataset,用fill是最简单的了
不过现在很少写数据层的代码了,因为用.net 2.0里的强类型dataset和datatableadapter实在是太简单了
呵呵 ,兄弟有没有NetAdvantage 2006 的破解啊?我想要里面的那个grid控件啊,web的grid控件实在太基本了。或者有没有其它更好的grid控件啊?
有没有其它更好的grid控件啊?最好是像winform那个grid差不多的。
请问兄弟,用JS怎样帮 ObjectDataSource 控件里的某个Parameter 中的DefaultValue 赋值啊?如下,怎样在js里重新赋值给DefaultValue啊?
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Select" TypeName="CommandCS">
<SelectParameters>
<asp:Parameter DefaultValue="select * from temp" Name="sqltxt" Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
@ivw
这样的grid就算有也肯定是收费的吧,我是没有
别想用js控制ObjectDataSource了
因为ObjectDataSource不会解析到客户端
哦,
ObjectDataSource那里我找到其它办法了。谢谢了。
我直接引用了你的DLL文件,把一个gridview放到WEBFORM里.
然后编辑里面的两个按钮事件,为什么运行的时候单击gridview没反映呢?似乎并没有和按钮的事件绑定...
@周
设置GridView的OnRowCommand
然后在codebehind的RowCommand里捕获按钮的点击事件
为什么我只需要对一列编辑,则会出现index出错呢。
Control _displayControl = _gridView.Rows[j].Cells[i].Controls[1];---该处出错
Control _editControl = _gridView.Rows[j].Cells[i].Controls[3];
@dunzimu
那是因为你的索引为1的这个单元格没有文中所谓的显示控件或编辑控件
本文的示例并不通用,需要具体需求做具体修改
if (this.GridView1.SelectedIndex > -1)
{
this.GridView1.UpdateRow(this.GridView1.SelectedIndex,false);
}
if (this.GridView1.SelectedIndex > -1)
{
this.GridView1.UpdateRow(this.GridView1.SelectedIndex,false);
} 这段代码,我怎么在page_Load里怎么不能获得this.GridView1.SelectedIndex
if (this.GridView1.SelectedIndex > -1)
{
this.GridView1.UpdateRow(this.GridView1.SelectedIndex,false);
} 这段代码,我怎么在page_Load里怎么不能获得this.GridView1.SelectedIndex ,selectedindex始终都没有获得索引
@迷失者
不要在Page_Load里写
应该写在GridView的SelectedIndexChanged里
SelectedIndexChanged
这个事件,根本没有激发,是不是哪里还得设置一下。。
_firstEditCellIndex这个变量,楼主你是在哪里定义
@学习者
并没有把所有代码都贴出来
因为太长了
提供下载的源代码里有
问题是 好像更改后必须点击GRIDVIEW区域 才能更新
@拒绝潜水的鱼
是的
因为这里
string _jsSingle = ClientScript.GetPostBackClientHyperlink(_singleClickButton, "");
单击单元格才会回发
可以改一下
@szliu
代码里有这句的
只不过这里贴的只是关键代码
要看全部代码的话请下载源码
运行到"// 获得被选中单元格的显示控件并设置其不可见
Control _displayControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[1];"报这个错误
“索引超出范围。必须为非负值并小于集合大小。
参数名: index”
运行到"// 获得被选中单元格的显示控件并设置其不可见
Control _displayControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[1];"报这个错误
“索引超出范围。必须为非负值并小于集合大小。
参数名: index”
你没重新绑定数据
@安抚
:)
是指我提供的那个demo吗?
没有那个问题啊
NONONO 我说的是84的楼的问题
再次感谢你 嘿 刚好经理要我们坐类似的东西 你的源代码很好 帮了大忙了
您好,有个问题请教下,你给的demo中MasterDetail那个页面的功能
如果主表的GRIDVIEW有多列的话 从表的GIRDVIEW应该怎么放 才能让格式不乱呢
我想在主GRIDVIEW行的下面显示从GRIDVIEW,如果把从GRIDVIEW放在一个列里的话,显示的时候包含它的主GRIDVIEW列太宽了,而且其他列都是空白,难看死了
@安抚
那就这么解决
单击行后,行下面插入一行合并了所有单元格的行
然后在这个行中加入子GridView
当然可能也有别的解决办法,google一下应该会很有收获
每次点击单元格都要刷新 要是无刷新的就好了 嘿 能AJAX来实现无刷新么?
@sunday00
:)
可以的
完全支持UpdatePanel
楼主,你有vb版的吗?能否给我发一份。我现在正好非常需要,非常感谢。