在GridView更新后覆盖editindex

时间:2010-02-12 21:51:59

标签: asp.net gridview

我有一个GridView控件连接到一个数据源,我允许行编辑。我使用指向更新,取消和编辑GridView命令的标准编辑/保存/删除按钮。

我想添加一个额外的按钮,“下一步”与保存/取消按钮内联。这将与保存按钮的功能相同,但也会向网格添加一行,并将该行置于编辑模式。为此,我将代码添加到GridView的Updated事件中,该事件向db添加新记录,重新绑定网格并设置editindex。这似乎有效,但网格实际上并没有在编辑模式下返回。我删除了新的记录代码,只是将语句留下来设置editindex,但网格仍然不会保持编辑模式。

在这种情况下,是否可以强制网格保持编辑模式?似乎除非您设置GridViewUpdatedEventArgs的取消属性,否则网格将转换为查看模式。我不想在这种情况下设置cancel属性,因为我希望GridView触发我的数据源对象来保存记录。

如果这不起作用,似乎我需要允许更新正常发生,返回到客户端,然后发送另一个服务器请求来添加记录。我不想这样做,我想在一次往返的情况下执行必要的操作。

以下是代码(简化)的样子:

protected void Button1_Click(object sender, EventArgs e)
    {
        // Works Fine
        this.sampleDataSource.Insert();
        this.sampleGridView.DataBind();
        this.sampleGridView.EditIndex = this.sampleGridView.Rows.Count - 1;
    }

protected void sampleGridView_RowUpdated(object sender, GridViewUpdatedEventArgs e)
    {
        // Grid will display new row, but will not be in edit mode
        this.sampleDataSource.Insert();
        this.sampleGridView.DataBind();
        this.sampleGridView.EditIndex = this.sampleGridView.Rows.Count - 1;
    }

3 个答案:

答案 0 :(得分:1)

我找到了一个似乎可以做我想要的解决方案。基本上我需要让GridView通过正常的事件序列,然后设置editindex。这里的代码再次简化:

protected void sampleGridView_RowUpdated(object sender, GridViewUpdatedEventArgs e)
    {
        this.insertNewRow = true;
    }

protected void Page_LoadComplete(object sender, EventArgs e)
    {
        if (this.insertNewRow)
        {
            this.sampleDataSource.Insert();
            this.sampleGridView.DataBind();
            this.sampleGridView.EditIndex = this.sampleGridView.Rows.Count - 1;
        }     
    }

答案 1 :(得分:0)

我们可能需要查看一些代码...但是,我可以从您的描述中猜出问题所在。您可能需要将EditIndex previous 设置为重新绑定。如果这不起作用(超出范围异常?),那么你必须调用DataBind()来获取你的新行,设置EditIndex,再次调用DataBind()。

不幸的是,只是设置EditIndex并没有真正完成工作。您必须设置索引并调用DataBind()。

答案 2 :(得分:0)

我在设置所需索引方面遇到了类似的问题。这个解决方案对我有用: grdProjectsForSubmiting - 用于显示数据的GridView

grdProjectsForSubmiting.EditIndex = neededIndex; //不要忘记,行从0开始枚举,而不是从1 !! grdProjectsForSubmiting.DataSource = ProjectsController.SessionTodayEntries;
grdProjectsForSubmiting.DataBind();