2016-09-01 43 views
0

我試過在StackOverflow和其他網站上尋找這個,但找不到任何符合我的問題的東西。基本上,我有一個下拉菜單和包含在行中的文本框的網格視圖。用戶需要從下拉列表中選擇一個選項,並根據他們選擇的選項,他們可能還需要將一些數據添加到同一行的文本框中。作爲這一部分,我想運行驗證來提醒用戶他們還沒有完成哪些字段 - 但我想嘗試在asp.net C#中執行此操作(如果可能的話)(不使用JavaScript或JQuery,或其他任何其他可以避免它)。驗證GridView內的文本框和下拉列表

我已經能夠得到迄今爲止:如果沒有選擇下拉列表或未輸入文本,gridview將驗證 - 但它會針對每一行放置錯誤消息,即使只有一行是不正確,而我只希望驗證消息出現在那些不是的行上。

我的代碼是:

<asp:UpdatePanel ID="upCurrentServicesGrid" UpdateMode="Conditional" runat="server"> 
    <ContentTemplate> 
     <asp:GridView ID="grdviewCurrentSystems" CssClass="table-data currentSystemTable" UseAccessibleHeader="true" AutoGenerateColumns="false" runat="server"> 
      <Columns> 
       <asp:BoundField DataField="systemName" HeaderText="Service" ItemStyle-Width="10%"/> 

       <asp:TemplateField HeaderText="Status" ItemStyle-Width="39%"> 
        <ItemTemplate> 
         <asp:DropDownList ID="aspdropSystemStatus" CausesValidation="false" runat="server" /> 
          <div style="display:none"> 
          <asp:TextBox ID="RowId" runat="server" Text='<%# Eval("id") %>' /> 
          </div> 
          <div style="display:none"> 
           <asp:TextBox ID="SelectedVal" runat="server" Text='<%# Eval("systemStatus") %>' /> 
          </div> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Further information" ItemStyle-Width="50%"> 
        <ItemTemplate> 
         <div> 
          <asp:TextBox ID="txtSystemStatusInfo" TextMode="MultiLine" MaxLength="300" CssClass="textarea1" runat="server" Text='<%# Eval("systemInformation") %>' /> 
           <asp:CustomValidator 
            CssClass="CustomValidator1" 
            OnServerValidate="grdviewFurtherInfo_Validate" 
            Display="Dynamic" 
            runat="server" 
            ValidationGroup="valgrpLocal"> 
             <asp:ValidationMessageLocal 
              CssClass="aspvalmsgLocal" 
              ID="aspvalSystemStatus" 
              Title="Service statuses" 
              TextPassed="" 
              TextFailed="Check Status or Further Information fields" 
              runat="server" /> 
            </asp:CustomValidator> 
         </div> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Delete" ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle"> 
        <ItemTemplate> 
         <div> 
          <asp:LinkButton ID="lnkbtnDelSystem" CausesValidation="false" OnClick="lnkbtnDelSystem_Click" OnClientClick="return confirmDelete(this.id); return false;" CommandArgument='<%# Eval("id") %>' runat="server"> 
           <span class="btn btn-small btn-spinner btn-grid">X</span> 
          </asp:LinkButton> 
         </div> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 
    </ContentTemplate> 
</asp:UpdatePanel> 

而且我後面的代碼是:

protected void grdviewFurtherInfo_Validate(object sender, ServerValidateEventArgs e) 
{ 

    bool valid = true; 
    foreach (GridViewRow row in grdviewCurrentSystems.Rows) 
    { 
     usercontrols_asp_formctl_dropdownlist aspDrop = (usercontrols_asp_formctl_dropdownlist)row.FindControl("aspdropSystemStatus"); 
     usercontrols_asp_formctl_textbox aspTxt = (usercontrols_asp_formctl_textbox)row.FindControl("txtSystemStatusInfo"); 


     if (aspDrop.SelectedValue == "") 
     { 
      valid = false; 
     } 
     else if (aspDrop.SelectedValue != "1" && string.IsNullOrEmpty(aspTxt.Text)) 
     { 
      valid = false; 
     } 
     e.IsValid = valid; 
    } 


} 

誰能請指教?

謝謝! :)

+0

該鏈接似乎不適用於我 - 它絕對是生活嗎? – chesh78

+0

現在檢查 - http://www.aspsnippets.com/Articles/Validate-only-certain-selected-GridView-Row-Controls-like-TextBox-using-ASPNet-Validators.aspx –

回答

0

試試這個而不是每個循環。

int selRowIndex = ((GridViewRow)(((DropDownList)sender).Parent.Parent)).RowIndex; 
     usercontrols_asp_formctl_dropdownlist aspDrop = (usercontrols_asp_formctl_dropdownlist)grdviewCurrentSystems.Rows[selRowIndex].FindControl("aspdropSystemStatus"); 
      usercontrols_asp_formctl_textbox aspTxt = (usercontrols_asp_formctl_textbox)grdviewCurrentSystems.Rows[selRowIndex].FindControl("txtSystemStatusInfo"); 
if (aspDrop.SelectedValue == "") 
     { 
      valid = false; 
     } 
     else if (aspDrop.SelectedValue != "1" && string.IsNullOrEmpty(aspTxt.Text)) 
     { 
      valid = false; 
     } 
     e.IsValid = valid; 
+0

不幸的是,這似乎並沒有工作,我得到一個錯誤:無法投入'System.Web.UI.WebControls.CustomValidator'類型的對象鍵入'System.Web.UI.WebControls.DropDownList'。我對整個asp.net的東西仍然很陌生,所以我不確定我在這裏做了什麼。 – chesh78

0

您可以使用GridView中每行的CustomValidator

<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="Input incorrect" ValidationGroup='<%# "valGroup_" + Container.DataItemIndex %>' ClientValidationFunction="myValidator" ControlToValidate="aspdropSystemStatus" Display="Dynamic"></asp:CustomValidator> 

而且爲GridView外的客戶端腳本:

<script type="text/javascript"> 
    function myValidator(oSrc, args) { 
     //get the rownumber that fires the validator 
     var rowNumber = oSrc.id.split("_")[3]; 
     //get the id of the dropdown of the row 
     var DropDownID = "mainContentPane_grdviewCurrentSystems_aspdropSystemStatus_" + rowNumber; 
     //get the id of the textbox of the row 
     var TextBoxID = "mainContentPane_grdviewCurrentSystems_txtSystemStatusInfo_" + rowNumber; 
     //is the row correctly filled out 
     if (document.getElementById(DropDownID).selectedIndex > 0 && document.getElementById(TextBoxID).value == "") { 
      args.IsValid = false; 
     } else { 
      args.IsValid = true; 
     } 
    } 
</script> 

對於這個工作,你必須做到以下幾點:

添加ValidationGroup='<%# "valGroup_" + Container.DataItemIndex %>'到需要在驗證每個元素行和保存按鈕。通過將Container.DataItemIndex(行號)添加到名稱,使驗證組名稱變得唯一。如果它不是唯一的,它會將所有行驗證爲一個組,而這不是我想要的。

檢查oSrc.id.split("_")[3];是否會爲您指定行號。在我的情況下,ID看起來像這樣mainContentPane_grdviewCurrentSystems_CustomValidator1_1,所以這就是爲什麼我們需要在ID分裂之後的第三個值。

檢查要驗證的DropDown和TextBox的id,並將它們設置爲javascript中的變量。如果ID看起來像這樣mainContentPane_grdviewCurrentSystems_aspdropSystemStatus_0只需刪除行號並將其替換爲javascript的rowNumber即可。