将选定的下拉列表值保存在全局变量中

时间:2013-01-04 13:37:55

标签: c# asp.net

我正在尝试将下拉列表中选定的值保存在glbal变量中。我在下拉列表中有很多国家/地区,我选择其中一个并按下按钮:

protected void Button1_Click(object sender, EventArgs e)
    {
        Button2.Enabled = true;
        Button2.Visible = true;
        DropDownList1.Visible = true;

        DropDownList9.Items.Clear();


        if (!Class1.Search_Continent.Equals("-"))
        {
            SqlConnection conn1 = new SqlConnection(@"Data Source=AK-PC\MSSQLSERVER1;Initial Catalog=DB;Integrated Security=True");
            conn1.Open();
            SqlCommand cmd1 = new SqlCommand("Select Country_name FROM Country WHERE Continent_name='" + DropDownList1.SelectedValue + "'", conn1);
            SqlDataReader dr1;
            dr1 = cmd1.ExecuteReader();

            while (dr1.Read())
            { DropDownList9.Items.Add(dr1["Country_name"].ToString() + "\n"); }

            dr1.Close();
            conn1.Close();

}

protected void Button2_Click(object sender, EventArgs e)
    {
        // Redirect to Country page
        Class1.CountryName = DropDownList9.SelectedValue.ToString();
        Response.Redirect("Country.aspx", true);
    }

它不会取所选值!它始终采用下拉列表的第一个值! 请帮帮我!

2 个答案:

答案 0 :(得分:1)

您可能会在回发时重新绑定DropDownList9并丢失SelectedValue

protected void Page_Load(object sender, EventArgs e)
{
    if(!Page.IsPostback)
    {
       //bind data
    }
}

答案 1 :(得分:0)

  

它始终采用下拉列表的第一个值

如果您错误地填充数据,这在Web表单中非常常见。你在哪里填写下拉列表?我将猜测您正在Page_Load中进行此操作。我也会猜测你没有像if (!IsPostBack)那样包裹它。如果你在Page_Load中放置一个调试断点,你会发现在调用 Button2_Click之前在回发中调用它。

请记住,HTTP是无状态。这意味着需要在每次向服务器发出请求时构建整个服务器端页面对象。 Page_Load是该构造的一部分,it happens before event handlers do。所以可能发生的事情是:

  1. 用户请求初始页面。
  2. 使用数据填充下拉列表。
  3. 您将页面显示给用户。
  4. 用户选择一个选项并单击一个按钮,进行回发请求。
  5. 您破坏并重新填充下拉列表,将其恢复为默认状态。
  6. 您尝试获取所选的值,现在已经消失。
  7. 此问题的最常见解决方案是在Page_Load中使用上述条件:

    protected void Page_Load(object sender, EventArgs e)
    {
        // some initial logic
        if (!IsPostBack)
        {
            // stuff that should only happen when the page first loads
            // for example, populating controls from the database
        }
        // any other logic, etc.
    }
    

    每个回发都不需要重新填充控件的值,因为像viewstate这样的东西应该保留必要的数据。 (虽然如果你搞砸了那么你可能需要修补一些。)