验证GridView中的文本框和下拉框
本文关键字:文本 GridView 验证 | 更新日期: 2023-09-27 18:05:05
我试着在StackOverflow和其他网站上寻找这个,但找不到任何与我的问题相匹配的东西。基本上,我有一个gridview与下拉菜单和包含在行的文本框。用户需要从下拉菜单中选择一个选项,根据他们选择的选项,他们可能还需要在同一行的文本框中添加一些数据。作为其中的一部分,我想运行验证来提醒用户他们没有完成的字段-但我想尝试在asp.net c#中做到这一点,如果可能的话(不使用JavaScript,或JQuery,或其他任何东西,如果我可以避免它)。
我已经能够得到到目前为止:如果下拉框没有选择,或文本没有输入,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;
}
}
谁能给点建议?
谢谢!:)
试试这个,而不是每个循环。
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;
您可以为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 %>'
添加到行和save按钮中需要验证的每个元素中。通过在验证组名称中添加Container.DataItemIndex
(行号),使验证组名称唯一。如果它不是唯一的,它将验证所有行作为一个单独的组,我认为这不是你想要的。
检查oSrc.id.split("_")[3];
是否得到行号。在我的例子中,ID看起来像mainContentPane_grdviewCurrentSystems_CustomValidator1_1
,所以这就是为什么我们需要在ID分裂后的第三个值。
检查你想要验证的下拉框和文本框的id,并将它们设置为javascript中的变量。如果ID看起来像mainContentPane_grdviewCurrentSystems_aspdropSystemStatus_0
,只需删除行号并将其替换为javascript的rowNumber
。