2011-02-16 101 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