c# - DataGrid OnItemDataBound 干扰 DropDownList OnSelectedIndexChange 事件
问题描述
我有一个带有 DataGrid 的 ASP.Net 4.6.1 网页。在DataGrid 的一个TemplateColumn 中,我有一个DropDownList。DropDownList 有一个 OnSelectedIndexChanged 事件处理程序:
<asp:DataGrid runat="server" ID="dgPartnerApprovalPending" DataKeyField="OrderID"
CellPadding="10" CellSpacing="10" AlternatingItemStyle-BackColor="WhiteSmoke" HeaderStyle-BackColor="WhiteSmoke" AutoGenerateColumns="false"
AllowSorting="true" OnSortCommand="dgPartnerApprovalPending_SortCommand">
<Columns>
<asp:BoundColumn DataField="AttorneyName" HeaderText="Attorney Name" SortExpression="AttorneyName" />
<asp:BoundColumn DataField="Title" HeaderText="Title" SortExpression="Title" />
<asp:BoundColumn DataField="Description" HeaderText="Description" SortExpression="Description" />
<asp:BoundColumn DataField="RequestDate" HeaderText="Request Date" SortExpression="RequestDate" />
<asp:BoundColumn DataField="TotalAmount" HeaderText="Total Amount" SortExpression="TotalAmount" />
<asp:BoundColumn DataField="OrderStatus" HeaderText="Order Status" SortExpression="OrderStatus" />
<asp:TemplateColumn HeaderText="Status">
<ItemTemplate>
<asp:DropDownList runat="server" ID="ddlStatus" OnSelectedIndexChanged="ddlStatus_SelectedIndexChanged" AutoPostBack="true"
DataSourceID="sdsStatuses" DataTextField="OrderStatus" DataValueField="OrderStatusID" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="OrderID" HeaderText="Order ID" SortExpression="OrderID" />
<asp:HyperLinkColumn Text="Files" DataNavigateUrlField="OrderID" DataNavigateUrlFormatString="~/Files/{0}" />
</Columns>
</asp:DataGrid>
OnSelectedIndexChanged 事件处理程序工作正常,直到我将 OnItemDataBound 事件处理程序添加到 DataGrid:
<asp:DataGrid runat="server" ID="dgPartnerApprovalPending" DataKeyField="OrderID" OnItemDataBound="dgPartnerApprovalPending_ItemDataBound"
CellPadding="10" CellSpacing="10" AlternatingItemStyle-BackColor="WhiteSmoke" HeaderStyle-BackColor="WhiteSmoke" AutoGenerateColumns="false"
AllowSorting="true" OnSortCommand="dgPartnerApprovalPending_SortCommand">
<Columns>
<asp:BoundColumn DataField="AttorneyName" HeaderText="Attorney Name" SortExpression="AttorneyName" />
<asp:BoundColumn DataField="Title" HeaderText="Title" SortExpression="Title" />
<asp:BoundColumn DataField="Description" HeaderText="Description" SortExpression="Description" />
<asp:BoundColumn DataField="RequestDate" HeaderText="Request Date" SortExpression="RequestDate" />
<asp:BoundColumn DataField="TotalAmount" HeaderText="Total Amount" SortExpression="TotalAmount" />
<asp:BoundColumn DataField="OrderStatus" HeaderText="Order Status" SortExpression="OrderStatus" />
<asp:TemplateColumn HeaderText="Status">
<ItemTemplate>
<asp:DropDownList runat="server" ID="ddlStatus" OnSelectedIndexChanged="ddlStatus_SelectedIndexChanged" AutoPostBack="true"
DataSourceID="sdsStatuses" DataTextField="OrderStatus" DataValueField="OrderStatusID" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="OrderID" HeaderText="Order ID" SortExpression="OrderID" />
<asp:HyperLinkColumn Text="Files" DataNavigateUrlField="OrderID" DataNavigateUrlFormatString="~/Files/{0}" />
</Columns>
</asp:DataGrid>
这是触发 ItemDataBound 事件时调用的代码:
protected void dgPartnerApprovalPending_ItemDataBound(object sender, DataGridItemEventArgs e)
{
ListItemType itemType = (ListItemType)e.Item.ItemType;
if (itemType == ListItemType.Item || itemType == ListItemType.AlternatingItem)
{
DataRowView view = (DataRowView)e.Item.DataItem;
string OrderID = view["OrderID"].ToString();
for (int i = 0; i <= 6; i++)
{
e.Item.Cells[i].Attributes.Add("OnClick", "window.location.href='PartnerApprovalDetail.aspx?oid="
+ OrderID
+ "'"
);
}
}
}
简而言之,ItemDataBound 事件使每一行都可点击,并将用户重定向到不同的页面。添加此事件处理程序并加载页面后,每当我单击任何行中的 DropDownList 时,页面都会变为空白。如果我在调试器中执行此操作,则永远不会触发 SelectedIndexChanged 事件。在使行可单击后,我尝试将数据绑定到 OnItemDataBound 处理程序中的 DropDownList。我还尝试在 PostBack 之后将数据绑定到 PageLoad() 中的 DropDownList。两者都没有帮助。我该如何解决这个问题?
解决方案
您正在表格单元格中添加 onclick 事件处理程序,<td>
并且下拉列表呈现在表格单元格内。因此,当您尝试单击下拉列表时,单击事件被父表格单元格级别定义的事件处理程序捕获,该事件处理程序将用户带走.
您可以创建一个新的模板列来呈现详细信息链接:
<asp:TemplateColumn HeaderText="Status">
<ItemTemplate>
<asp:HyperLink ID="DetailsUrls" runat="server" href="PartnerApprovalDetail.aspx?oid=<%#Eval("OrderID")%>">Detail</asp:HyperLink>
</ItemTemplate>
</asp:TemplateColumn>
推荐阅读
- c# - 如何使用合理的工程原理组合和维护多个执行相同操作的应用程序?
- python - 如何在熊猫分组后获得两组之间的p值?
- javascript - 如何在嵌套数组中使用 javascript 从 coingecko API 中提取价格
- javascript - 根据单选按钮单击显示/隐藏表单字段
- php - SuPhp versus no suPhp script
- c# - P/Invoke offreg.dll 函数 - 后续调用中的访问冲突
- c - 如何在C中将新节点插入二叉树?
- java - Java frontend beginner
- react-native - Visual Studio Code for macOS syntax error only for React Native 0.61
- json - 如何使颤振能够查看更难的 API,这些 API 要求不同的变量来访问它们?