2016-09-01 11 views
0

私はこれをStackOverflowや他のサイトで探してみましたが、問題と一致するものは見つかりませんでした。基本的に、私はドロップダウンメニューと行に含まれているテキストボックスを持つグリッドビューを持っています。ユーザーはドロップダウンからオプションを選択する必要があり、選択したオプションによっては、同じ行のテキストボックスにデータを追加する必要がある場合もあります。これの一部として、完了していないフィールドについてユーザーに警告するための検証を実行したいと思いますが、可能であればasp.net C#で試してみたい(JavaScriptやJQueryなどを使用しないでそれを避けることができます)。GridView内のテキストボックスとドロップダウンを検証します

ドロップダウンが選択されていないか、テキストが入力されていないと、グリッドビューは検証されますが、1行しか表示されていなくてもすべての行に対してエラーメッセージが表示されます間違っていますが、私は検証メッセージが表示されない行にのみ表示されるようにしたいのです。

私のコードは次のとおりです。

<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-選択 - グリッドビュー - ロー - コントロール - 類似 - テキストボックス - 使用--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の各行に使用できます。

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

とクライアント側のスクリプトのため:

あなたが次のことを行う必要があり、これが機能するために
<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の分割後に3番目の値が必要なのです。

検証するDropDownおよびTextBoxのIDを確認し、JavaScriptの変数として設定します。 IDがmainContentPane_grdviewCurrentSystems_aspdropSystemStatus_0の場合は、行番号を削除して、javacriptのrowNumberに置き換えてください。

関連する問題