2011-05-04 19 views
4

我已經通過谷歌搜索,發現很多人都在努力解決這個問題,但我仍然沒有找到正確的答案。自定義驗證程序在FormView中工作嗎?

http://i.stack.imgur.com/15jen.png

我有一個表格視圖,需要檢查,如果語言代碼重複與否,必須檢查服務器端腳本,因爲它需要的是通過數據庫查詢。

更新於2011年5月4日,19.32 //我在此添加表單視圖的屬性,所以有人可能會指出是否有任何問題。

<asp:FormView ID="fmvxLanguage" runat="server" EnableViewState="False" DefaultMode="Insert" 
    Visible="False" Width="95%" DataSourceID="odsLanguage" DataKeyNames="LanguageCode" 
    CssClass="formViewAdd"> 

//

<dxe:ASPxButton ID="btnAddNewLanguage" runat="server" CausesValidation="True" 
Image-Url="~/images/icon/Save-icon.png" CommandName="Insert" Text="Save"> 
</dxe:ASPxButton> 

我使用INSERT命令插入按鈕,導致驗證設置爲true。

<asp:CustomValidator ID="cvdLanguageCodeNameDuplicate" runat="server" 
         ControlToValidate="txtLanguageCode" CssClass="IconValidation" 
         ErrorMessage="&lt;img src=&quot;/images/icon/validation-Icon.png&quot;/&gt;  Language code name is duplicated." 
         onservervalidate="cvdLanguageCodeNameDuplicate_ServerValidate"> </asp:CustomValidator> 

自定義驗證設置如上

當我按一下按鈕,並嘗試將在事件的ServerValidate斷點,我甚至沒有到達那裏

protected void cvdLanguageCodeNameDuplicate_ServerValidate(object source, ServerValidateEventArgs args) 
    { 

     if (LanguageHelper.HaveLanguageCode(args.Value)) 
     { 
      args.IsValid = false; 
     } 
    } 

至於現在,我使用標籤,而不是自定義驗證程序通過檢查值是否有效FormView_ItemInserting,如果該值無效我只是使用e.Cancel(FormViewInsertEventArgs)並使標籤可見。但仍然,我想知道如果自定義驗證程序不在formview上工作,或者我做錯了什麼。

謝謝。

以下代碼與問題無關,但對搜索此主題的用戶可能會有所幫助,並且可能會有相同的問題。我不得不重複這個有很多的時間,所以我做重用類爲這個事件(使用標籤作爲驗證)

public class clsFormViewDuplicationValidationSetter 
{ 
    #region Property 


    public FormView FormView { get; set; } 

    public delegate bool DelDuplicationValidationNameOnly(string pStrName); 
    public delegate bool DelDuplicationValidationNameAndId(string pStrName, int primaryId); 

    public DelDuplicationValidationNameOnly DuplicationValidationNameOnly; 
    public DelDuplicationValidationNameAndId DuplicationValidationDelegationNameAndId; 


    public TextBox TextBoxNameToCheckForDuplication { get; set; } 
    public Label LabelDuplicationValidationMessage { get; set; } 

    #endregion 

    #region Constructor 

    /// <summary> 
    /// Pattern For Simple Duplication ValidationName and Id 
    /// </summary> 
    /// <param name="pObjFormView">FormView</param> 
    /// <param name="pObjTextBoxNameToCheckForDuplication">TextBoxName</param> 
    /// <param name="pObjLabelDuplicationValidationMessage">Lable Showing Error Message</param> 
    /// <param name="pObjDuplicationValidationNameAndId">Delegation for validation function (name and id)</param> 
    public clsFormViewDuplicationValidationSetter(FormView pObjFormView, TextBox pObjTextBoxNameToCheckForDuplication, Label pObjLabelDuplicationValidationMessage, DelDuplicationValidationNameAndId pObjDuplicationValidationNameAndId) 
    { 
     this.FormView = pObjFormView; 
     this.TextBoxNameToCheckForDuplication = pObjTextBoxNameToCheckForDuplication; 
     this.LabelDuplicationValidationMessage = pObjLabelDuplicationValidationMessage; 
     this.DuplicationValidationDelegationNameAndId = pObjDuplicationValidationNameAndId; 
     FormView.ItemInserting += new FormViewInsertEventHandler(FormView_ItemInserting); 
    } 

