2015-10-17 54 views
0

selectedindexchanged事件中,我的變量有一個值,但是當它到達事件btn_click()時,該變量不再具有值。這是爲什麼?爲什麼我的變量會失去它的價值?

public partial class TestingDatapass 
{ 
    private string item = null; 
    private string itemprice = null; 
    private int totalprice = 0; 

    protected void item_selectedindexchanged(object sender, EventArgs e) 
    { 
     //Both have a value here 
     item = item.SelectedValue; 
     itemprice = item.SelectedValue.Text; 
    } 

    protected void btn_click(object sender, EventArgs e) 
    { 
     //no value here 
     totalprice = Convert.ToInt32(itemprice)*Convert.ToInt32(item); 
     MessageBox.Show(totalprice); 
    } 
} 

編輯
並回答了?在意見提出,發生順序是selectedindexchange那麼btn_click()

編輯關於視圖狀態
所以後來會變成這樣設置什麼,我想實現一個適當的方式?

public partial class TestingDatapass 
{ 
    private int totalprice = 0; 

    protected void item_selectedindexchanged(object sender, EventArgs e) 
    { 
     ViewState["item"] = item.SelectedValue; 
     ViewState["itemprice"] = item.SelectedValue.Text; 
    } 

    protected void btn_click(object sender, EventArgs e) 
    { 
     totalprice = Convert.ToInt32(ViewState["item"])*Convert.ToInt32(ViewState["itemprice"]); 
    } 
} 
+0

似乎'btw_click'在'item_selectedindexchanged'之前被處理。一段時間以來,我已經完成了ASP.Net,但我們遇到了這個問題 - 事件處理順序無法保證。在一個案例中,我們有許多事件,而使事情順利進行的唯一方法是使用單一方法作爲處理程序。這種方法每次都重新計算整個頁面的狀態。 – radarbob

+0

都在同一個請求中被調用? –

+0

否 - 選定的索引更改發生然後按下按鈕事件 – MustangLover

回答

1

當請求頁面時,ASP.NET創建TestingDatapass類的實例,並初始化itempricetotalprice等領域。現在,當您從客戶端更改下拉菜單(我假設您正在查看您的item_selectedindexchanged方法)時,會發生回發,並會分配您在item_selectedindexchanged中提到的值。最後它銷燬實例,生成html並將其發送回瀏覽器。

現在,當您按下頁面中的按鈕時,將創建一個新實例,您的字段將重新初始化,並且您在btn_click中看不到更改的值。這是它的工作原理。

因此,如果你想跨回傳保留任何數據,請考慮使用任何State Management技術像ViewState, HiddenField

此外,作爲一個側面說明,MessageBox.Show不提供ASP.NET。

更新:

我爲什麼不保持在按鈕單擊事件的值的情況下回答,有很多方法可以做到這一點。但爲了回答你的問題,我認爲沒有任何理由將這些值存儲在item_selectedindexchanged事件中,因爲你在那裏沒有做任何事情。您可以直接訪問下拉列表中選擇值在這樣的按鈕單擊處理程序: -

protected void btn_click(object sender, EventArgs e) 
    { 
     totalprice = Convert.ToInt32(item.SelectedValue) * 
        Convert.ToInt32(item.SelectedItem.Text); 
    } 

而且,請注意,這是item.SelectedItem.Text而不是SelectedValue.Text

+0

看到我的編輯,這是否是實現我想要的結果的適當方式? – MustangLover

+0

@MustangLover - 你可以但這不是必需的,請檢查我的更新。 –

+0

我必須在我的語法錯誤的地方,因爲當我嘗試它的方式,你建議它擊中totalprice線,並拋出錯誤'輸入值是不是在正確的格式' – MustangLover

相關問題