![](/img/trans.png)
[英]How to call variables from a class(.cs) in C# asp.net backend (.aspx.cs file)
[英]Scope of variables in aspx.cs file
我正在編寫以下代碼:
namespace WebApplication5
{
public partial class WebForm1 : System.Web.UI.Page
{
private DataSet dataset1 = new DataSet();
OleDbDataAdapter adapter;
public DataSet ds
{
get { return dataset1; }
set { dataset1 = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
OleDbConnection con = new OleDbConnection();
con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jayant\Documents\User_Details.accdb";
con.Open();
adapter = new OleDbDataAdapter("Select * from User_Details",con);
adapter.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
// ds.WriteXml("C:\\MyUser_Details.xml"); If I do this here it writes data
con.Close();
}
protected void Button2_Click(object sender, EventArgs e)
{
ds.WriteXml("C:\\MyUser_Details.xml");
// no data in xml files, just root tags
}
}
}
在這里,我的DataSet變量是全局變量,但是當我單擊button2時,它不會將任何數據發送到Ouput XML文件。 你能告訴我為什么嗎? 或我應對此進行哪些修改?
謝謝
您需要查看Asp.net頁面的生命周期 ,在您單擊按鈕頁面的代碼中,該頁面被破壞並再次創建,並遵循整個生命周期,在此過程中,您還將重新創建ds(dataset),因此輸出xml中沒有任何數據。 要維護數據集的狀態,請查看Asp.net中的“狀態管理”
這是因為您在回發期間創建了新的數據集。
移動數據集private DataSet dataset1= new DataSet();
的初始化private DataSet dataset1= new DataSet();
進入負載
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack) { dataset1= new DataSet(); }
}
很明顯,不要忘記在單擊Button2之前先單擊Button1 :)
是的,您部分正確地認為您的ds是Global,但僅在Web頁面的生命期內有效。 頁面呈現並發送給客戶端后,您的頁面將被處理,並因此帶有變量。
如果您希望ds在button_click事件中可用,請在Page_Load事件中填充它
protected void Page_Load(object sender, EventArgs e)
{
OleDbConnection con = new OleDbConnection();
con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jayant\Documents\User_Details.accdb";
con.Open();
adapter = new OleDbDataAdapter("Select * from User_Details",con);
adapter.Fill(ds);
con.close();
}
或在Button_Click事件處理程序中生成數據集。
如果您不想每次都生成此數據集,則必須將此變量保留在Session或ViewState或Cache中
更新1
第三個也是最后一個選擇是使此數據集變量成為類級別的變量,即靜態變量,並且始終可用
在button2_click中的數據集中不會獲得數據,因為button1_click和button2_clicks是對服務器的完全不同的請求。 而且,asp.net不會在請求之間持久存儲存儲在變量中的數據。 如果需要保留數據,則應使用asp.net提供的任何狀態管理技術,例如Session或Viewstate或Caching。
我建議您使用ViewState
因為Session
將消耗大量服務器內存,盡管您可以使用其中任何一個來解決目的。
我認為button1的事件處理程序除了創建ds之外沒有做任何其他事情。 因此,只有一個事件處理程序可以解決目的。
在兩個事件處理程序中訪問ds而不丟失數據的另一種方法是將ds聲明為static
。 但是這種機制不適合這種情況。
protected void Button1_Click(object sender, EventArgs e)
{
OleDbConnection con = new OleDbConnection();
con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jayant\Documents\User_Details.accdb";
con.Open();
adapter = new OleDbDataAdapter("Select * from User_Details",con);
adapter.Fill(ds);
GridView1.DataSource = ds;
Session.Add("Dataset", ds); //Adding Session here
GridView1.DataBind();
con.Close();
}
protected void Button2_Click(object sender, EventArgs e)
{
DataSet ds = (DataSet)Session["Dataset"]; //Retrieving Value from session
ds.WriteXml("C:\\MyUser_Details.xml");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.