2009-12-13 44 views
0

一個典型的情況控制:使用驗證與一個GridView

在我的GridView控件,我有一個頁腳行包含一個文本框和「添加」按鈕。當按下按鈕時,文本框中輸入的文本將被添加到網格中。我還有一個驗證控件,要求按下按鈕時,該文本已經輸入到文本框中。添加新行後,文本框清晰可以輕鬆輸入下一個項目。

用戶還可以通過單擊Edit LinkBut​​ton來編輯之前輸入的行中的文本,該行將該行置於編輯模式。點擊Update LinkBut​​ton提交更改。

問題:

時,我點擊更新鏈接,提交更改,如果文本尚未在頁腳行的文本框(用於添加新條目行)進入,驗證控件返回「需要輸入」錯誤。它應該只需要一個條目,如果添加按鈕被按下,而不是如果更新鏈接按鈕被按下。

似乎服務器端驗證控件的驗證事件在GridView的RowCommand事件或btnAdd_Click事件之前觸發,所以我想知道如何從服務器中,我可以確定哪些事件觸發了回發,以便確定是否進行了編輯應針對特定情況執行。

我使用客戶端「必需」驗證編輯以及更復雜的服務器端的混合。因爲我可能必須有一些服務器端的驗證,所以我會很高興知道如何處理服務器端驗證,但真正知道如何處理這種情況的客戶端驗證也是有幫助的。

謝謝。

回答

3

將您的CommandField轉換爲TemplateField,並在EditItemTemplate中將更新LinkBut​​ton的CausesValidation屬性更改爲false。

更新

轉換爲一個TemplateField簡單,不需要任何代碼更改(只標記):

alt text

更改CausesValidation屬性設置爲false在標記爲也很直接:

<asp:TemplateField ShowHeader="False"> 
    <EditItemTemplate> 
    <asp:LinkButton ID="lnkUpdate" runat="server" CausesValidation="False" 
     CommandName="Update" Text="Update"></asp:LinkButton> 
    <%-- 
     More controls 
    --%> 
    </EditItemTemplate> 
    <ItemTemplate> 
    <%-- 
     Controls 
    --%> 
    </ItemTemplate> 
</asp:TemplateField> 

現在,如果你想要你的頁腳和數據行要單獨驗證,則需要使用驗證組,這在Microsoft's documentation中進行了解釋。相同的驗證組中的所有控件都將有自己的ValidationGroup屬性設置爲相同的值,比如:

<asp:LinkButton ID="lnkUpdate" runat="server" CausesValidation="True" 
    CommandName="Update" Text="Update" ValidationGroup="GridViewDataRowGroup"> 
</asp:LinkButton> 
+0

我只是想學習GridView控件,但是這似乎是一個激烈步驟,導致轉換寫了很多代碼。我會嘗試它,同時希望得到另一個答案。 – ChadD 2009-12-13 19:23:30

+0

我想這是說我可以使用驗證控件的頁腳行或數據行,但不是兩個。 – ChadD 2009-12-13 19:57:26

+0

您可能需要驗證組。請看我更新的答案。 – 2009-12-13 21:54:23