从一个方法访问字符串变量到全局声明的另一个方法是给出null值

时间:2013-12-10 05:23:16

标签: c# asp.net postback

我正在开发一个网络应用程序;基于带有c#的asp.net,我有以下两种方法。

public partial class ClerkReception_CreateRecords : System.Web.UI.Page
{
string patid;   
protected void ddryear_textchanged(object sender, EventArgs e)
{
    string month = "";
    if (ddrmonth.SelectedItem.Text == "Jan")
    {
        month = "01";

    }
    else if (ddrmonth.SelectedItem.Text == "Feb")
    {
        month = "02";
    }
    else if (ddrmonth.SelectedItem.Text == "Mar")
    {
        month = "03";
    }



    string year;
    year = ddryear.SelectedItem.Text;
    string locid = Session["Location"].ToString();

    patid = locid + month + year;//Ex:AT112013


    myConnection obj = new myConnection();

    //string result = obj.fnDisplayManualRecords(year, month, locid);
    string result = obj.fnDisplayManualRecords1(patid);

    txtlast.Text = result.ToString();
    if (ddrmonth.SelectedItem.Text != null || ddryear.SelectedItem.Text != null)
    {
        txtlast.Visible = true;
        lbllast.Visible = true;
        BtnProceed.Visible = true;
    }

}

这是从下拉列表中选择项目时使用的方法,其中patid返回值。

我需要在下面显示的另一个方法中访问patid的相同值。因此我将patid声明为全局变量,以便我可以在任何方法中访问该值。但是它给出了null。如何从一个方法中解析vale另一种方法的方法?

protected void BtnProceed_Click(object sender, EventArgs e)
{


    string x = patid;//shows null
    using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand("select top 1(SUBSTRING(patientid,9,4)) as MaxpatientID  from Patient_Data where PatientID like '"+patid+"%' order by PatientID desc;", cn))
        {
            try
            {

                cn.Open();

                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    //int Patcount;
                    if (rdr.Read())
                    {
                        int Patcount = int.Parse(rdr["MaxpatientID"].ToString());
                        // if(Patcount == 0)


                    }
                }
            }
            catch (Exception ex)
            {

                // handle errors here
            }

        }
    }

}
}

5 个答案:

答案 0 :(得分:3)

全局变量在asp.net中的回发之间创建/初始化并且保留回发之间的值,因为http是无状态协议,您需要使用{ {1}}为此。您可以阅读有关ViewStateViewState超过here的更多信息。

Stateless protocol

中设置值
ViewState

ViewState["patid"] = locid + month + year;//Ex:AT112013;

获取价值
ViewState

查看状态

  

查看国家生活的目的很简单:它是坚持国家的目的   跨回发。 (对于ASP.NET网页,其状态是属性   构成其控制层次结构的控件的值。)这个问题   问题是,“需要坚持哪种状态?”回答   那个问题,让我们先来看看哪个州不需要   坚持回发。回想一下,在实例化阶段   页面生命周期,控件层次结构和那些   已分配声明性语法中指定的属性。   由于这些声明性属性会自动重新分配   构建控件层次结构时的每个回发,都没有   需要在视图状态中存储这些属性值。你可以阅读   有关viewstate here的更多信息。

答案 1 :(得分:2)

欢迎使用回帖的世界,每个帖子都会重新创建页面(类)变量,因此您需要在回发之前保存它,否则它将会消失。

使用缓存对象(例如Session)来维护回发和页面导航之间的值。 Session使您能够在应用程序的多个页面中存储和检索对象,如果您不断回发它,则只包含一个。

您可以使用Session,如下所示:

Session中存储价值:

Session["ValueToKeep"] = "My important information";

Session检索价值:

// Make sure it is in session cache before we try to get it
if(Session["ValueToKeep"] != null)
{
    string valueINeed = Session["ValueToKeep"].ToString();
}
  

注意:Session中存储的所有项目均为Objects,因此在.ToString()项上使用了Session。插入Session时,项目被装箱为对象,但在检索时必须取消装箱(强制转换)。

答案 2 :(得分:0)

在回发时重新创建类级别变量。您需要将它们保留在继续跨请求的某个位置,例如ViewState,Session等。

答案 3 :(得分:0)

在side class中与两个方法/函数/事件函数交互的最佳方式是将其可访问的修饰符声明为 public ,并且可以在初始化一些值之后调用该类的任何对象。

 public void ddryear_textchanged(object sender, EventArgs e) {....}
 public void BtnProceed_Click(object sender, EventArgs e) {....}

在类中创建一个变量,如string x;并在缩写器{ x="some text "; }中初始化它,这就是代码的工作原理......

答案 4 :(得分:0)

有很多方法可以获得全局参数的值, 一种方法是将参数定义为静态