SQL Server[翻译]在GridView中针对鼠标单击的某一独自单元格进行编辑

初稿地址:http://www.codeproject.com/KB/webforms/EditGridviewCells.aspx
[原稿源码下载]
[翻译改后源码下载]

[翻译]在GridView中针对鼠标单击的某一独门单元格进行编写制定

原来的文章公布日期:二〇〇五.04.07
作者:Declan
Bright

翻译:webabcd

介绍
ASP.NET的GridView控件允许你通过设置它的艾德itIndex属性来编排数据行,此时漫天数据行都处于编辑方式。
假诺您在艾德itItemTemplate的一部分列中使用了DropDownList控件,那么你大概不希望全部数据行都处于编辑形式。
因为,假诺每三个DropDownList控件都有好多挑选的话,那么一回加载全体DropDownList控件的富有选项就会招致页面执行缓慢。

除此以外,借使您的数据行的编排情势须求占用越多的空中的话,那么针对每一个单独的单元格实行编写制定要优化针对全体数据行进行编辑。
那里,作者将示范如何落到实处如此的效益,又怎么去处管事人件验证(event
validation)。

背景
正文基于自个儿事先写的一篇小说:GridView和DataList响应单击数据行和双击数据行事件。若是您不亮堂什么让GridView响应单击数据行事件,那么你能够在翻阅本文此前先看看那篇小说。

编写某2个独立的GridView单元格。
SQL Server 1

自小编所示范的这一个GridView有1个不可知的asp:ButtonField控件,它地处GridView的率先列,名为“SingleClick”。
它用来给GridView的数据行扩大单击事件。

SQL Server 2<Columns>                
SQL Server 3    <asp:ButtonField Text=”SingleClick” CommandName=”SingleClick” Visible=”False” />
SQL Server 4</Columns>

其他每一列的ItemTemplate中有二个可知的Label控件和三个不可知的TextBox或DropDownList控件。
为了方便,大家称Label为展现控件,TextBox或DropDownList为编写控件。

SQL Server 5    <asp:TemplateField HeaderText=”Task”>
SQL Server 6        <ItemTemplate>
SQL Server 7            <asp:Label ID=”DescriptionLabel” runat=”server” Text='<%# Eval(“Description”) %>’></asp:Label>
SQL Server 8            <asp:TextBox ID=”Description” runat=”server” Text='<%# Eval(“Description”) %>’ Width=”175px” visible=”false”></asp:TextBox>
SQL Server 9        </ItemTemplate>
SQL Server 10    </asp:TemplateField>

那里的主意便是用呈现控件来展现数据,当单元格所富含的显示控件被单击的时候,则把显示控件的Visible属性设置为false并且把编辑控件的Visible属性设置为true。
那里并非选择艾德itItemTemplat。

在RowDataBound事件内循环为每一数据行的每一单元格扩张单击事件。
使用单元格在数据行中的目录作为事件参数,那样在单元格触发了单击事件后我们就能够精通毕竟是哪位单元格被单击了。

SQL Server 11    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
SQL Server 12SQL Server 13    SQL Server 14{
SQL Server 15        if (e.Row.RowType == DataControlRowType.DataRow)
SQL Server 16SQL Server 17        SQL Server 18{
SQL Server 19            // 从第3个单元格内获得LinkButton控件
SQL Server 20            LinkButton _singleClickButton = (LinkButton)e.Row.Cells[0].Controls[0];
SQL Server 21            // 再次回到二个字符串,表示对包括目的控件的 ID 和事件参数的回发函数的 JavaScript 调用
SQL Server 22            string _jsSingle = ClientScript.GetPostBackClientHyperlink(_singleClickButton, “”);
SQL Server 23
SQL Server 24            // 给每2个可编写制定的单元格扩充事件
SQL Server 25            for (int columnIndex = _firstEditCellIndex; columnIndex < e.Row.Cells.Count; columnIndex++)
SQL Server 26SQL Server 27            SQL Server 28{
SQL Server 29                // 扩大列索引作为事件参数
SQL Server 30                string js = _jsSingle.Insert(_jsSingle.Length – 2, columnIndex.ToString());
SQL Server 31                // 给单元格扩张onclick事件
SQL Server 32                e.Row.Cells[columnIndex].Attributes[“onclick”] = js;
SQL Server 33                // 给单元格扩展鼠标经过时指针样式
SQL Server 34                e.Row.Cells[columnIndex].Attributes[“style”] += “cursor:pointer;cursor:hand;”; 
SQL Server 35            }     
SQL Server 36        }
SQL Server 37    }

