我正在尝试将下拉列表中选定的值保存在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);
}
它不会取所选值!它始终采用下拉列表的第一个值! 请帮帮我!
答案 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。所以可能发生的事情是:
此问题的最常见解决方案是在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这样的东西应该保留必要的数据。 (虽然如果你搞砸了那么你可能需要修补一些。)