【问题标题】:Reading values in Gridview on Selection change of a DropDownList在 Gridview 中读取 DropDownList 的选择更改的值
【发布时间】:2017-01-19 07:11:40
【问题描述】:

gridview 中处理数据时,我真的很糟糕。这里我有一个简单的gridview,其中包含一个dropdownlist,它从数据库表Products 中获取其数据。

我想要的是下拉列表OnSelectedIndexChanged,价格标签应该读取下拉列表中所选产品的价格。问题是当我在dropdownlist 中选择产品时,价格没有显示。 label 仍为空。

ASP.NET

<asp:GridView ID="Gridview1" runat="server" ShowFooter="true" AutoGenerateColumns="false" PagerStyle-CssClass="pager" HeaderStyle-CssClass="header" RowStyle-CssClass="rows" AllowPaging="true" PageSize="5" OnRowDataBound="Gridview1_RowDataBound">
  <Columns>
      <asp:BoundField DataField="RowNumber" HeaderText="#">
         <HeaderStyle CssClass="header" Width="60px"></HeaderStyle>
             </asp:BoundField>

      <asp:TemplateField HeaderText="Product">
             <ItemTemplate>
                  <asp:DropDownList ID="dropdown1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dropdown1_SelectedIndexChanged">
                  </asp:DropDownList>
              </ItemTemplate>
              <HeaderStyle CssClass="header" />
              <ItemStyle Width="170px" />
            </asp:TemplateField>


      <asp:TemplateField HeaderText="QTY">
            <ItemTemplate>
                 <asp:TextBox ID="qty_txtbox" runat="server" style="text-align:center;" OnTextChanged="TextBox2_TextChanged"></asp:TextBox>
            </ItemTemplate>
                  <ControlStyle Width="50px" CssClass="txt" />
                  <HeaderStyle CssClass="header" />
                  <ItemStyle Width="50px" CssClass="txt" />
            </asp:TemplateField>


      <asp:TemplateField HeaderText="Price (AED)">
           <ItemTemplate>
               <asp:Label ID="amount_lbl" runat="server"></asp:Label>
           </ItemTemplate>
               <HeaderStyle CssClass="header" />
               <ItemStyle Width="130px" CssClass="txt" />
               </asp:TemplateField>

        <asp:TemplateField HeaderText="">
            <ItemTemplate>
                <asp:ImageButton runat="server" ID="trash" Style="height: 20px;" ImageUrl="~/IMG/garbage.png" />
                </ItemTemplate>
                <ControlStyle Height="20px" Width="20px"></ControlStyle>
                <FooterStyle HorizontalAlign="center" />
                <HeaderStyle Height="30px" Width="30px" CssClass="header"></HeaderStyle>
                <FooterTemplate>
                     <asp:ImageButton runat="server" ID="addnew" ImageUrl="~/IMG/add.png" Style="height: 20px;" OnClick="ButtonAdd_Click" />
                </FooterTemplate>
            </asp:TemplateField>
    </Columns>

     <HeaderStyle CssClass="header" />
     <PagerStyle CssClass="pagerr" />
     <RowStyle CssClass="rows" />
 </asp:GridView>

这是我尝试过的

private DataSet GetData()
{
    SqlCommand cmd = new SqlCommand("SELECT ProductName, PartNumber, price FROM Products");
    using (SqlConnection con = new SqlConnection(cDate.CS))
    {
        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            cmd.Connection = con;
            sda.SelectCommand = cmd;
            using (DataSet ds = new DataSet())
            {
                sda.Fill(ds);
                return ds;
            }
        }
}

protected void Gridview1_RowDataBound(object sender, GridViewRowEventArgs e)
  {
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //Find the DropDownList in the Row
        DropDownList ddproducts = (e.Row.FindControl("dropdown1") as DropDownList);
        ddproducts.DataSource = GetData();
        ddproducts.DataTextField = "ProductName";
        ddproducts.DataValueField = "ProductName";
        ddproducts.DataBind();

        //Add Default Item in the DropDownList
        ddproducts.Items.Insert(0, new ListItem("<----Please select---->"));

    }
}

protected void dropdown1_SelectedIndexChanged(object sender, EventArgs e)
{
    string dvalue = Gridview1.SelectedRow.Cells[1].Text;
    string price = Gridview1.SelectedRow.Cells[3].Text;

    using (SqlConnection con = new SqlConnection(cDate.CS))
    {
        con.Open();
        SqlCommand myCommand = new SqlCommand("select price from products where ProductName = @name");
        myCommand.Parameters.AddWithValue("@name", dvalue);
        myCommand.Connection = con;

        using (SqlDataReader myReader = myCommand.ExecuteReader())
        {
            while (myReader.Read())
            {
                price = (myReader["price"].ToString());

            }
        }
    }
}

错误

Object reference not set to an instance of an object. 这一行string dvalue = Gridview1.SelectedRow.Cells[1].Text;

【问题讨论】:

  • 你的问题是什么?
  • @un-lucky idk 什么标题适合这里,但问题是当我在下拉列表中选择产品时,价格不显示。标签保持为空。

标签: c# asp.net


【解决方案1】:

正如另一个答案所述,问题主要问题是您没有更新该特定标签中的结果。但这只能解决您的问题,您还需要做更多的事情:

  • 标识控件所属的DataRow..
  • 获取您想要访问的标签。
  • 执行操作
  • 将值分配回标签。

整个过程可以使用下面的代码来实现,如果需要说明请看一下,让我知道:

protected void dropdown1_SelectedIndexChanged(object sender, EventArgs e)
{
   DropDownList ddlProduct = (DropDownList)sender;
   DataGridItem row = (DataGridItem) ddlProduct.NamingContainer;
   Label lblPrice = (Label)row.FindControl("amount_lbl");

   // Get current label Text
    string price = lblPrice.Text;
   // Perform your operations here

   // Assign the price value back to the label
   lblPrice.Text =  price;
}

【讨论】:

  • 这个效果很好,我不得不添加它以使其完全工作myCommand.Parameters.AddWithValue("@name", ddlProduct.SelectedItem.ToString());
  • @Makishima:很高兴听到它有效,很高兴为您提供帮助
【解决方案2】:

好像你没有把价格重新设置回网格!

更新:正如 'un-lucky' 所提到的,为了获得适当的网格行,我们使用触发事件的下拉菜单并在其父项中关联 DataRow

    protected void dropdown1_SelectedIndexChanged(object sender, EventArgs e)
    {
        var row = (sender as DropDownList).NamingContainer as GridViewRow; //instead of Gridview1.SelectedRow;
        string dvalue = row.Cells[1].Text; //or row.FindControl(id);
        //string price = row.Cells[3].Text;

        string price = "1400"; //get from database

        row.Cells[3].Text = price; //or row.FindControl(id);
        //Gridview1.new
    }

【讨论】:

  • 我收到一个错误 Object reference not set to an instance of an object. for string dvalue = Gridview1.SelectedRow.Cells[1].Text;
  • @Makishima:可能这将是另一个问题,并解释here
  • @un-lucky 我明白这意味着该值为空。我没有得到正确的 gridview 单元格值吗?
  • 可以这样获取值:GridViewRow row = Gridview1.Rows[e.NewSelectedIndex];..string dvalue = row.Cells[1].Text;@Makishima
  • 所以这是另一个问题:Gridview1.SelectedRowdropdown1_SelectedIndexChanged 时可能为空。我们必须以其他方式获得该行...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 2014-11-09
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多