2012-02-06 97 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

相关问题