在RowCommand事件内读出命令参数和事件参数。
那会告诉大家被入选的行和列的目录。

SQL Server 38    int _rowIndex = int.Parse(e.CommandArgument.ToString());      
SQL Server 39    int _columnIndex = int.Parse(Request.Form[“__EVENTARGUMENT”]);

因为清楚了被入选的行和列的目录,所以能够由此把展现控件的Visible设置为false,编辑控件的Visible设置为true来把某部独立的单元格设置为编写制定情势。
然后透过解决单元格的属性来删除被入选单元格的单击事件。

SQL Server 40    // 获得被入选单元格的来得控件并安装其不可知
SQL Server 41    Control _displayControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[1]; 
SQL Server 42    _displayControl.Visible = false;
SQL Server 43    // 得到被选中单元格的编纂控件并设置其可知
SQL Server 44    Control _editControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[3];
SQL Server 45    _editControl.Visible = true;
SQL Server 46    // 清除被选中单元格属性以删除click事件
SQL Server 47    _gridView.Rows[_rowIndex].Cells[_columnIndex].Attributes.Clear();

上边有一部分代码用于回发服务器后安装要点到编辑控件,假设编辑控件是DropDownList的话,那么它的SelectedValue要安装为呈现控件的值,假诺编辑控件是TextBox的话,那么为了办好编辑的准备即将使它的文件被入选。

SQL Server 48    // 设置要点到被选中的编写制定控件
SQL Server 49    ClientScript.RegisterStartupScript(GetType(), “SetFocus”, 
SQL Server 50        “<script>document.getElementById(‘” + _editControl.ClientID + “‘).focus();</script>”);
SQL Server 51    // 假使编辑控件是DropDownList的话
SQL Server 52    // SelectedValue设置为展现控件的值
SQL Server 53    if (_editControl is DropDownList && _displayControl is Label)
SQL Server 54SQL Server 55    SQL Server 56{
SQL Server 57        ((DropDownList)_editControl).SelectedValue = ((Label)_displayControl).Text;
SQL Server 58    }                 
SQL Server 59    // 如若编辑控件是Text博克斯的话则选粤语本框内文本
SQL Server 60    if (_editControl is TextBox)
SQL Server 61SQL Server 62    SQL Server 63{
SQL Server 64       ((TextBox)_editControl).Attributes.Add(“onfocus”, “this.select()”);
SQL Server 65    }

在那个德姆o中,笔者把事件被触发的历史记录也写到了页里。

一经GridView处于编辑方式以来,那么要在RowUpdating事件里去寻找被选中央银行的各样单元格。
假设发现单元格处于编辑情势以来,那么就调用“更新”代码。
在那一个德姆o中,数据保存在DataTable里,而以此DataTable则储存在session中。

SQL Server 66    // 循环每一列以找到远在编辑方式下的单元格
SQL Server 67    for (int i = 1; i < _gridView.Columns.Count; i++)
SQL Server 68SQL Server 69    SQL Server 70{
SQL Server 71        // 获得单元格的编排控件
SQL Server 72        Control _editControl = _gridView.Rows[e.RowIndex].Cells[i].Controls[3];
SQL Server 73        if (_editControl.Visible)
SQL Server 74SQL Server 75        SQL Server 76{
SQL Server 77           SQL Server 78. update the data
SQL Server 79        }
SQL Server 80    }

