Gridview RowUpdating事件未触发

时间:2009-06-08 20:26:38

标签: asp.net events gridview viewstate

我有一个AutoGenerateColumns="False"的Gridview 我正在使用TemplateField在相应的ItemTemplate和EditItemTemplate字段中的GridView的第一列中显示我的编辑,更新和取消'按钮'。

在ItemTemplate中我有一个ImageButtong,其CommandName为“Edit”。这按预期工作,我可以在RowCommand事件处理程序中放置一个断点,以查看“事件”命令名称。单击后,回发将该行置于编辑模式。所有文本框都按照它们的意图显示。

此时,上面的EditItemTemplate会显示两个ImageButtons。一个是CommandName = "Update",另一个是“取消”。

我的问题在于更新ImageButton上的点击回发了,但是RowCommand和RowUpdating事件都没有被触发。

我在GridView标记中设置了必需的属性。 (注意,在gridview中EnableViewState="False" - 如果我将其设置为True,我会得到标准

  

“无法加载viewstate。控制树......”等错误)

我注意到的一件奇怪的事情让我觉得这是一个ViewState问题,如果我将Update按钮的CommandName更改为“Edit”,那么在RowCommand事件中会捕获回发事件......

欢迎任何建议。感谢。

10 个答案:

答案 0 :(得分:7)

正如Asem和Ron所说,将CommandValidation =“false”属性添加到CommandField解决了这个问题。 原因是我在页面上有一些其他验证控件,在GridView更新中页面触发了其他验证控件,所以我认为最好设置一个ValidationSummary属性。

答案 1 :(得分:4)

我有同样的情况,我的“编辑”按钮导致其他验证(尽管是隐藏的弹出窗口)在场景后面执行。

通过阅读解决方案,我一直在寻找标准CausesValidation="false"属性来解决问题。我无法找到该字段,因为好像我使用AutoGenerateEditButton="True"将我的编辑按钮添加到gridview。

我的解决方案如下,我希望这可以帮助您节省一些宝贵的时间。

  1. 以这种方式设置AutoGenerateEditButton="False",您可以通过ASP代码添加此字段。

  2. 使用以下代码将“编辑”按钮字段添加到gridView代码中,如下所示。

    <asp:commandfield showeditbutton="true" causesvalidation="false" headertext="Edit"/> 
    
  3. 如果验证是问题,您现在可以看到您的正在更新模块的触发。

答案 2 :(得分:2)

将GridView EnableViewState属性设置为true。

答案 3 :(得分:1)

肖恩,

我知道你现在有了答案但是为了将来的参考,你必须创建一个addhandler和一个委托来做你想做的事情。我起初误解了这个问题。但是如果您选择不使用命令字段,那么这就是您要做的事情。

//这是在页面加载中

If Not IsPostBack Then
        'Create new column for Edit buttons
        'Dim field As New TemplateField
        Dim actionfield As New TemplateField


        actionfield.HeaderText = "Action"
        Dim actioncol As DataControlField = actionfield
        GridView1.Columns.Insert(8, actioncol)//the eight is the column number of where you are adding the column. below you will add the button. You really don't need to add this column programmtically. I normally do though.

    End If

// rowcreated

 If e.Row.RowType <> DataControlRowType.footer Then
            btnedit.ToolTip = "Edits the Current Record"
            btnedit.ImageUrl = "\images\bttnEditMini.gif"
            GridView1.Rows(i).Cells(8).Controls.Add(btnedit)
            btnedit.CommandName = "view"//notice commandname. You can manipulate it.
            btnedit.CommandArgument = GridView1.Rows(i).Cells(0).Text
            AddHandler btnedit.Click, AddressOf btnedit_Click
 end if

//然后注意你必须创建一个imageclickeventhandler委托

 Public Delegate Sub ImageClickEventHandler(ByVal sender As Object, ByVal e As ImageClickEventArgs)
Sub btnedit_Click(ByVal sender As Object, ByVal e As ImageClickEventArgs)
//whatever actions you need to take.   

end sub

答案 4 :(得分:1)

我删除了母版页,让包含GridView的页面继承自Page,并且它有效。我的继承堆栈中的某些东西(或MS控件中的某些东西)不能像我设置的那样工作。

答案 5 :(得分:1)

这解决了我的问题:

   If Not Master.Page.IsPostBackEventControlRegistered Then

        'logic to bind data

   End If

答案 6 :(得分:0)

如果将命令名称更改为“更新”,则必须处理rowcommand中的更新,这应该不是问题 - 对吗?

Check out this Question I asked. It may help

<强>加
您可以做的就是将命令名更改为您想要的任何名称,并在Rowcommand中处理它。在rowcommand上手动更新/插入数据库。

答案 7 :(得分:0)

我在使用编辑,更新,取消的Gridview中也遇到了同样的问题。编辑和取消事件被触发但从不更新事件。最后,我将“更新”链接的CauseValidation更改为false,形成“编辑模板”字段。令人惊讶地工作正常。

答案 8 :(得分:0)

本页在其他答案中提到错误是由验证引起的。原因是页面上有验证器,很可能不适用于正在编辑的特定行,并且无论出于何种原因它们都未被满足。如果您希望验证器适用于当前编辑的行,则不希望将CasuesValidation设置为false ...相反,您需要禁用任何不相关的验证器,除了您为编辑此行而关注的验证器。

  1. 找到不在此gridview行的编辑项模板中的验证器,在page_load中将它们设置为disabled。
  2. 让'CausesValidation'在模板命令字段中保持为true(默认情况下它是真的,所以你可以忽略它。)这样你要验证的行中的任何内容仍然会被验证。
  3. 利润。

答案 9 :(得分:0)

如果您使用任何函数从数据库中检索(绑定)网格视图并在 page_Load()事件中调用它,则可能会导致此问题。尝试在 page_LoadComplete()事件中调用此函数,它将起作用。