【问题标题】:Gridview RowUpdating event not firingGridview RowUpdating 事件未触发
【发布时间】:2009-06-08 20:26:38
【问题描述】:

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

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

此时,上面的 EditItemTemplate 显示其中包含两个 ImageButton。一个是CommandName = "Update",另一个是“Cancel”。

我的问题在于点击 Update ImageButton 后返回,但是 RowCommand 和 RowUpdating 事件都没有被触发。

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

“加载视图状态失败。控制树...”等错误)

我注意到的一件奇怪的事情让我认为这是一个 ViewState 问题,如果我将更新按钮的 CommandName 更改为“编辑”,那么回发事件确实会在 RowCommand 事件中被捕获...

欢迎提出任何建议。谢谢。

【问题讨论】:

  • 有没有人用自己的 TemplateFields 替换 CommandField(GridView 功能的内置按钮)进行编辑的示例?
  • 爆炸!我刚刚记得我需要 TemplateField 解决方案,因为我在页脚中也有一个 Insert 行,并且要求 FooterTemplate 包含一个 ImageButton...把我的头发拉出来!!如果没有被删除,请忽略下面的自我回答。
  • 使用自定义TemplateField时一定要使用CommandName Update

标签: asp.net events gridview viewstate


【解决方案1】:

正如 Asem 和 Ron 所指出的,将 CausesValidation="false" 属性添加到 CommandField 可以解决问题。 原因是我在页面上有一些其他验证控件,并且在 GridView 更新页面正在触发其他验证控件,所以我认为最好设置一个 ValidationSummary 属性。

【讨论】:

    【解决方案2】:

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

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

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

    1. 设置AutoGenerateEditButton="False"这样你就可以通过ASP代码添加这个字段了。

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

      <asp:commandfield showeditbutton="true" causesvalidation="false" headertext="Edit"/> 
      

    如果验证是问题所在,您现在可以看到更新模块按预期触发。

    【讨论】:

      【解决方案3】:

      将 GridView EnableViewState 属性设置为 true。

      【讨论】:

      • 我发现页面上禁用的 ViewState 也阻止了 RowUpdating 事件。
      【解决方案4】:

      肖恩,

      我知道您现在有了答案,但为了将来的参考,您必须创建一个 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
      

      //行创建

       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
      

      【讨论】:

      • 为此干杯,埃里克。你现在可能已经意识到我错误地认为我有答案了:(这里是睡觉时间 - 我明天晚上必须回复你的答案。谢谢你到目前为止的帮助。肖恩
      • 没问题肖恩!希望这会有所帮助!
      【解决方案5】:

      我删除了母版页并让包含 GridView 的页面从 Page 继承,并且它工作。我的继承堆栈中的某些东西(或 MS 控件中的某些东西)没有按照我设置的方式工作。

      【讨论】:

        【解决方案6】:

        这为我解决了这个问题:

           If Not Master.Page.IsPostBackEventControlRegistered Then
        
                'logic to bind data
        
           End If
        

        【讨论】:

          【解决方案7】:

          如果您将命令的名称更改为“更新”,您将不得不在 rowcommand 中处理更新,这应该不是问题 - 对吧?

          Check out this Question I asked. It may help

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

          【讨论】:

          • 嗨,Eric - 不幸的是,当 Update ImageButton 的 CommandName 不是“Edit”时,RowCommand 没有被触发...我认为没有为回发创建 EditItemTemplate ImageButtons注册它们,这样它们的事件就不会被引发——要么是这样,要么是网格视图被重新绑定并且它们正在丢失。理想情况下,我正在寻找一个完整的工作示例,其中有用于此类场景的自定义按钮。
          • 谢谢 Eric - 我以为我有一个解决方案(请参阅下面的“答案”),但我意识到我需要 TemplateFields 而不是 CommandField,因为我在页脚中有一个插入行。请忽略下面的答案...
          【解决方案8】:

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

          1. 找到不在此 gridview 行的编辑项模板中的验证器,在 page_load 中将它们设置为禁用。
          2. 让模板命令字段中的“CausesValidation”保持为真(默认情况下为真,因此您可以忽略它。)这样您想要验证的行中的任何内容都会得到验证。
          3. 利润。

          【讨论】:

            【解决方案9】:

            我在编辑、更新、取消的 Gridview 中也遇到了同样的问题。编辑和取消事件被触发,但从未更新事件。最后,我将编辑模板字段中的更新链接按钮的 CauseValidation 更改为 false。出乎意料地工作得很好。

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-08-15
                • 2011-12-25
                • 2013-01-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-01-19
                相关资源
                最近更新 更多