我有一个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事件中会捕获回发事件......
欢迎任何建议。感谢。
答案 0 :(得分:7)
正如Asem和Ron所说,将CommandValidation =“false”属性添加到CommandField解决了这个问题。 原因是我在页面上有一些其他验证控件,在GridView更新中页面触发了其他验证控件,所以我认为最好设置一个ValidationSummary属性。
答案 1 :(得分:4)
我有同样的情况,我的“编辑”按钮导致其他验证(尽管是隐藏的弹出窗口)在场景后面执行。
通过阅读解决方案,我一直在寻找标准CausesValidation="false"
属性来解决问题。我无法找到该字段,因为好像我使用AutoGenerateEditButton="True"
将我的编辑按钮添加到gridview。
我的解决方案如下,我希望这可以帮助您节省一些宝贵的时间。
以这种方式设置AutoGenerateEditButton="False"
,您可以通过ASP代码添加此字段。
使用以下代码将“编辑”按钮字段添加到gridView代码中,如下所示。
<asp:commandfield showeditbutton="true" causesvalidation="false" headertext="Edit"/>
如果验证是问题,您现在可以看到您的正在更新模块的触发。
答案 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 ...相反,您需要禁用任何不相关的验证器,除了您为编辑此行而关注的验证器。
答案 9 :(得分:0)
如果您使用任何函数从数据库中检索(绑定)网格视图并在 page_Load()事件中调用它,则可能会导致此问题。尝试在 page_LoadComplete()事件中调用此函数,它将起作用。