技巧/提示:使用提交按钮从子 DropDownList 控件触发 GridView RowCommand 事件






4.67/5 (8投票s)
如何使用提交按钮从子 DropDownList 控件触发 GridView RowCommand 事件。
引言
如何在编辑模式下,根据另一个 DropDownList
的选择,筛选 GridView
行中的依赖 DropDownList
中的项目?
背景
Visual Studio 2005 的 MSDN 库文档中,对于 GridView.RowCommand
事件的描述如下:
RowCommand
事件在GridView
控件中的按钮被点击时触发。这允许您提供一个事件处理方法,以便在每次发生此事件时执行自定义例程。一个
GridViewCommandEventArgs
对象会传递给事件处理方法,该对象允许您确定被点击按钮的命令名称和命令参数。
GridViewCommandEventArgs
类不包含一个属性来指示哪个行的按钮被点击。如果您需要知道哪个行触发了事件,请使用CommandArgument
属性将该行的索引传递给事件处理方法。
首先,我从互联网上寻求帮助,并找到了这篇文章,关于使用 CommandArgument
、CommandName
和 CommandSource
属性扩展 DropDownList
。请参阅 Joteke 的博客 中的这篇文章。我考虑了一种替代方案,而不是在我的代码库中维护用户控件或 Web 自定义控件。我使用了一个提交按钮控件,它提供了 DropDownList 控件的 AutoPostBack 功能,并在 GridView 上触发了 RowCommand 事件。
使用代码
对于我们的示例项目,我们将有三个 DropDownList
:ddlCommodity
、ddlPacketType
和 ddlPacketSize
。当用户更改 ddlCommodity
中的选择时,ddlPacketType
中的项目将通过对缓存的 DataTable
应用 RowFilter
来刷新。
GridView 代码如下所示,包含列模板和一个空的数据模板:
<asp:GridView id="grdCommodityTypeSize" runat="server" AllowPaging="True"
AllowSorting="True" AutoGenerateColumns="False"
DataKeyNames="nCommodityTypeSizeID" EnableViewState="False" Width="500px"
DataSourceID="odsCommodityTypeSize" PageSize="8"
OnRowDataBound="grdCommodityTypeSize_RowDataBound"
OnRowUpdating="grdCommodityTypeSize_RowUpdating"
OnRowDeleted="grdCommodityTypeSize_RowDeleted"
OnRowUpdated="grdCommodityTypeSize_RowUpdated"
OnRowCommand="grdCommodityTypeSize_RowCommand">
<EmptyDataTemplate>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<thead>
<tr>
<td align="center">Commodity Type Size</td>
</tr>
</thead>
<tbody>
<tr style="height:25px">
<td align="center" style="font-weight:bold">
There are no commodity, packet type and packet size combination records to display
</td>
</tr>
</tbody>
</table>
</EmptyDataTemplate>
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:CommandField ShowDeleteButton="True" />
<asp:TemplateField HeaderText="CommodityTypeSizeID"
InsertVisible="False" Visible="False">
<ItemTemplate>
<asp:Label ID="lblCommodityTypeSizeID" runat="server"
Text='<%# Eval("nCommodityTypeSizeID") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Seed State" SortExpression="vCommodityName">
<EditItemTemplate>
<asp:DropDownList ID="ddlTypeSizeCommodity1" runat="server"
AppendDataBoundItems="true" DataValueField="nCommodityID"
DataTextField="vCommodityName" DataSourceID="odsCommodity" Width="120px"
SelectedValue='<%# Bind("nCommodityID") %>'>
<asp:ListItem Value="-1">Select</asp:ListItem>
</asp:DropDownList>
<asp:Button ID="btnTypeSizeCommodity1" runat="server" Text="Go"
CommandName="Go" CommandArgument='<%# Eval("nCommodityTypeSizeID") %>' />
<asp:RequiredFieldValidator ID="rfvTypeSizeCommodity1"
runat="server" ControlToValidate="ddlTypeSizeCommodity1" ErrorMessage="*"
InitialValue="-1">*</asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblTypeSizeCommodity1" runat="server"
Text='<%# Eval("vCommodityName") %>'></asp:Label>
</ItemTemplate>
<ItemStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="Packet Type" SortExpression="vPacketTypeName">
<EditItemTemplate>
<asp:DropDownList ID="ddlTypeSizePacketType1" runat="server"
AppendDataBoundItems="true" Width="120px">
<asp:ListItem Value="-1">Select</asp:ListItem>
</asp:DropDownList>
<asp:RequiredFieldValidator ID="rfvTypeSizePacketType1"
runat="server" ControlToValidate="ddlTypeSizePacketType1" ErrorMessage="*"
InitialValue="-1">*</asp:RequiredFieldValidator>
<asp:Label ID="lblTypeSizePacketType2" runat="server"
Text='<%# Eval("nPacketTypeID") %>' Visible="false"></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblTypeSizePacketType1" runat="server"
Text='<%# Eval("vPacketTypeName") %>'></asp:Label>
</ItemTemplate>
<ItemStyle Wrap="False" />
</asp:TemplateField>
<asp:TemplateField HeaderText="Packet Size" SortExpression="vPacketSizeName">
<EditItemTemplate>
<asp:DropDownList ID="ddlTypeSizePacketSize1" runat="server"
AppendDataBoundItems="true" DataValueField="nPacketSizeID"
DataTextField="vPacketSizeName" DataSourceID="odsPacketSize"
Width="120px" SelectedValue='<%# Bind("nPacketSizeID") %>'>
<asp:ListItem Value="-1">Select</asp:ListItem>
</asp:DropDownList>
<asp:RequiredFieldValidator ID="rfvTypeSizePacketSize1"
runat="server" ControlToValidate="ddlTypeSizePacketSize1" ErrorMessage="*"
InitialValue="-1">*</asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblTypeSizePacketSize1" runat="server"
Text='<%# Eval("vPacketSizeName") %>'></asp:Label>
</ItemTemplate>
<ItemStyle Wrap="False" />
</asp:TemplateField>
</columns>
</asp:GridView>
将要放入 grdCommodityTypeSize_RowDataBound
和 grdCommodityTypeSize_RowCommand
事件处理程序中的代码如下所示
protected void grdCommodityTypeSize_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName.ToUpper() == "GO")
{
int _rowIndex = -1;
Button btn = (Button)e.CommandSource;
for (int i = 0; i < grdCommodityTypeSize.DataKeys.Count; i++)
{
if (Convert.ToInt32(grdCommodityTypeSize.DataKeys[i].Value) ==
Convert.ToInt32(e.CommandArgument))
{
_rowIndex = i;
break;
}
}
if (_rowIndex > -1)
{
DropDownList ddlPacketType = null;
DropDownList ddlCommodity = (DropDownList)
grdCommodityTypeSize.Rows[_rowIndex].Cells[3].Controls[1];
if (Cache["CommodityPacketType"] != null)
{
string sFilterExpression = "nCommodityID = " +
ddlCommodity.SelectedValue;
DataTable dtCommodityPacketType =
(DataTable)Cache["CommodityPacketType"];
dtCommodityPacketType.DefaultView.RowFilter = sFilterExpression;
ddlPacketType = (DropDownList)
grdCommodityTypeSize.Rows[_rowIndex].Cells[4].Controls[1];
ddlPacketType.Items.Clear();
ddlPacketType.Items.Add(new ListItem("Select", "-1"));
ddlPacketType.DataSource = dtCommodityPacketType.DefaultView;
ddlPacketType.DataTextField = "vPacketTypeName";
ddlPacketType.DataValueField = "nPacketTypeID";
ddlPacketType.SelectedValue = "-1";
ddlPacketType.DataBind();
}
}
}
}
protected void grdCommodityTypeSize_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if ((e.Row.RowState == DataControlRowState.Normal) ||
(e.Row.RowState == DataControlRowState.Alternate))
{
LinkButton lnkButton = (LinkButton)e.Row.Cells[1].Controls[0];
lnkButton.OnClientClick = String.Format("return confirm" +
" ('Are you sure you want to delete the record?');", "");
}
switch (e.Row.RowState)
{
case DataControlRowState.Normal | DataControlRowState.Edit:
case DataControlRowState.Alternate | DataControlRowState.Edit:
DropDownList ddlCommodity = (DropDownList)e.Row.Cells[3].Controls[1];
string sFilterExpression;
string sPacketTypeSelValue = String.Empty;
sFilterExpression = "nCommodityID = " + ddlCommodity.SelectedValue;
DataTable dtCommodityPacketType = (DataTable)Cache["CommodityPacketType"];
dtCommodityPacketType.DefaultView.RowFilter = sFilterExpression;
DropDownList ddlPacketType = (DropDownList)e.Row.Cells[4].Controls[1];
// This is needed because ddlPacketType is
// not auto-bound using datasource control
string packetTypeIndex = ((Label)e.Row.Cells[4].Controls[5]).Text;
if (ddlPacketType.Items.Count == 1)
{
sPacketTypeSelValue = packetTypeIndex;
}
ddlPacketType.Items.Clear();
ddlPacketType.Items.Add(new ListItem("Select", "-1"));
ddlPacketType.DataSource = dtCommodityPacketType.DefaultView;
ddlPacketType.DataTextField = "vPacketTypeName";
ddlPacketType.DataValueField = "nPacketTypeID";
ddlPacketType.SelectedValue = "-1";
if (sPacketTypeSelValue.Length > 0)
{
ddlPacketType.SelectedValue = sPacketTypeSelValue;
}
ddlPacketType.DataBind();
ddlCommodity = null;
ddlPacketType = null;
break;
default:
break;
}
}