2010-10-29 116 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

相关问题