用GridView编辑更新独立的单元格

翻译出处:http://www.codeproject.com/KB/webforms/EditGridviewCells.aspx

源代码下载

介绍

asp.net 中,GridView允许你通过EditIndex属性来修改数据的一行,同样也必须进行整行更新。

你可能不想对整行进行更新,并且常规更新是利用EditItemTemplate,在它内部放上编辑状态所要显示的控件;而事实上,你可能只对其中一个单元格感兴趣,比如用上DropDownList来进行单元格筛选,而常规必须整行成编辑状态,那怎样才能直接只让一个独立的单元格成编辑状态呢?那就是本篇文章所要做的事情。

编辑独立的单元格

用GridView编辑更新独立的单元格
本篇提供的源代码中,
GridView的第一列是CommandNameSingleClickasp:ButtonField的控件,并且它的Visiblefalse.

这控件是为了点击GridView的某个单元格而触发点击事件:
用GridView编辑更新独立的单元格<Columns>
用GridView编辑更新独立的单元格
<asp:ButtonFieldText="SingleClick"CommandName="SingleClick"Visible="False"/>
用GridView编辑更新独立的单元格
<!--</span-->Columns>

而在其他的列中,利用ItemTemplate,在其中都有一个可见的Label控件,和不可见的TextBox或者DropdownList控件。

为了方便起见,我将叫这个Label为“非编辑状态控件”和TextBox或者DropdownList的“编辑状态控件”。
用GridView编辑更新独立的单元格<asp:TemplateFieldHeaderText="Task">
用GridView编辑更新独立的单元格
<ItemTemplate>
用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格
<asp:LabelID="DescriptionLabel"runat="server"
用GridView编辑更新独立的单元格Text
='<%#Eval("Description")%>'><!--</span-->asp:Label>
用GridView编辑更新独立的单元格
<asp:TextBoxID="Description"runat="server"
用GridView编辑更新独立的单元格Text
='<%#Eval("Description")%>'Width="175px"
用GridView编辑更新独立的单元格visible
="false"><!--</span-->asp:TextBox>
用GridView编辑更新独立的单元格
<!--</span-->ItemTemplate>
用GridView编辑更新独立的单元格
<!--</span-->asp:TemplateField>
用GridView编辑更新独立的单元格

想法是这样的,刚开始GridView处于显示状态(也就是“非编辑状态”),当某一个单元格被点击的时候,它把Label控件置不可见而编辑控件TextBox或者DropdownList置肯见,而EditItemTemplate不需要用到。

GridViewRowDataBound的事件内对每一行中的每个单元格进行遍历,让其拥有点击触发事件的能力。

给每个单元的列索引定义上一些属性参数,如onclickstyle等等。
用GridView编辑更新独立的单元格protectedvoidGridView1_RowDataBound(objectsender,GridViewRowEventArgse)
用GridView编辑更新独立的单元格用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格{
用GridView编辑更新独立的单元格
if(e.Row.RowType==DataControlRowType.DataRow)
用GridView编辑更新独立的单元格用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格{
用GridView编辑更新独立的单元格
//得到第一个单元格的LinkButton控件
用GridView编辑更新独立的单元格
LinkButton_singleClickButton=(LinkButton)e.Row.Cells[0].Controls[0];
用GridView编辑更新独立的单元格
//得到客户端javascript能够引起LinkButton回发事件的脚本
用GridView编辑更新独立的单元格
string_jsSingle=ClientScript.GetPostBackClientHyperlink(
用GridView编辑更新独立的单元格_singleClickButton,
"");
用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格
//添加事件到每个可编辑的单元格
用GridView编辑更新独立的单元格
for(intcolumnIndex=_firstEditCellIndex;columnIndex<
用GridView编辑更新独立的单元格e.Row.Cells.Count;columnIndex
++)
用GridView编辑更新独立的单元格用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格{
用GridView编辑更新独立的单元格
//插入列索引参数
用GridView编辑更新独立的单元格
stringjs=_jsSingle.Insert(_jsSingle.Length-2,
用GridView编辑更新独立的单元格columnIndex.ToString());
用GridView编辑更新独立的单元格
//给单元格添加javscript的onclick属性
用GridView编辑更新独立的单元格
e.Row.Cells[columnIndex].Attributes["onclick"]=js;
用GridView编辑更新独立的单元格
//给单元格添加鼠标样式
用GridView编辑更新独立的单元格
e.Row.Cells[columnIndex].Attributes["style"]+=
用GridView编辑更新独立的单元格
"cursor:pointer;cursor:hand;";
用GridView编辑更新独立的单元格}

用GridView编辑更新独立的单元格}

用GridView编辑更新独立的单元格}

用GridView编辑更新独立的单元格

GridViewRowCommand事件,命令参数和事件参数被重新检索,它带给我们选择某一单元格所在的行索引和列索引。
用GridView编辑更新独立的单元格int_rowIndex=int.Parse(e.CommandArgument.ToString());
用GridView编辑更新独立的单元格
int_columnIndex=int.Parse(Request.Form["__EVENTARGUMENT"]);

当所选单元格的行索引和列索引已知的情况下,单元格能够很轻松地对编辑状态进行控件的可见转换。

被选中的单元格也必须移除点击的事件。

