0

我在数据列表中有一个Dropdownlist和一个按钮。我从下拉列表中选择项目数,然后将其传递给按钮事件以将其发送到数据库。

但我无法这样做。问题是变量selectedValue只在内部分配dditem_change,尽管我已经在全局范围内声明了它。

如何在DataList1_ItemCommand(object source, DataListCommandEventArgs e).

这是下拉列表更改的代码

public void dditem_change(object sender, EventArgs e)
    {
        var ddlList = (DropDownList)sender;
        selectedValue = ((DropDownList)ddlList.NamingContainer.FindControl("drplist")).SelectedValue;
    }

这是 public void DataList1_ItemCommand 的代码

public void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
    if(e.CommandName == "Add")
    {
        if (Session["user"] == null)
        {
            Response.Write("<script>alert('Login First!!!');</script>");

        }
        else
        {

            string[] ar = e.CommandArgument.ToString().Split(',');
            SqlConnection con = new SqlConnection();
            con.ConnectionString = "Data Source=DTPXP-77A;Initial Catalog=practice;Integrated Security=true";
            con.Open();
            SqlCommand cmd = new SqlCommand("insert into cart values(@username,@prodname,@price,@stock)", con);
            cmd.Parameters.Add("@username", SqlDbType.VarChar);
            cmd.Parameters.Add("@prodname", SqlDbType.VarChar);
            cmd.Parameters.Add("@price", SqlDbType.Int);
            cmd.Parameters.Add("@stock", SqlDbType.Int);
            cmd.Parameters["@username"].Value = Session["user"].ToString();
            cmd.Parameters["@prodname"].Value = ar[0].ToString();
            cmd.Parameters["@price"].Value = int.Parse(ar[1]);
            cmd.Parameters["@stock"].Value = //selectedValue NOT ACCESSIBLE//
            cmd.ExecuteNonQuery();
            Response.Write("<script>alert('Successfully Added');</script>");

        }
    }
}    
4

2 回答 2

0

这是ASP.NET 页面生命周期的结果。当您选择下拉菜单时,这会导致您在其中存储selectedValue变量的回发。然后,当您触发导致另一个回发的按钮时,这会导致您selectedValue在重新创建页面时丢失。

为了在回发之间保持值,您需要将其存储在某个地方。例如,您可以使用Session存储,例如

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        selectedValue = (string)Session["SelectedValue"];
    }
}

public void dditem_change(object sender, EventArgs e)
{
    var ddlList = (DropDownList)sender;
    Session["SelectedValue"] = ((DropDownList)ddlList.NamingContainer.FindControl("drplist")).SelectedValue;
}

public void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
    // selectedValue should now be accessible
}

考虑到数据有多小,并且考虑到它实际上是特定于视图的,它可能最好放在ViewState中。

于 2013-09-24T15:24:54.363 回答
-1

为什么不直接在需要的地方读取值?在这种情况下,您不需要在“selectedValue”变量中存储任何内容。就像是:

cmd.Parameters["@stock"].Value = 
   ((DropDownList)FindControl("drpList")).SelectedValue;

编辑:我将演员添加到 DropDownList。

于 2013-09-24T15:19:15.877 回答