2009-09-09 54 views
1

我有一个GridView在一个UpdatePanel这个EditTemplate:ASP.Net的CustomValidator在GridView控件不激发

<edititemtemplate> 
    <asp:textbox id="txtDistFrom" runat="server" text='<%# Bind("distFrom") %>' width="30" /> 
    <asp:CustomValidator ID="valDistFrom" ValidateEmptyText="True" OnServerValidate="valDistFromTo_ServerValidate" ControlToValidate="txtDistFrom" Text="Missing" ToolTip="Invalid" Display="Dynamic" runat="server" /> 
</edititemtemplate> 

和一个简单的服务器端功能:

Protected Sub valDistFromTo_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) 
    Dim cv As CustomValidator = CType(source, CustomValidator) 
    Dim gvr As GridViewRow = cv.NamingContainer 
    Dim tbV As UI.WebControls.TextBox = gvr.FindControl("txtDistFrom") 
    If tbV.Text <> "" Then 
     args.IsValid = False 
     cv.ErrorMessage = "inhalt ist " & tbV.Text 
    End If 
End Sub 

但调试此代码时服务器端函数不会被触发,无论它做什么。它似乎与gridview有关,所以我不能直接通过它的id访问控件。有什么建议么?

+0

将您的页面回传吗? – Jambobond 2009-09-09 10:51:45

+0

是的,但是像Jan已经指出的那样,控制ID存在问题。但是,如何以编程方式添加CustomValidators? – Ulli 2009-09-09 11:02:21

回答

1

添加的CustomValidator上RowCreated或的RowDataBound如果修改VB到:

Protected Sub valDistFromTo_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) 
     Dim cv As CustomValidator = CType(source, CustomValidator) 
     If args.Value <> "" Then 
      args.IsValid = False 
      cv.ErrorMessage = "inhalt ist " & args.Value 
     End If 
End Sub 

它应该工作。请注意,我正在使用args.Value。我使用EditTemplates中的CustomValidators和TextBox,并且ControlToValidate始终设置为TextBox ID,并且它工作正常,但您无法按照您尝试的方式获取TextBox对象。我认为这比用RowUpdating事件搞乱上面提到的要少得多,而且更加干净。

+0

谢谢,这也适用。我首先在脚模板中使用这种方法也遇到了问题。但重要的是在Handler方法中更新和插入时触发Page.Validate方法。 – Ulli 2009-09-10 06:40:54

0

该问题与ControlToValidate属性有关,因为您的文本框的ID未用于重复像GridView,ListView和Repeater等元素。换句话说:你已经偶然发现了ASP.NET引擎中的一个限制。

但我不知道如何解决这个问题。您可以通过将方法附加到GridView的OnRowBound方法来以编程方式添加CustomValidator来完成此操作。

本文可能会提供答案本文可能会提供一个答案:Integrating Asp.Net Validation Controls with GridView at run-time

+0

如果这是正确的,我不能在gridview中使用验证控件。其他类型,即RangeValidator也具有ControlToValidate属性,并且它们可以工作。 – Ulli 2009-09-09 11:53:41

1

在这种情况下,您可以使用必需的字段验证程序。这应该在网格中很好地工作。

对于服务器端验证,我会将自定义验证程序完全移出网格,并将ControlToValidate属性留为空白。您可以将验证移动到网格的RowUpdating事件,并在自定义验证器上设置任何错误消息。 Rmember适当地设置验证器的IsValid属性。

+0

谢谢,那也适用于Gridview中的controlValidator。 – Ulli 2009-09-09 19:08:50

0

我也倾向于认为ControlToValidate是问题所在。 .NET在运行时更改该控件的ID,并且自定义验证器可能没有选取它。

我会尝试使用的FindControl()

0

我有同样的问题。当我在我的自定义验证器中明确设置此属性时,服务器端代码被激发:

EnableClientScript="false"