【问题标题】:How to add Dropdown list as a gridview item如何将下拉列表添加为 gridview 项目
【发布时间】:2014-01-01 16:24:57
【问题描述】:

我的表单在 gridview 中有三列。一个是数量(下拉列表){如何添加这个数量下拉列表?},其他是价格和数量。我想计算gridview中的金额。如果我选择数量“2”,那么它会计算数量*价格。如何获取 selectedindexchanged 属性以在 gridview 或任何其他选项中进行下拉?

如何在 gridview 项目中添加下拉列表? 如何将值添加到gridview内的下拉列表中? 如何编写selectedindexchanged事件的代码,用于asp.net中gridview中的下拉菜单?

【问题讨论】:

    标签: asp.net sql-server-2008-r2


    【解决方案1】:

    您的问题分为三个部分:

    • 如何在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();
            }    
        }
    }
    

    结果如下:

    您可以下载测试项目here

    【讨论】:

      【解决方案2】:

      试试这个示例代码。

      <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
      }
      

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-24
        • 2010-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-15
        • 2017-04-04
        相关资源
        最近更新 更多