2011-02-16 95 views
0

我有DropDownList,它有一些可供选择的选项。如今后,当用户选择其中的一个选项,它必须点击一个按钮,它是在同一页上重定向:重定向时记住DropDownList状态

protected void Button4_Click(object sender, EventArgs e) 
{ 
    Response.Redirect("Graphs.aspx?Selection=" + DropDownList1.SelectedValue + "&Date1=" + TextBox1.Text + "&Date2=" + TextBox2.Text); 
} 

我必须使用重定向,而不是回传,因为我用的海军报是JavaScript的库,并且当用户选择其他选项时,必须重新编写所有代码。问题是,当它重新导向回来时,出于某种原因,我无法记住DropDownList中的值,该值具有用户先前选择的值。我试图与此代码:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Request.QueryString["Selection"] == "TemperatureOUT") 
    { 
     DropDownList1.SelectedIndex = 0; 
    } 
    else if (Request.QueryString["Selection"] == "Dewpoint") 
    { 
     DropDownList1.SelectedIndex = 1; 
    } 
} 

的问题是,如果例如用户从DropDownList的选择露点,然后点击按钮,这会导致重定向,新的URL应该具有:

Graphs.aspx?Selection=Dewpoint&... 

而是,它说:

Graphs.aspx?Selection=TemperatureOUT&... 

现在,如果我删除代码的Page_Load它的工作原理,但它不记得什么用户之前选择。现在我知道Page_Load必须有一些东西。不是当页面重定向时,Page_Load被调用,所以它应该查找Selection值并将其打印出来。所以它必须是重定向的问题,出于某种原因不会设置选定的值。

+1

要求

DropDownList oldvalue = (DropDownList)PreviousPage.FindControl("DropDownList1"); 

尝试一个有客户端重定向,而不是服务器端。服务器端按钮没有真正意义,它所做的只是重定向。 –

回答

1

可能这是你写这样的

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     DropDownList ddl = (DropDownList)Page.PreviousPage.FindControl("Your first page drop down id here"); 
     if (ddl!=null) 
     { 
      if(ddl.SelectedValue == "2") 
      // do your coding here 
     } 
    } 
} 
+0

我得到这个:System.NullReferenceException:对象引用未设置为对象的实例。我像这样实现它:DropDownList oldvalue =(DropDownList)PreviousPage.FindControl(“DropDownList1”); (旧值!=空) { DropDownList1.SelectedIndex = oldvalue.SelectedIndex; } –

+0

你可以在哪写代码。 – Dotnet

+0

我启用调试和导致此行:DropDownList ddl =(DropDownList)Page.PreviousPage.FindControl(“DropDownList1”);这不奇怪吗? –

0

我会检查的第一件事是,你正在使用IsPostBack确定添加哪些项目到您的列表:如果您更改列表

if (!IsPostBack) 
{ 
    DropDownList1.Items.Add(...) 
} 

不放心地确定它是否应该是一个GET或POST操作时,列表项将被反弹(假设您将代码添加到代码中而不是标记)。当通过POST加载页面时,它将恢复控件的状态(即在这种情况下添加的项目),然后在处理加载事件之前应用任何更改(如选定的项目等)。

当您执行重定向时,您将为重定向目标发出新的GET请求,该请求将呈现页面而不处理选择。结合使用IsPostBack和处理GET请求上的查询字符串,这应该足以解决您的问题。

+0

我忘了提及,选项是静态的,所以DropDownList项不会改变。你是什​​么意思:“你正在为重定向目标发出一个新的GET请求,它将呈现页面而不处理选择。”?我不明白它为什么不服从DropDownList1.SelectedValue? –

+0

马修有正确的解决方案,但误解了你的问题。您的Page_Load处理程序在您的Button4_Click处理程序之前触发。这意味着当你点击按钮时,如果查询字符串中有任何“选择”值,它将使用它来更改下拉列表的选定值,然后您有机会在点击处理程序中查看它。您需要将代码封装在Page_Load中,并检查!IsPostback,以便在您单击该按钮时忽略查询字符串,并使用他们在下拉列表中选择的内容。 – patmortech

+0

如果你编辑你的答案,并删除有关向ddl添加新项目的东西(这不是试图做的),并将他的代码放在你的if块中,那么它会更有意义。 – patmortech