2010-10-29 94 views
2

我有一個綁定到數據視圖的GridView,我在填充GridView記錄的OnPageLoad。我有一個文本框和一個按鈕,所以現在我想添加更多的記錄到GridView,但這個記錄不應該被添加到數據庫中,他們只是添加到頁面,當然還有來自數據庫的默認記錄。向GridView添加新記錄,但不應更新數據庫

<asp:GridView id="gvItems" runat="server"> 
<Columns> 
    <asp:TemplateField HeaderText="Item Code" SortExpression="ItemCode"> 
     <ItemTemplate> 
      <asp:Label runat="server" ID="lblIItemCode" Text='<%# Bind("ItemCode") %>' /> 
     </ItemTemplate> 
    </asp:TemplateField> 
</Columns> 
</asp:GridView> 

VB.NET代碼:

dvSCart = data.GetSCart(Session("SCartId"), 0, varFilterClause, errorStr) 
gvItems.DataSource = dvSCart 
gvItems.DataBind() 
在第一數據從DB

基本上涉及到網頁那之後Textbox數據應該得到追加到Gridview但Db的不應該得到更新。我試圖通過保持DataViewViewState or Session variable,但後來我才知道我會錯誤的方式,這不會工作,因爲Dataview不能是Serialized。我只需要一個想法或正確的道路來做到這一點,這可能是做什麼?可能是我認爲jQuery將有所幫助,我使用Google搜索jQuery來做東西,但我失敗了,也許我沒有理解,因爲馬新手jQuery ..

[我的替代選項]:創建一個臨時數據庫表和保存...但我不想使用此選項..

+0

你是否執行任何插入?我的意思是,如果您需要跳過新數據,那麼是否應該插入舊數據?或者你只是選擇了數據,而不是把它插回去? – abatishchev 2010-11-01 10:46:43

+0

no thr's no insert !!我只需要添加新的數據到網格,但新的數據應該只在頁面上?我的意思是數據應該添加到網格而不回發。 – FosterZ 2010-11-01 10:56:47

回答

3

您應該將數據放入DataTable和/或DataSet中並將其存儲在Session對象中。然後,您可以使用新行更新此對象,並在您進行更改時重新綁定該對象。

例子:

pageLoad的

 if (!IsPostBack) 
     { 
      DataTable dt = new DataTable(); 

      using (SqlConnection con = new SqlConnection(conString)) 
      { 
       SqlCommand cmd = new SqlCommand("SELECT Id, Name, Price FROM MyCart;", con); 
       con.Open(); 

       SqlDataAdapter da = new SqlDataAdapter(cmd); 
       da.Fill(dt); 
      } 

      Session["MyData"] = dt; 
      GridView1.DataSource = dt; 
      GridView1.DataBind(); 
     } 

現在你有一個數據表綁定到你的GridView1,你有源數據的副本在你的會話對象。現在,讓我們添加一個項目到gridview並更新我們的會話對象中的dt。

 DataTable dt = new DataTable(); 

     if (Session["MyData"] != null) 
     { 
      dt = (DataTable)Session["MyData"]; 
     } 

     DataRow dr = dt.NewRow(); 
     dr["Id"] = dt.Rows.Count + 1; 
     dr["Name"] = "My New Item"; 
     dr["Price"] = 19.99; 

     dt.Rows.Add(dr); 

     Session["MyData"] = dt; 
     GridView1.DataSource = dt; 
     GridView1.DataBind(); 

你去了,你已經添加了一個項目到你的數據表中,並將它重新綁定到你的GridView。

如果你想這樣做的所有客戶端,你可以很容易地使用jQuery添加一個錶行,但如果你需要在多個頁面上,你必須堅持表/數據。

+0

非常感謝親愛的..這正是我想要的...我不知道'DataTable'可以存儲在會話中,可能是我錯了,但我試圖把'DataSet'在會話中,但我正在'串行化'錯誤.. – FosterZ 2010-11-02 06:53:35

0

我還是很新的.NET所以採取這種有「鹽糧」 ......

我覺得' 「綁定」是一種雙向綁定,意味着來自GridView數據源的數據用於填充網格,並且在編輯模式下輸入到GridView中的數據也將填充數據源。有一種叫做'Eval'的單向綁定指令,我認爲這可能會填充網格而不填充數據源。

另一個觀察結果是,GridViews本身不支持插入操作,所以如果你打算允許不是來自數據庫的新行,你將不得不添加插入控件並掛接它(或者選擇不掛接它)自己到數據源。我有一個類似的要求,修改gridview不應該修改數據源,直到點擊一個外部的「保存」按鈕。就我而言,我有一層額外的業務邏輯作爲數據源。此業務對象數據源表示數據庫的快照,用於緩存GridView中所做的更改,直到單擊「保存」按鈕爲止。即使業務對象不可序列化,我仍能通過使用會話緩存跨回發保持此業務對象。我認爲它必須是可序列化的才能將其存儲在視圖狀態中,但可能不是會話狀態。也許視圖狀態被序列化並且發送到客戶端,而會話狀態僅存儲在服務器上,所以不需要序列化。

希望任何幫助。

+0

嗯thnx親愛的...至少我有一個主意..我會嘗試.. – FosterZ 2010-10-29 18:17:16

+0

嘿,我無法解決這個問題的人 – FosterZ 2010-11-01 07:30:33

0

您不能以您描述的方式將來自數據庫的綁定記錄與新記錄混合使用。

爲此,請使用從數據庫填充的未綁定網格,然後添加新記錄。

+0

我沒有得到你.. – FosterZ 2010-11-01 12:24:04

0

您無法在非服務器端代碼中手動填充服務器端控件GridView,即無回發。

你可以從數據庫加入數據與手動數據,然後數據綁定到GridView。但是,您會在代碼隱藏中執行此操作,即使用回發。

如果GridView.DataSource沒有InsertCommand,則不會插入任何數據!不要害怕回帖!

0

這樣做的一種方法。

1.從數據庫中獲取數據,將其放入表示行/記錄的對象列表中。
2.將此列表綁定到GridView,這樣您綁定到對象列表而不是數據庫記錄。
3.添加新項目時,添加到列表中。
4. rebind GridView