如何将下拉列表添加为GridView项目

7
我的表格在gridview里有三列。其中一列是数量(下拉列表){如何添加这个数量下拉列表?},其他两列是价格和总价。我想在gridview内计算总价。如果我选择了“2”这个数量,那么它会计算数量*价格。我怎样才能得到gridview内的下拉列表的selectedindexchanged属性或其他选项呢?
如何在gridview项目中添加下拉列表? 如何在gridview内部给下拉列表添加值? 如何为asp.net中gridview内部的下拉列表编写selectedindexchanged事件的代码?
2个回答

13

你的问题有三个部分:

  • 如何在GridView中添加DropDownList?
  • 如何从GridView内的DropDownList获取所选项?
  • 如何计算值并在GridView中显示?

以下是我们可以执行的步骤。首先在页面中添加此标记。我添加了一个产品名称列,以使其更好看:

<asp:GridView ID="GridView1" AutoGenerateColumns="false" runat="server" OnRowDataBound="GridView1_RowDataBound">
    <Columns>
        <asp:BoundField DataField="Name" HeaderText="Name" />
        <asp:TemplateField HeaderText="Quantity">
            <ItemTemplate>
                <asp:DropDownList ID="ddlQuantity" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlQuantity_SelectedIndexChanged"></asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Price">
            <ItemTemplate>
                <asp:Label ID="lblPrice" Text='<%#Eval("Price") %>' runat="server" ></asp:Label>
            </ItemTemplate>

        </asp:TemplateField>
        <asp:TemplateField HeaderText="Amount">
            <ItemTemplate>                        
                <asp:Label ID="lblAmount" Text="0.00" runat="server" ></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

如何在GridView中添加DropDownList

在Page_Load()方法中填充GridView(我使用了一个产品列表):

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        //Test data to populate GridView
        GridView1.DataSource = new List<Product>()
        {
            new Product{ID=1, Name="Paper", Price=7.99M},
            new Product{ID=2, Name="Pen", Price=14.99M},
            new Product{ID=3, Name="Pencil", Price=1.99M}
        };

        GridView1.DataBind();
    }
}

这将触发GridViewRowDataBound事件。在事件处理方法中,我们将绑定每一行中的DropDownList,如下所示:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var ddl = e.Row.FindControl("ddlQuantity") as DropDownList;
        if (ddl != null)
        {
            ddl.DataSource = new List<string>() { "0", "1", "2", "3", "4" };
            ddl.DataBind();
        }
    }
}

如何从GridView中的DropDownList获取所选项以及如何计算值并在GridView中显示

当您更改DropDownList中的任何选择时,它的SelectedIndexChange事件将触发。在该事件方法中,我们可以找到哪个DropDownList已更改以及它的“NamingContainer”-包含它的GridView行:

protected void ddlQuantity_SelectedIndexChanged(object sender, EventArgs e)
{
    GridViewRow gvr = ((DropDownList)sender).NamingContainer as GridViewRow ;
    if (gvr != null)
    {
        decimal price = 0.00M;
        int quantity = 0;
        //We can find all the controls in this row and do operations on them
        var ddlQuantity = gvr.FindControl("ddlQuantity") as DropDownList;
        var lblPrice = gvr.FindControl("lblPrice") as Label;
        var lblAmount = gvr.FindControl("lblAmount") as Label;
        if (ddlQuantity != null && lblPrice != null && lblAmount != null)
        {
            int.TryParse(ddlQuantity.SelectedValue, out quantity);
            decimal.TryParse(lblPrice.Text, out price);

            lblAmount.Text = (price * quantity).ToString();
        }    
    }
}

这是最终的结果:

在此输入图片描述

你可以在这里下载测试项目。


0

尝试这个示例代码。

<asp:GridView ID="grEventi" runat="server" BackColor="White" 
              ShowHeaderWhenEmpty="True" AutoGenerateColumns="False"
              BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px"
              CellPadding="3" Width="100%" OnRowDataBound="grEventi_RowDataBound"
              onselectedindexchanged="grEventi_SelectedIndexChanged" >
    <SelectedRowStyle CssClass="selectedRow" />
    <Columns>
        <asp:BoundField DataField="Elenco Eventi" HeaderText="Evento" />
        <asp:TemplateField  ItemStyle-Wrap="false" ItemStyle-Width="150" HeaderText="Data Inizio">
            <ItemTemplate>
                <asp:Label ID="lbl_data" runat="server" Text="" Visible="false" > 
                </asp:Label>
                <asp:DropDownList ID="ddl_data" runat="server" Visible="false" OnSelectedIndexChanged="ddl_dat_SelectedIndexChanged"  ClientIDMode = "Static" class ="calendar">
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
</Columns>       
</asp:GridView>

代码后台:

protected void ddl_dat_SelectedIndexChanged(object sender, EventArgs e)
{
    //your logic goes here
    string test = "";    
}

protected void grEventi_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {

e.Row.Attributes.Add("onclick", this.ClientScript.GetPostBackEventReference((Control)sender, "Select$" + e.Row.RowIndex));

        DropDownList ddl_dat = (DropDownList)e.Row.FindControl("ddl_data");
        ddl_dat.SelectedValue = DataBinder.Eval(e.Row.DataItem, "data inizio").ToString();
        ddl_dat.Visible = true;
        ddl_dat.DataTextFormatString = "{0: ddd d/MM/yyyy HH:mm}";
        ddl_dat.DataTextField = "data inizio";
        ddl_dat.DataValueField = "data inizio";

        ddl_dat.DataSource = mydata;
        // ddl_dat.AutoPostBack = true;
        ddl_dat.DataBind();                
    }
    else 
    {
        Label lbl_data = (Label)e.Row.FindControl("lbl_data");
        lbl_data.Visible = true;
        DateTime date=(DateTime)dr.Row["data inizio"];

        lbl_data.Text = date.ToString("ddd d/MM/yyyy HH:mm");
    }
}

protected void grEventi_SelectedIndexChanged(object sender, EventArgs e)
{
    //my logic code
}

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接