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 に答える