让你的GridView、DataList 的数据行同时具有单击或双击选中的功能

winform 所有DataGridView触发的事件和说明举例 阅读详情

  [本文系原创翻译,转载请注明出处]    

     Note: 

        英文原文链接:http://www.codeproject.com/KB/webforms/DoubleClickGridviewRow.aspx

        网上有很多方法不仅可以实现在GridView的一行的任意位置单击实现选中功能,而且也可以实现双击选中的功能。但我还没有遇到过能同时具有单击和双击功能,并且可以很好的解决event validation errors 。

    这里,我将给出一种可以在ASP.NET2.0下同时实现行的单/双击选中行的方法,其适用范围有 GridView, DataList , ListBox等控件。

  

 背景:

  当开发一个ASP.NET的应用程序去代替传统的Windows应用程序,经常被要去使其用户体验接近于传统模式。传统的应用程序允许用户选中工具栏中的行,并执行其事件响应。通过点击一行,可以打开另一个Form,并看到其细节。这种功能可以很容易的通过在GridView中设置两个隐藏的ButtonField去实现,当然我要做的比这样更好。


  可单/双击的GridView

  创建一个Web应用程序,其默认页面为Default.aspx. 现在, 事 EnableEventValidation="false" . 我们以后再移除它.添加一个 GridView并绑定数据源. 在GridVIew上点击-编辑列-添加两个 asp:ButtonField . 分别为其命名为 SingleClick和DoubleClick. 

   

<Columns>
    <asp:ButtonField Text="SingleClick" CommandName="SingleClick" />
    <asp:ButtonField Text="DoubleClick" CommandName="DoubleClick" />
</Columns>

    添加GridView的 RowCommand事件,并用Switch语句去捕获其选中事件。下面的示例将在页面显示你所选中过GridView行的索引列表。 

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    GridView _gridView = (GridView)sender;

    // Get the selected index and the command name

    int _selectedIndex = int.Parse(e.CommandArgument.ToString());
    string _commandName = e.CommandName;

    switch (_commandName)
    {
        case ("SingleClick"):
            _gridView.SelectedIndex = _selectedIndex;
            this.Message.Text += "Single clicked GridView row at index "
            + _selectedIndex.ToString() + "<br />";
        break;
        case ("DoubleClick"):
            this.Message.Text += "Double clicked GridView row at index "
            + _selectedIndex.ToString() + "<br />";
        break;
    }
}

      添加  RowDataBound 事件在绑定数据时修改每一行的属性。现在,我们需要为每一行添加客户端脚本(即添加onclick),该脚本作用于SingleClick按钮。

if (e.Row.RowType == DataControlRowType.DataRow)
{
    // Get the LinkButton control in the first cell

    LinkButton _singleClickButton = (LinkButton)e.Row.Cells[0].Controls[0];
    // Get the javascript which is assigned to this LinkButton

    string _jsSingle = 
    ClientScript.GetPostBackClientHyperlink(_singleClickButton, "");
    // Add this javascript to the onclick Attribute of the row

    e.Row.Attributes["onclick"] = _jsSingle;
}

   同理,我们可以对DoubleClick按钮做同样操作,但两者不会同时起作用。

 

if (e.Row.RowType == DataControlRowType.DataRow)
{
    // Get the LinkButton control in the second cell

    LinkButton _doubleClickButton = (LinkButton)e.Row.Cells[1].Controls[0];
    // Get the javascript which is assigned to this LinkButton

    string _jsDouble = 
    ClientScript.GetPostBackClientHyperlink(_doubleClickButton, "");
    // Add this JavaScript to the ondblclick Attribute of the row

    e.Row.Attributes["ondblclick"] = _jsDouble;
}
   虽然我们实现了响应单击和双击事件,但实际我们只能得到单击响应的功能。因为如果用户进行了双击,双击中的第一次就被作为单击响应。JS中的setTimeout方法可以对第一次响应设置超时,这样用户就可以完成一次双击。 

