2016-12-15 186 views
0

我目前正在對asp.net webforms項目,我有填充的GridView

  • asp:textbox
  • asp:DropDownList
  • asp:linkbutton

頁我也有同樣的頁面上asp:gridview,我需要插入一個新的行,每當我點擊一個linkbutton與將數據保存到DataBase。 我用來實現的方式是將數據保存在ViewState列表中。

所以,我的問題是:沒有更好的方法來做到這一點? 如果是,請詳細說明。

更新:當發生PostBack時,我不能丟失gridview數據。

+0

的[添加一行網格視圖(http://stackoverflow.com/questions/19257451/add-row-to-grid-view) – VDWWD

+0

@VDWWD請查看更新 – Null

回答

1

您正在尋找ASP .NET State Management和有處理它的幾種方法:

  • 視圖狀態
  • 控制狀態
  • 隱藏字段
  • 餅乾
  • 查詢字符串
  • 應用狀態
  • 會話狀態
  • 配置文件屬性

因爲你沒有提供更多的信息,我建議你使用會話狀態來保存數據,因爲它這樣做是因爲該信息將被存儲在最簡單的方法服務器端所在的位置(而不是錯誤地使用ViewState,其中信息向客戶端發送兩次,一次在GridView.DataBind()中,另一次在ViewState中)。你需要做這樣的事情:

MyGridView.Datasource = (List<Object>)Session["myGridViewData"]; 
MyGridView.DataBind();  

只要插入/刪除/修改新行必須更新您的myGridViewData Session變量的數據集。

記住刷新GridView.DataSource在每個回發所以你不要鬆動的信息:

protected void Page_Load(object sender, EventArgs e) 
{ 
    grid1.DataSource = getDataSet(); 
    grid1.DataBind();  
} 

private List<Object> getDataSet() 
{ 
    if (Session["myGridViewData"] == null) 
     Session["myGridViewData"] = new List<employee>();    

    return (List<Object>)Session["myGridViewData"]; 
} 

protected void addNewRowButton_Click(object sender, EventArgs e) 
{ 
    List<Object> list = (List<Object>)Session["myGridViewData"];  
    list.Add(new Object()); 
    Session["myGridViewData"] = list; 
} 

記住這是不是一個好的做法到Page_Load事件更新控件,則應該處理哪些回發刷新數據並刷新apropiate方法的網格(頁面第一次加載,以及添加/修改/刪除行)。

如果您使用的.NET Framework 4.5或更好,我會建議你使用GridView控件模型綁定(SelectMethod) GridView Model Binding有了這不是necesary刷新數據源上的每個回發明確這是一個更清潔的方式Page_Load方法做這件事。

編輯:從here

會話狀態還是ViewState的?

有某些情況下,保持在ViewState中的狀態值是 不是最好的選擇。最常用的辦法是會話 狀態,其通常更適合的是:

  • 大量的數據。由於ViewState增加了發送到瀏覽器的頁面的大小(HTML有效載荷)和 表格的大小,所以對於存儲大量數據來說這是一個糟糕的選擇。是不是已經顯示在UI

  • 安全數據。雖然ViewState數據經過編碼並可以選擇加密,但如果數據永遠不會發送到客戶端,那麼您的數據是最安全的。所以,會話狀態是 更安全的選項。 (在數據庫中存儲的數據更加安全 由於額外的數據庫憑據。您可以 添加SSL甚至更好的鏈路的安全性。)但是,如果你已經顯示在UI的私人數據 ,想必你已經鏈接本身的安全性與 一樣舒適。在這種情況下,將同樣的 值放入ViewState也同樣不失爲安全。

  • 對象不容易序列化到ViewState中,例如,數據集。 ViewState序列化器針對以下列出的一小組 常見對象類型進行了優化。其他類型的可序列化 可以在ViewState中被保留,但速度較慢,產生了非常大的 ViewState的足跡。

+0

可能的複製Mr.DiegoS,如果我需要將我的數據保存在一個頁面級別,您會推薦哪種狀態管理?爲什麼? – Null

+0

這取決於數據,我往往會說,你應該使用會話(這是在大多數情況下,答案),但有些情況下,你可以使用隱藏域的情況下(如果數據量小),甚至數據庫。 – DiegoS

+0

數據會是..可以說最多50行的10列的網格。 – Null