Asp.net Gridview行更新事件未触发

Asp.net Gridview行更新事件未触发,asp.net,events,gridview,viewstate,Asp.net,Events,Gridview,Viewstate,我有一个带有AutoGenerateColumns=“False”的Gridview 我使用TemplateField在GridView的第一列中的相应ItemTemplate和EditItemTemplate字段中显示编辑、更新和取消“按钮” 在ItemTemplate中,我有一个命令名为“Edit”的ImageButtong。这正如预期的那样工作,我可以在RowCommand事件处理程序中放置一个断点来查看“event”命令名。单击后,回发将该行置于编辑模式。所有文本框都会按原样显示 此时,

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

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

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

我的问题在于单击Update ImageButton会发回,但不会触发RowCommand或RowUpdate事件

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

“无法加载viewstate。控件树…”等。错误)

我注意到的一件奇怪的事情使我认为这是ViewState问题,那就是如果我将Update按钮的CommandName更改为“Edit”,则回发事件确实会在RowCommand事件中捕获


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

如果您将命令名称更改为“update”,您将必须在row命令中处理更新,这应该不是问题-对吗

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

Sean

我知道你现在已经有了答案,但是对于将来的引用,你必须创建一个addhandler和一个委托来完成你想做的事情。起初我误解了这个问题。但是,如果您选择不使用命令字段,您将执行以下操作

//这在pageload中

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

我删除了母版页,并让包含GridView的页面从该页面继承,它成功了。我的继承堆栈中的某些内容(或MS控件中的某些内容)无法按我设置的方式工作。

这解决了我的问题:

   If Not Master.Page.IsPostBackEventControlRegistered Then

        'logic to bind data

   End If

我在Gridview的编辑、更新、取消中也有同样的问题。“编辑”和“取消”事件被触发,但从不更新事件。最后,我将编辑模板字段中更新链接的CauseValidation更改为false。它出人意料地工作良好。

正如亚欧会议和罗恩所指出的,在CommandField中添加CausesValidation=“false”属性解决了问题。
原因是我在页面上有一些其他验证控件,而在GridView更新页面上启动了其他验证控件,因此我认为最好设置ValidationSummary属性。

将GridView EnableViewState属性设置为true

在本页的其他回答中提到,错误是由验证引起的。原因是页面上有一些验证器,这些验证器很可能不适用于正在编辑的特定行,无论出于何种原因,它们都没有被满足。如果希望验证器为当前正在编辑的行工作,则不希望将CausesValidation设置为false。。。相反,您将希望禁用任何不相关的验证器,但出于编辑此行的目的您关心的验证器除外

  • 找到不在此gridview行的编辑项模板中的验证程序,在页面加载中将其设置为禁用
  • 让“CausesValidation”在模板命令字段上保持为true(默认情况下为true,因此您可以省略它),以便行中要验证的任何内容仍然得到验证
  • 利润

  • 我的“编辑”按钮导致其他验证(尽管是隐藏的弹出窗口)在幕后执行

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

    我的解决方案如下,我希望这也能帮你节省一些宝贵的时间

  • 设置
    AutoGenerateEditButton=“False”
    ,这样您可以通过ASP代码添加此字段

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

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

  • 如果验证是个问题,您现在可以看到更新模块按预期启动。

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

    嗨,Eric-不幸的是,当Update ImageButton的命令名不是“Edit”时,不会触发Row命令。。。我不认为正在为回发创建EditItemTemplate ImageButtons来注册它们,这样就不会引发它们的事件,或者gridview正在被重新绑定,它们正在丢失。理想情况下,我正在寻找一个完整的工作示例,其中有用于此类场景的自定义按钮。谢谢Eric-我以为我有一个解决方案(请参见下面的“答案”),但意识到我需要TemplateFields而不是CommandField,因为我在页脚中有一个插入行。请忽略下面的答案…有没有人得到一个示例,他们用自己的模板字段替换CommandField(GridView函数的内置按钮)进行编辑?爆炸!我刚刚记得我需要TemplateField解决方案,因为我在页脚中还有一个插入行,并且要求页脚模板包含一个ImageButton。。。把我的头发拔出来!!请忽略sel
    <asp:commandfield showeditbutton="true" causesvalidation="false" headertext="Edit"/>