用GridView编辑更新独立的单元格//得到选中单元格的显示控件使它不可见
用GridView编辑更新独立的单元格
Control_displayControl=
用GridView编辑更新独立的单元格_gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[
1];
用GridView编辑更新独立的单元格_displayControl.Visible
=false;
用GridView编辑更新独立的单元格
//得到选中单元格的编辑控件是它可见
用GridView编辑更新独立的单元格
Control_editControl=
用GridView编辑更新独立的单元格_gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[
3];
用GridView编辑更新独立的单元格_editControl.Visible
=true;
用GridView编辑更新独立的单元格
//移除选中单元格的点击属性
用GridView编辑更新独立的单元格
_gridView.Rows[_rowIndex].Cells[_columnIndex].Attributes.Clear();
用GridView编辑更新独立的单元格

还有一些代码是在事件回发之后在编辑控件上置焦点。如果编辑控件是一个DropDownList那么它的SelectedValue属性被置上显示控件的值,如果编辑控件是一个TextBox那么它的文本被选上将准备进行编辑。
用GridView编辑更新独立的单元格//在选中的编辑控件上置焦点
用GridView编辑更新独立的单元格
ClientScript.RegisterStartupScript(GetType(),"SetFocus",
用GridView编辑更新独立的单元格
"<script></script>document.getElementById(
用GridView编辑更新独立的单元格
'"+_editControl.ClientID+"').focus();<!--</span-->script>");
用GridView编辑更新独立的单元格
//如果编辑控件是dropdownlist置selectedValue为显示控件的值
用GridView编辑更新独立的单元格
if(_editControlisDropDownList&&_displayControlisLabel)
用GridView编辑更新独立的单元格用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格{
用GridView编辑更新独立的单元格((DropDownList)_editControl).SelectedValue
=(
用GridView编辑更新独立的单元格(Label)_displayControl).Text;
用GridView编辑更新独立的单元格}

用GridView编辑更新独立的单元格
//如果编辑控件是TextBox文本选上准备进行编辑
用GridView编辑更新独立的单元格
if(_editControlisTextBox)
用GridView编辑更新独立的单元格用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格{
用GridView编辑更新独立的单元格((TextBox)_editControl).Attributes.Add(
"onfocus","this.select()");
用GridView编辑更新独立的单元格}

用GridView编辑更新独立的单元格

在这个例子中,GridViewRowUpdating先检查每个单元格,看是否处于编辑模式下。如果处于编辑模式的单元格被找到,那么数据更新将被执行。

在第一个例子中,一些样本数据绑定到一个DataTable中存储在Session
用GridView编辑更新独立的单元格//遍历GridView的列索引查找处于编辑模式下的单元格
用GridView编辑更新独立的单元格
for(inti=1;i<_gridView.Columns.Count;i++)
用GridView编辑更新独立的单元格用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格{
用GridView编辑更新独立的单元格
//Gettheeditingcontrolforthecell
用GridView编辑更新独立的单元格
Control_editControl=_gridView.Rows[e.RowIndex].Cells[i].Controls[3];
用GridView编辑更新独立的单元格
if(_editControl.Visible)
用GridView编辑更新独立的单元格用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格{
用GridView编辑更新独立的单元格
//更新数据
用GridView编辑更新独立的单元格
}

用GridView编辑更新独立的单元格}

用GridView编辑更新独立的单元格

为了确保RowUpdatingGridView在未选中行状态下也能够被调用,例如我在编辑模式下编辑文本框点击了“Enter”键,页面整页回发,这样确保任何数据的改变被保存。
用GridView编辑更新独立的单元格if(this.GridView1.SelectedIndex>-1)
用GridView编辑更新独立的单元格用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格{
用GridView编辑更新独立的单元格
this.GridView1.UpdateRow(this.GridView1.SelectedIndex,false);
用GridView编辑更新独立的单元格}

用GridView编辑更新独立的单元格

注册回发或回调数据以进行验证

创建在RowDataBound的自定义事件必须在页面中被注册。

ClientScriptManager.RegisterForEventValuedation通过重载Render方法来调用。
用GridView编辑更新独立的单元格protectedoverridevoidRender(HtmlTextWriterwriter)
用GridView编辑更新独立的单元格用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格{
用GridView编辑更新独立的单元格
foreach(GridViewRowrinGridView1.Rows)
用GridView编辑更新独立的单元格用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格{
用GridView编辑更新独立的单元格
if(r.RowType==DataControlRowType.DataRow)
用GridView编辑更新独立的单元格用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格{
用GridView编辑更新独立的单元格
for(intcolumnIndex=_firstEditCellIndex;columnIndex<
用GridView编辑更新独立的单元格r.Cells.Count;columnIndex
++)
用GridView编辑更新独立的单元格用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格{
用GridView编辑更新独立的单元格Page.ClientScript.RegisterForEventValidation(
用GridView编辑更新独立的单元格r.UniqueID
+"$ctl00",columnIndex.ToString());
用GridView编辑更新独立的单元格}

用GridView编辑更新独立的单元格}

用GridView编辑更新独立的单元格}

用GridView编辑更新独立的单元格
用GridView编辑更新独立的单元格
base.Render(writer);
用GridView编辑更新独立的单元格}