65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (8投票s)

2007年11月3日

CPOL

1分钟阅读

viewsIcon

91384

如何使用提交按钮从子 DropDownList 控件触发 GridView RowCommand 事件。

引言

如何在编辑模式下,根据另一个 DropDownList 的选择,筛选 GridView 行中的依赖 DropDownList 中的项目?

背景

Visual Studio 2005 的 MSDN 库文档中,对于 GridView.RowCommand 事件的描述如下:

RowCommand 事件在 GridView 控件中的按钮被点击时触发。这允许您提供一个事件处理方法,以便在每次发生此事件时执行自定义例程。

一个 GridViewCommandEventArgs 对象会传递给事件处理方法,该对象允许您确定被点击按钮的命令名称和命令参数。

GridViewCommandEventArgs 类不包含一个属性来指示哪个行的按钮被点击。如果您需要知道哪个行触发了事件,请使用 CommandArgument 属性将该行的索引传递给事件处理方法。

首先,我从互联网上寻求帮助,并找到了这篇文章,关于使用 CommandArgumentCommandNameCommandSource 属性扩展 DropDownList。请参阅 Joteke 的博客 中的这篇文章。我考虑了一种替代方案,而不是在我的代码库中维护用户控件或 Web 自定义控件。我使用了一个提交按钮控件,它提供了 DropDownList 控件的 AutoPostBack 功能,并在 GridView 上触发了 RowCommand 事件。

Screenshot - DropDownList.jpg

使用代码

对于我们的示例项目,我们将有三个 DropDownListddlCommodityddlPacketTypeddlPacketSize。当用户更改 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_RowDataBoundgrdCommodityTypeSize_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; 
    }
}
© . All rights reserved.