点击 GridView 行的任意位置以进入编辑模式

6
我希望使用单击网格视图中的任何一行来复制编辑按钮的功能。
以下代码可以做到这一点,但存在一个主要问题:如果用户从一个文本框点击到下一个文本框,编辑命令会再次触发,并且对先前文本框所做的更改将恢复为原始值。
如何修复此行为?是否有更好的方法来实现此目标?
编辑:通过添加对 row.RowState.HasFlag( DataControlRowState.Edit ) 的检查来解决了此问题。请参见下面的代码:
protected override void Render( System.Web.UI.HtmlTextWriter writer )
{
    foreach( GridViewRow row in gvwOrderItems.Rows )
    {
        if( row.RowType == DataControlRowType.DataRow &&
            row.RowState.HasFlag( DataControlRowState.Edit ) == false )
        {
            // enable click on row to enter edit mode
            row.Attributes["onclick"] =
                ClientScript.GetPostBackClientHyperlink( gvwOrderItems, "Edit$" + row.DataItemIndex, true );
        }
    }
    base.Render( writer );
}

我在RowDataBound处理程序中添加了此代码,然后不再使用row.DataItemIndex作为第二个参数,而是使用了gv.DataKeys(e.Row.RowIndex).Value。然后我在RowEditing事件中捕获该事件,并且e.NewEditIndex成为我的项ID,而非行索引。 - yougotiger
2个回答

7
检查 row.RowState.HasFlag(DataControlRowState.Edit)
protected override void Render( System.Web.UI.HtmlTextWriter writer )
{
    foreach( GridViewRow row in gvwOrderItems.Rows )
    {
        if( row.RowType == DataControlRowType.DataRow &&
            row.RowState.HasFlag( DataControlRowState.Edit ) == false )
        {
            // enable click on row to enter edit mode
            row.Attributes["onclick"] =
                ClientScript.GetPostBackClientHyperlink( gvwOrderItems, "Edit$" + row.DataItemIndex, true );
        }
    }
    base.Render( writer );
}

谢谢,我已经浏览了很多网站好几天了,但是代码不完整或者无法运行。这个例子非常接近我所需要的,非常棒! - codeape
我已经在单击事件中将GridView行设置为可编辑状态,现在如何在执行编辑后保存... - Rama Priya
@jim31415 我的项目需要相同的功能,但在 hasflag 下我遇到了以下错误:Error 8 'System.Web.UI.WebControls.DataControlRowState' 不包含 'HasFlag' 的定义,也没有接受类型为 'System.Web.UI.WebControls.DataControlRowState' 的第一个参数的扩展方法 'HasFlag' 可用(您是否缺少使用指令或程序集引用?)你遇到过这个问题吗? - HackMaster

0

我没有测试过这个,因为我不使用GridView,但我用其他控件做到了。你应该能够在行中放置隐藏按钮,并通过JavaScript调用行上的Click

protected override void Render( System.Web.UI.HtmlTextWriter writer )
{
    foreach( GridViewRow row in gvwOrderItems.Rows )
    {
        if( row.RowType == DataControlRowType.DataRow )
        {
            Button b = new Button();
            b.ID = "whatever";
            b.CommandName = "edit";
            b.Attributes.Add("style","display:none;")
            row.Controls.Add(b);
            // enable click on row to enter edit mode
            row.Attributes.Add("onclick" ,"document.getElementById('" bla.ClientID "').click();");
        }
    }
    base.Render( writer );
}

我遇到了相同的问题。一旦进入编辑模式,单击文本框会再次触发编辑命令。 - jim31415

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接