商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
信箱 E杂志
您的位置:首页 > 技术频道 > 正文

GridView中单击的独立单元格进行编辑

作者:webabcd [翻译]  2007-04-23

作者:Declan Bright
翻译:webabcd
【IT168 技术文档】



介绍
ASP.NET的GridView控件允许你通过设置它的EditIndex属性来编辑数据行,此时整个数据行都处于编辑模式。 如果你在EditItemTemplate的一些列中使用了DropDownList控件,那么你也许不希望整个数据行都处于编辑模式。 因为,如果每一个DropDownList控件都有很多选项的话,那么一次加载所有DropDownList控件的所有选项就会导致页面执行缓慢。

另外,如果你的数据行的编辑模式需要占用更多的空间的话,那么针对每一个独立的单元格进行编辑要优于针对整个数据行进行编辑。 这里,我将示范如何实现这样的功能,又如何去处理事件验证(event validation)。


背景
本文基于我之前写的一篇文章:GridView和DataList响应单击数据行和双击数据行事件。如果你不知道如何让GridView响应单击数据行事件,那么你可以在阅读本文之前先看看这篇文章。


编辑某一个独立的GridView单元格。


我所演示的这个GridView有一个不可见的asp:ButtonField控件,它处于GridView的第一列,名为“SingleClick”。 它用于给GridView的数据行增加单击事件。

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

其它每一列的ItemTemplate中有一个可见的Label控件和一个不可见的TextBox或DropDownList控件。 为了方便,我们称Label为显示控件,TextBox或DropDownList为编辑控件。
    <asp:TemplateField HeaderText="Task">
        
<ItemTemplate>
            
<asp:Label ID="DescriptionLabel" runat="server" Text='<%# Eval("Description") %>'></asp:Label>
            
<asp:TextBox ID="Description" runat="server" Text='<%# Eval("Description") %>' Width="175px" visible="false"></asp:TextBox>
        
</ItemTemplate>
    
</asp:TemplateField>

这里的办法就是用显示控件来显示数据,当单元格所包含的显示控件被单击的时候,则把显示控件的Visible属性设置为false并且把编辑控件的Visible属性设置为true。 这里不用使用EditItemTemplat。

在RowDataBound事件内循环为每一数据行的每一单元格增加单击事件。 使用单元格在数据行中的索引作为事件参数,这样在单元格触发了单击事件后我们就可以知道到底是哪个单元格被单击了。
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    
{
        
if (e.Row.RowType == DataControlRowType.DataRow)
        
{
            
// 从第一个单元格内获得LinkButton控件
            LinkButton _singleClickButton = (LinkButton)e.Row.Cells[0].Controls[0];
            
// 返回一个字符串,表示对包含目标控件的 ID 和事件参数的回发函数的 JavaScript 调用
            string _jsSingle = ClientScript.GetPostBackClientHyperlink(_singleClickButton, "");

            
// 给每一个可编辑的单元格增加事件
            for (int columnIndex = _firstEditCellIndex; columnIndex < e.Row.Cells.Count; columnIndex++)
            
{
                
// 增加列索引作为事件参数
                string js = _jsSingle.Insert(_jsSingle.Length - 2, columnIndex.ToString());
                
// 给单元格增加onclick事件
                e.Row.Cells[columnIndex].Attributes["onclick"= js;
                
// 给单元格增加鼠标经过时指针样式
                e.Row.Cells[columnIndex].Attributes["style"+= "cursor:pointer;cursor:hand;"
            }
     
        }

    }

在RowCommand事件内读出命令参数和事件参数。 这会告诉我们被选中的行和列的索引。
    int _rowIndex = int.Parse(e.CommandArgument.ToString());      
    
int _columnIndex = int.Parse(Request.Form["__EVENTARGUMENT"]);
1 2 3
【内容导航】
第1页: 第1页 第2页: 第2页
第3页: 第3页
©版权所有。未经许可,不得转载。
[责任编辑:孙蓬阳]