为了保障RowUpdating事件在编辑单元格后被鼓舞,要在Page_Load中来触发那个事件。
编辑了TextBox后,通过按回车键大概单击另一单元格来使页面做回发处理,下边包车型大巴那段代码正是用来确认保障其余数据的更改都会被更新。

SQL Server 81    if (this.GridView1.SelectedIndex > -1)
SQL Server 82SQL Server 83    SQL Server 84{
SQL Server 85        this.GridView1.UpdateRow(this.GridView1.SelectedIndex, false);
SQL Server 86    }   

为了表明而注册回发和回调数据
在RowDataBound中开创的自定义事件要求求在页中注册。
通过重写Render方法来调用ClientScriptManager.RegisterFor伊芙ntValidation。
通过GridViewRow.UniqueID再次回到行的唯一ID,按纽的唯一ID通过在行的唯一ID后附加“$ct100”而转变。

SQL Server 87    protected override void Render(HtmlTextWriter writer)
SQL Server 88SQL Server 89    SQL Server 90{
SQL Server 91        foreach (GridViewRow r in GridView1.Rows)
SQL Server 92SQL Server 93        SQL Server 94{
SQL Server 95            if (r.RowType == DataControlRowType.DataRow)
SQL Server 96SQL Server 97            SQL Server 98{
SQL Server 99                for (int columnIndex = _firstEditCellIndex; columnIndex < r.Cells.Count; columnIndex++)
SQL Server 100SQL Server 101                SQL Server 102{
SQL Server 103                    Page.ClientScript.RegisterForEventValidation(r.UniqueID + “$ctl00”, columnIndex.ToString());
SQL Server 104                }
SQL Server 105            }
SQL Server 106        }
SQL Server 107      
SQL Server 108        base.Render(writer);
SQL Server 109    }

那将预防其余“回发或回调参数无效”的错误。

本条德姆o中的其余示例
应用SQL数据源控件编辑某一独门的GridView单元格
用SqlDataSouce控件达成那些技能必要对GridView的RowUpdating事件做一些修改。
当更新GridView的行的时候,SqlDataSource控件一般要把值(values)从艾德itItemTemplate转移到NewValues集合里。
因为大家一直不利用EditItemTemplate,所以那种景况下值(values)不会活动地转移到NewValues集合里。

SQL Server 110    e.NewValues.Add(key, value);

我在App_Data文件夹下使用了一个简练的SQL Server Express数据库。
(要使用你本人的数据库的话,你能够修改web.config里的总是字符串)

运用对象数据源控件编辑某一单身的GridView单元格
本示例使用了App_Code文件夹内的多个类:
    ·Task.cs – 职务目的
    ·TaskDataAccess.cs – 管理职分指标

Aspx页的前置代码与SQL Data Source示例是一律的。
ObjectDataSource通过TaskDataAccess.cs类里的GetTasks和UpdateTask方法来治本数据。

具有电子数据表样式的GridView
那边有一个与电子数据表的体制很像的GridView。
(尽管它看起来像1个电子数据表,不过并不是确实有像电子数据表一样的效果,它依旧是一个GridView。)

此地尽管有一部分单击后转移单元格样式的附加代码,不过关键的代码照旧与地方所述是平等的。
SQL Server 111

用SQL数据源控件完结全数电子数码表样式的GridView
本示例与地方的基本相同,可是它修改了GridView的RowUpdating事件以使其允许用SqlDataSource控件来办事。
 

参考
   
·GridView和DataList响应单击数据行和双击数据行事件
    ·ASP.NET
2.0数目教程

结论
比方您想在GridView中1遍只针对三个单元格举行编辑,那么那些方式将会对您抱有扶助。

翻译注:事件表明(EventValidation)。出于安全目标,此作用验证回发或回调事件的参数是还是不是来自最初彰显这个事件的服务器控件。假设数额有效并且是预期的,则运用ClientScriptManager.RegisterFor伊夫ntValidation方法来注册回发或回调数据以进行表达。

相关文章