【发布时间】:2021-08-30 13:02:39
【问题描述】:
我正在尝试使用嵌套的 gridview 构建一个 webforms 应用程序。问题是当我单击父网格视图中一行的“+”时没有任何反应。见下文:
我有以下代码。
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<h2>Add Bill of Materials</h2>
<script type="text/javascript">
$(document).ready(function () {
window.setTimeout(function () {
$(".alert").fadeTo(1500, 0).slideUp(500, function () {
$(this).remove();
});
}, 3000);
});
function divexpandcollapse(divname) {
var img = "img" + divname;
if ($("#" + img).attr("src") == "../../Images/plus.png") {
$("#" + img)
.closest("tr")
.after("<tr><td></td><td colspan = '100%' > " + $("#" + divname)
.html() + "</td></tr>")
$("#" + img).attr("src", "../../Images/minus.png");
} else {
$("#" + img).closest("tr").next().remove();
$("#" + img).attr("src", "../../Images/plus.png");
}
}
</script>
<div runat="server" visible="false" id="AlertDanger" class="alert alert-danger">
<a href="#" class="close" data-dismiss="alert">×</a>BMDetails
<strong>You must choose a date</strong>
</div>
<div runat="server" visible="false" id="AlertSuccess" class="alert alert-success">
<a href="#" class="close" data-dismiss="alert">×</a>
<strong>Purchase requisition saved successfully</strong>
</div>
<asp:Panel ID="BMDetails" runat="server">
<div>
<asp:UpdatePanel ID="UpdatePanelBM" runat="server">
<ContentTemplate>
<fieldset class="form-horizontal">
<div class="row">
<div class="control-group col-sm-4">
<asp:Label runat="server" CssClass="col-sm-6 control-label" Style="text-align: left">Doc No.</asp:Label>
<div class="form-group col-sm-6">
<asp:Label ID="lblDocNum" runat="server" CssClass="form-control" BackColor="#E6E6E6"></asp:Label>
</div>
</div>
<div class="control-group col-sm-8">
<asp:Label runat="server" CssClass="col-sm-6 control-label">Cust. PO No.</asp:Label>
<div class="form-group col-sm-6">
<asp:TextBox ID="txtPurchaseDocNum" runat="server" AutoPostBack="true" CssClass="form-control" OnTextChanged="txtPurchaseDocNum_TextChanged"></asp:TextBox>
<ajaxToolkit:AutoCompleteExtender
ID="AutoCompleteExtender1"
runat="server"
TargetControlID="txtPurchaseDocNum"
ServicePath="../../Web_Service/PurchaseOrders.asmx"
ServiceMethod="GetPurchaseOrders"
MinimumPrefixLength="2"
EnableCaching="true"
CompletionSetCount="10"
CompletionInterval="10"
DelimiterCharacters=";, :"
ShowOnlyCurrentWordInCompletionListItem="true">
</ajaxToolkit:AutoCompleteExtender>
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtPurchaseDocNum" Display="Dynamic"
CssClass="text-danger" ErrorMessage="The Cust. Purchase Order No field is required." />
</div>
</div>
</div>
</fieldset>
<asp:GridView ID="bMGridView"
runat="server"
AutoGenerateColumns="False"
AllowPaging="True"
AllowSorting="True"
ShowFooter="True"
OnPageIndexChanging="bMParentGrid_PageIndexChanging"
OnRowDataBound="bMParentGrid_RowDataBound"
OnRowCommand="bMParentGrid_RowCommand"
PagerStyle-CssClass="bs-pagination"
ShowHeaderWhenEmpty="True"
EmptyDataText="Select Customer PO number"
CssClass="table table-striped table-bordered table-hover table-condensed">
<Columns>
<asp:TemplateField ItemStyle-Width="20px">
<ItemTemplate>
<a href="JavaScript:divexpandcollapse
('div<%# Eval("Item") %>');">
<img alt="Details" id="imgdiv<%# Eval
("Item") %>"
src="../../Images/plus.png" />
</a>
<div id="div<%# Eval("Item") %>" style="display: none;">
<asp:GridView ID="bMChildGrid"
runat="server"
AutoGenerateColumns="False"
AllowPaging="True"
AllowSorting="True"
ShowFooter="True"
OnRowEditing="bMChildGrid_RowEditing"
OnRowCancelingEdit="bMChildGrid_RowCancelingEdit"
OnRowUpdating="bMChildGrid_RowUpdating"
PagerStyle-CssClass="bs-pagination"
ShowHeaderWhenEmpty="True"
EmptyDataText="No Records Found"
CssClass="table table-striped table-bordered table-hover table-condensed">
<Columns>
<asp:TemplateField ItemStyle-Width="30px" HeaderText="#">
<ItemTemplate>
<asp:Label ID="lblLineNum" Text='<%# Container.DataItemIndex + 1 %>' runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="500px" HeaderText="Item">
<ItemTemplate>
<asp:Label ID="lblItem" runat="server"
Text='<%# Bind("Item")%>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtItem" runat="server" Width="500px" Text='<%# Bind("Item")%>'></asp:TextBox>
<ajaxToolkit:AutoCompleteExtender
ID="AutoCompleteExtender3"
runat="server"
TargetControlID="txtItem"
ServicePath="../../Web_Service/Items.asmx"
ServiceMethod="GetItems"
MinimumPrefixLength="2"
EnableCaching="true"
CompletionSetCount="10"
CompletionInterval="10"
DelimiterCharacters=";, :"
ShowOnlyCurrentWordInCompletionListItem="true">
</ajaxToolkit:AutoCompleteExtender>
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtItem" Display="Dynamic" ValidationGroup="Edit"
CssClass="text-danger" ErrorMessage="The Item field is required." />
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtItem" runat="server" Width="500px"></asp:TextBox>
<ajaxToolkit:AutoCompleteExtender
ID="AutoCompleteExtender4"
runat="server"
TargetControlID="txtItem"
ServicePath="../../Web_Service/Items.asmx"
ServiceMethod="GetItems"
MinimumPrefixLength="2"
EnableCaching="true"
CompletionSetCount="10"
CompletionInterval="10"
DelimiterCharacters=";, :"
ShowOnlyCurrentWordInCompletionListItem="true">
</ajaxToolkit:AutoCompleteExtender>
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtItem" Display="Dynamic" ValidationGroup="Insert"
CssClass="text-danger" InitialValue="-1" ErrorMessage="The Item field is required." />
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="120px" HeaderText="Required Qty.">
<ItemTemplate>
<asp:Label ID="lblQuantity" runat="server"
Text='<%# Bind("Quantity")%>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtQuantity" runat="server" Width="100px"
Text='<%# Bind("Quantity")%>'></asp:TextBox>
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtQuantity" Display="Dynamic" ValidationGroup="Edit"
CssClass="text-danger" ErrorMessage="The Quantity field is required." />
<asp:RegularExpressionValidator ControlToValidate="txtQuantity" runat="server" CssClass="text-danger" Display="Dynamic"
ErrorMessage="Only integers allowed." ValidationExpression="^(0|[1-9]\d*)$"
ValidationGroup="Edit"></asp:RegularExpressionValidator>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtQuantity" runat="server" Width="100px"></asp:TextBox>
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtQuantity" Display="Dynamic" ValidationGroup="Insert"
CssClass="text-danger" ErrorMessage="The Quantity field is required." />
<asp:RegularExpressionValidator ControlToValidate="txtQuantity" runat="server" CssClass="text-danger" Display="Dynamic"
ErrorMessage="Only integers allowed." ValidationExpression="^(0|[1-9]\d*)$"
ValidationGroup="Insert"></asp:RegularExpressionValidator>
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="30px" HeaderText="#">
<ItemTemplate>
<asp:Label ID="lblLineNum" Text='<%# Container.DataItemIndex + 1 %>' runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Item" HeaderText="Item" />
<asp:BoundField DataField="Quantity" HeaderText="Quantity" />
</Columns>
</asp:GridView>
<div class="form-group">
<div class="row">
<div class="col-sm-3">
<asp:Button runat="server" ID="InsertButton" OnClick="Insert" Text="Add" CssClass="btn btn-block btn-primary" />
</div>
<div class="col-sm-3">
<asp:Button runat="server" ID="CancelButton" OnClick="Cancel" Text="Cancel" CausesValidation="false" CssClass="btn btn-block btn-default" />
</div>
</div>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</asp:Panel>
</asp:Content>
这是我在后面的代码中的:
protected void bMParentGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string item = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "Item"));
string selectedItem = item.Substring(0, item.IndexOf(' ')).Trim();
GridView bMChildGrid = e.Row.FindControl("bMChildGrid") as GridView;
// Create Data Table
DataTable dt = new DataTable();
dt.Columns.Add("lineNum", typeof(int));
dt.Columns.Add("Item", typeof(string));
dt.Columns.Add("Quantity", typeof(int));
dt.Rows.Add(dt.NewRow());
bMChildGrid.DataSource = dt;
bMChildGrid.DataBind();
}
}
我做错了什么?单击父网格行不会显示嵌入其中的子网格。
【问题讨论】:
-
Web 窗体默认更改控件的 ID。您是否检查了 DOMC 以确保 JavaScript 中的 ID 与 DOM 中的 ID 一致?
-
@mason 你的意思是在 Chrome 或 Firefox 中检查?当我单击“+”未捕获的错误:语法错误,无法识别的表达式时,我得到了这个:#imgdivRE002 - Utility Wedge Set 3pc (DG)
-
是的,我的意思是在浏览器中查看。这就是 DOM 所在的地方。您是否弄清楚哪一行代码会引发该错误?这真的是您希望传递给它的输入吗?
-
第 193 行并非如此。您正在查看 ASPX。您需要在客户端查看实际呈现的 HTML。 ASPX 不是 HTML,要了解 Web 表单,您需要了解 ASPX 是如何呈现为 HTML 的。
-
忽略这是网络表单的事实。这几乎是一个 jquery/javascript 问题。在您选择的浏览器中使用“查看源代码”查看发送到浏览器的 html。与它一起工作。 Alos 尝试摆脱对 id 的依赖。改为使用父/子或兄弟关系。
标签: jquery asp.net gridview webforms