2012-02-06 40 views
1

我正在運行一個SQL查詢的where子句每次發生按鈕單擊時發生更改。如何避免按鈕單擊後變量的實例化?

現在where子句由列表的索引組成。當點擊按鈕發生時,會發生導致索引值初始化的頁面加載。

int i=0; 

protected void Button1_Click(object sender, EventArgs e) 
{  
    string str = lst1.ElementAt<string>(i++); 
    qr = "Select BdId,First_Name,Last_Name,Age,Gender,Relationship_status,Birthday from [User] where BdId='" + str + "'"; 
    da2 = new SqlDataAdapter(qr, con); 
    da2.Fill(ds2); 
    Label1.Text = Label1.Text + " " + i.ToString(); 
} 

我該如何避免這種情況發生?我希望索引值是全局的,這樣每次點擊按鈕時都不會再次實例化。

感謝

+6

除了其他任何東西,你應該參數化你的SQL,以避免SQL注入攻擊...... – 2012-02-06 11:43:34

+0

使用'ViewState' – Hadas 2012-02-06 11:45:04

+1

一個非局部變量,稱爲'我'。不寒而慄。 – CodesInChaos 2012-02-06 11:47:26

回答

4

每次有您的頁面的請求下,創建頁面級的實例來處理該請求。所以任何字段都會重新初始化。

可以存儲在ViewState中的值記住了各種請求的值:

private int TheIndex 
{ 
    set { ViewState["TheIndex"] = value; } 
    get 
    { 
     if (ViewState["TheIndex"] == null) 
     return 0; 
     return (int)ViewState["TheIndex"]; 
    } 
} 

而且使用TheIndex,而不是i

編輯
此外,作爲CodeInChaos筆記,使用更具描述性的名稱。如果其他人(或您自己在幾個月內)需要維護此代碼,這將有助於理解代碼。

+2

'TheIndex'也是一個很不好的名字。我會使用'CurrentElementIndex'。最好我甚至會使用比Element更多的描述性詞語。 – CodesInChaos 2012-02-06 11:49:04

+0

非常感謝它的作品是我會照顧我所犯的所有錯誤 – vini 2012-02-06 14:00:29

0

您可以將變量存儲在由ASP.Net提供的Session對象中。你也可以查看this教程。

if(Session["CurrentIndex"] != null) i = (int) Session["CurrentIndex"]; 
else Session["CurrentIndex"] = i; 

希望這適用於你。

+0

看起來對我來說很難。只需在同一時間打開兩個標籤,他們之間就會有奇怪的干擾。我寧願將計數器包含在隱藏的輸入字段中,然後將其發回。 – CodesInChaos 2012-02-06 11:55:00

+0

這個隱藏的輸入可以在兩個標籤中使用嗎? – 2012-02-06 11:57:34

+1

隱藏的輸入將導致單獨的計數器,會話到共享計數器。共享計數器可能會導致非常奇怪的影響,需要仔細編碼*。 – CodesInChaos 2012-02-06 12:02:23

相關問題