οnclick="javascript:__doPostBack('GridView1$ctl02$ctl00','')"

      将超时设置为300毫秒

οnclick="javascript:setTimeout
        ("__doPostBack('GridView1$ctl02$ctl00','')", 300)"

      完整的DataRowBound的代码如下:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Get the LinkButton control in the first cell

        LinkButton _singleClickButton = (LinkButton)e.Row.Cells[0].Controls[0];
        // Get the javascript which is assigned to this LinkButton

        string _jsSingle = 
        ClientScript.GetPostBackClientHyperlink(_singleClickButton, "");
        // To prevent the first click from posting back immediately

        // (therefore giving the user a chance to double click) 

    // pause the postbackfor 300 milliseconds by 

        // wrapping the postback command in a setTimeout

        _jsSingle = _jsSingle.Insert(11, "setTimeout(\"");
        _jsSingle += "\", 300)";
        // Add this javascript to the onclick Attribute of the row

        e.Row.Attributes["onclick"] = _jsSingle;

        // Get the LinkButton control in the second cell

        LinkButton _doubleClickButton = (LinkButton)e.Row.Cells[1].Controls[0];
        // Get the javascript which is assigned to this LinkButton

        string _jsDouble = 
        ClientScript.GetPostBackClientHyperlink(_doubleClickButton, "");
        // Add this javascript to the ondblclick Attribute of the row

        e.Row.Attributes["ondblclick"] = _jsDouble;
    }
}

    此时,这两个按钮应该设置为隐藏

    

<Columns>
    <asp:ButtonField Text="SingleClick" CommandName="SingleClick" 
                            Visible="false" />
    <asp:ButtonField Text="DoubleClick" CommandName="DoubleClick" 
                            Visible="false" />
</Columns>
    

    现在,RowCommand可以同时捕捉到GridView一行的单双击事件了。

    
    注册用以验证的postback 和callback数据


 一切都运行的很好,请别忘记一开始我们设置了 EnableEventValidation="false"  ,这不是安全的选项,我们要移除它。这在单击时将导致出现"Invalid postback or callback argument" 错误。这个错误告诉我们去使用theClientScriptManager.RegisterForEventValidation 去注册postback或callback数据。
  ClientScriptManager.RegisterForEventValidation可以被重载的Render方法调用。这里的关键是注册GridView一行的两个按钮个unique Id。每一行的UniqueID被转换为GridView.UniqueID,第一个按钮的UniqueID仅需要在GridView.UniqueId的后面就附加上”$ctl00“,第二个按钮则附加上 "$ctl01".

 

   
protected override void Render(HtmlTextWriter writer)
{
    foreach (GridViewRow r in GridView1.Rows)
    {
        if (r.RowType == DataControlRowType.DataRow)
        {
            Page.ClientScript.RegisterForEventValidation
                    (r.UniqueID + "$ctl00");
            Page.ClientScript.RegisterForEventValidation
                    (r.UniqueID + "$ctl01");
        }
    }

    base.Render(writer);
}


现在将不会出现任何“invalid postback or callback argument”错误了。


    结论

      通过JS与ASP.NET的紧密结合,我们可以扩展GridView和DataList的功能。为了你的程序的安全,如果可以的话,你不应该将EnableEventValidation="false" 。一旦你理解了EventValidation是如何工作的,你可以使用ClientScript.RegisterForEventValidation却包你的代码执行的更安全


   

掌握*** GridView单击与双击行事件处理 本文还有配套的精品资源,点击获取 简介:本文介绍了***中GridView控件的单击和双击行事件处理方法。通过为GridView的行添加LinkButton或Button控件以及编写JavaScript或jQuery代码,模拟出单击和双击事件。详细阐述了实现步骤,包括设置控件属性、编写后台事件处理函数以及服务器端方法响应AJAX请求。同时提供了示例代码,并探讨了性能优化技巧... 阅读详情

相关推荐