    /// <summary> 
    /// Pattern For Simple Duplication Validation Name 
    /// </summary> 
    /// <param name="pObjFormView">FormView</param> 
    /// <param name="pObjTextBoxNameToCheckForDuplication">TextBoxName</param> 
    /// <param name="pObjLabelDuplicationValidationMessage">Lable Showing Error Message</param> 
    /// <param name="pObjDuplicationValidationDelegation">Delegation for validation function (name)</param> 
    public clsFormViewDuplicationValidationSetter(FormView pObjFormView, TextBox pObjTextBoxNameToCheckForDuplication, Label pObjLabelDuplicationValidationMessage, DelDuplicationValidationNameOnly pObjDuplicationValidationNameOnly) 
    { 
     this.FormView = pObjFormView; 
     this.TextBoxNameToCheckForDuplication = pObjTextBoxNameToCheckForDuplication; 
     this.LabelDuplicationValidationMessage = pObjLabelDuplicationValidationMessage; 
     this.DuplicationValidationNameOnly = pObjDuplicationValidationNameOnly; 
     FormView.ItemInserting += new FormViewInsertEventHandler(FormView_ItemInserting); 
    } 

    void FormView_ItemInserting(object sender, FormViewInsertEventArgs e) 
    { 
     string name = TextBoxNameToCheckForDuplication.Text; 


     bool IsDuplicate; 

     // when adding, id always 0 
     if (DuplicationValidationDelegationNameAndId != null) 
      IsDuplicate = DuplicationValidationDelegationNameAndId(name, 0); 
     else 
      IsDuplicate = DuplicationValidationNameOnly(name); 

     if (IsDuplicate) 
     { 
      e.Cancel = true; 
      FormView.Visible = true; 
      LabelDuplicationValidationMessage.Visible = true; 
     } 
    } 

    #endregion 


} 

當窗體加載使用

protected void Page_Load(object sender, EventArgs e) 
    { 
     TextBox objtxtLanguageCode= (TextBox)fmvxLanguage.FindControl("txtLanguageCode"); 
     Label objFormViewLabelDuplicationValidationMessage = (Label)fmvxLanguage.FindControl("lblFormViewDuplicate"); 

     clsFormViewDuplicationValidationSetter objFormViewDuplicationValidationSetter = new clsFormViewDuplicationValidationSetter(fmvxLanguage,objtxtLanguageCode,objFormViewLabelDuplicationValidationMessage,LanguageHelper.HaveLanguageCode); 
    } 

回答

0

我只是找出更合適的解決方案,我們必須 調用Page.Validate()並檢查之前是否(Page.IsValid)繼續。 如果ValidationGroup分配,呼叫Page.Validate(「groupNameHere」)

+0

這看起來也許應該是您以前的答案的編輯+擴展名,而不是一個全新的答案......您應該考慮將它們結合起來。 – forsvarir 2011-07-21 14:22:07

+0

即使我不使用更新面板,它也能正常工作,所以我不認爲我需要將它組合起來,您是否需要使用面板才能使其工作? – 2011-07-21 14:47:52

1

你需要設置的驗證組按鈕和CustomValidator。

試試這個

<dxe:ASPxButton ID="btnAddNewLanguage" runat="server" CausesValidation="True" Image-Url="~/images/icon/Save-icon.png" CommandName="Insert" Text="Save" ValidationGroup="V> 
</dxe:ASPxButton> 



<asp:CustomValidator ID="cvdLanguageCodeNameDuplicate" runat="server"       ControlToValidate="txtLanguageCode" CssClass="IconValidation"       ErrorMessage="&lt;img src=&quot;/images/icon/validation-Icon.png&quot;/&gt;  Language code name is duplicated."       onservervalidate="cvdLanguageCodeNameDuplicate_ServerValidate" ValidationGroup="V> </asp:CustomValidator> 
+0

感謝您的回答,但它仍然無法正常工作。 實際上,它在DevExpress GridView的EditForm模式下工作良好,沒有設置任何驗證組,它只是在formview中不起作用。 – 2011-05-04 08:21:29

0

在我們的團隊高級程序員才發現,我們需要把UpdateControlPanel在CustomValidators,以使其顯示在EditFormView當服務器端驗證已經完成的,其有效狀態是錯誤的。對於客戶端驗證,其始終正常工作。