鼠标手势变成放大镜

通过css替换鼠标形状,变成放大镜和缩小镜,适合图片操作的时候使用。

C#中DataGridView鼠标左键双击事件的添加

在DataGridView中查看数据,有时需要进行单个数据的详细分析,那么用到鼠标双击事件就很方便了。 首先,要在DataGridView所在的Designer.cs中添加鼠标双击事件;找到DataGridView在Designer.cs中的位置,添加以下代码 this.dataGridView1.CellMouseDoubleClick += new System.Windows.Forms

Tiger_shl的博客 1万+

c#神经网络手势识别

c#神经网络手势识别 本人收藏了3年的资源 现放出 都是总结了很多系统 软件项目实施过程中的经验的 慢慢积累的

点击DataGridView里面的某一个单元格的事件

 private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)         {             if (e.ColumnIndex == 2)             {                 this.dataGridView2.Controls.Clear()

Sara_xie的专栏 1万+

未隔离电源设备使用usb转串口调试导致串口模块爆炸烧坏事故记录

这个事就发生在前两天,我们公司的wifi模块被客户用到了咖啡机上,客户寄了一台整机给我们协助调试,还送了几包咖啡豆,本想着还能打个咖啡喝一喝的,但就在咖啡机刚寄过来第一天,就出事了。而这个事故的发生,竟然仅仅是因为同事接了个串口模块到电脑调试打印导致的。谁也想不到,这个3.3V的供电的wifi模块居然还有这么大的威力。直接将usb转TTL串口模块的转换芯片给爆开了,咖啡机也给弄坏了,据同事描述当时情况就只见到一片火光和一声巨响,状况比较惨烈,所幸的是笔记本电脑没有烧坏,但是直接给崩蓝屏了。 ...

fangye945a的博客 6190

Ruoyi-Cloud-Plus新手必看:Gateway启动失败的两种解决方案(Nacos配置空间问题)

本文详细解析了Ruoyi-Cloud-Plus框架中Gateway启动失败的常见原因及解决方案,重点围绕Nacos配置空间问题展开。针对新手开发者,提供了两种实用方案:快速切换到public空间或规范创建dev空间并迁移配置,帮助开发者高效解决网关启动故障,确保微服务项目顺利运行。

weixin_30872499的博客 490

GridView行的单击/双击事件

为GridView的行添加单击/双击事件: 一:单击/双击事件一般情况下是不能同时使用的,点加行事件有几种方式:protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { for (int i = 0; i &lt; GridView1.Rows.Count + 1; i++) { ...

web开发自学 795

LibTV本地部署:AI漫剧创作完整解决方案与实战指南

如果你正在关注AI漫剧创作这个赛道,可能会发现一个有趣的现象:市面上的AI视频工具要么功能单一,要么云端服务昂贵且存在内容审核风险。而今天要介绍的LibTV本地部署方案,或许能为你打开一扇新的大门。 这个方案的核心是Seedance2.0与豆包AI的本地化集成,它真正解决的是创作者对内容自主权、成本控制和创作效率的三重需求。与红果、抖音等平台提供的标准化AI工具相比,本地部署意味着你可以完全掌控生成过程,不受平台规则限制,更重要的是——所有数据都在本地,不存在内容泄露风险。 1. 这篇文章真正要解决的问题

weixin_28745309的博客 520

支持行单击、双击事件的GridView和DataList控件(译)

支持行单击、双击事件的GridView和DataList控件(译) 让GridView 和 DataList 控件响应鼠标单击、双击事件。并且,使用 ClientScript.RegisterForEventValidation 来注册相关事件避免禁用事件验证。 介绍 网上有不少关于实现GridView行单击、双击事件的代码。但是我还没见过可以同时处...

weixin_30446613的博客 317

jenkins连接外部k8s集群

k8s连接集群外Jenkins

liuchao666888的博客 1527

ccproxy 6.61 注册机(纯绿/傻瓜/真正去除线程限制)

导读:   软件介绍   1、 CCPROXY 6.61 注册机(纯绿/傻瓜/真正去除线程限制)   ***前言,这次的升级官方改动不大,据说只是为了不被某些软件当病毒***   附件包中解压即免安装版,CcREGTOOLFF.exe为注册机。   本人继续向大家隆重推出《CCPROXY6.61哎呀……破解版》   还是那个提示:   在此之前,本人还是那句老话想提示大家,CCPROXY是

i53nd的专栏 1万+

GridView, DataList and ListBox 行 单击与双击事件处理

前台页面放置GridView,DataList和ListBox控件 代码<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="Admin_Default"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Trans...

weixin_30950237的博客 190

【详细图文】使用MobaXterm的SSH功能远程连接服务器,并创建pytorch环境,使用yolov8训练数据集

使用MobaXterm的SSH功能远程连接服务器,并创建pytorch环境,使用yolov8训练数据集,以及MobaXterm使用介绍和linux基础命令介绍。

qq_62844901的博客 3382

gridview repeater DataList 鼠标经过改变背景颜色

<br />1.gridview<br />双击GridView的OnRowDataBound事件; <br />在后台的GridView1_RowDataBound()方法添加代码,最后代码如下所示:<br />protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { //首先判断是否是数据行 if (e.Row.RowType == DataControlRo

Wayne_C的Blog 866

玩转Docker小游戏项目系列:Docker部署魔塔网页经典小游戏

玩转Docker小游戏项目系列:Docker部署魔塔网页经典小游戏

jks212454的博客 1063

全志F1C200S嵌入式驱动开发(lcd屏幕驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 lcd RGB屏幕作为比较经济、实用的显示工具,在实际场景中使用较多。它的信号来说,一般也比较简单,除了常规的数据信号,剩下来就是行同步、场同步、数据使能和时钟信号了。数据信号方面,常见的格式有RGB888、RGB666、RGB565。为什么有什么多选择,主要还是取决于soc pin脚的多少来定。当然,pin脚越多,显示的颜色就越精准,还原度就越高。 举例来说,假设

嵌入式-老费,一个分享专业嵌入式知识的blog 2792

repeater单双行颜色不同,gridview repeater DataList 鼠标经过改变背景颜色

1.gridview 双击GridView的OnRowDataBound事件;在后台的GridView1_RowDataBound()方法添加代码,最后代码如下所示: protectedvoidGridView1_RowDataBound(objectsender,GridViewRowEventArgse) {//首先判断是否是数据行...

m0_55208453的博客 121

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ASP学生信息的增删改查(GridView控件、DataList控件的使用)

创建DBhelp.cs,编写连接数据库的代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.SqlClient; /// <summary> ///DBhelp 的摘要说明 /// </summary> public static class DBhelp { static strin...

dengfengling999的博客 1567

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ADO.NET之数据访问控件和数据源控件 学习记录(二)

参考《ASP.NET 4.0MVC 敏捷开发给力起飞》 ADO.NET是为了在应用程序中将数据访问从数据操作中分离出来,因此ADO.NET由两大核心组件构成:.NET数据提供程序和数据集(DataSet)。 从ASP.NET 2.0开始就引入了一系列改善数据访问的工具,包括数据源和数据绑定控件。 1⃣️数据源控件 可以很容易地与SQL语句或存储过程相关联,并将它们绑定到数据绑定控件,减少代码的编写...

u012404594的博客 1128

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# GridView使用 与 DataList分页。

3. 使用"编辑" 功能 1 先添加一列 "编辑、更新、取消" 2 GridView 属性的 事件里 有RowEditing 双击进入后台: protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) { int index =...

oBinLunia的专栏 158
上一篇: 使用ADO.NET的DbProviderFactory读取或写入Excel中的表单
下一篇: 在ASP.NET中配置FCKeditor【带word导入功能】
auto_ptr
博客等级 码龄20年 18粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值