将新记录添加到GridView但不应更新DB

时间:2010-10-29 13:34:44

标签: asp.net vb.net gridview

我有一个绑定到数据视图的gridview,OnPageLoad我正在填充gridview记录。我有一个文本框和一个按钮,所以现在我想向GridView添加更多记录,但是这些记录不应该被添加到数据库中,它们只是添加到页面中,当然还有来自db的默认记录。< / p>

<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()

基本上,首先Data From DB到达页面然后Textbox数据应该附加到Gridview但Db不应该更新。我试着将DataView保留在ViewState or Session variable中,但后来我知道我的方式错误,而且由于Dataview不能{{1} }}。我只需要一个想法或正确的道路来做到这一点,这可能是做什么的?可能我认为jQuery会有所帮助,我搜索jQuery做的东西,但我失败了或者我可能没有理解,因为我是jQuery的新手..

[我的替代选项]:创建临时数据库表并保存...但我不想使用此选项..

5 个答案:

答案 0 :(得分: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轻松添加表行,但如果需要在多个页面上,则必须保留表/数据。

答案 1 :(得分:0)

我仍然是.NET的新手,所以拿一点“盐”......

我认为'Bind'是一种双向绑定意味着来自GridView数据源的数据用于填充网格,在编辑模式下输入GridView的数据同样会填充数据源。有一种叫做'Eval'的单向绑定指令,我认为可能会在不填充数据源的情况下填充网格。

另一个观察是GridViews本身不支持插入操作,因此如果您打算允许不是来自数据库的新行,则必须添加插入控件并将其挂钩(或选择不挂钩)自己的数据源。我有一个类似的要求,修改gridview不应该修改数据源,直到单击外部“保存”按钮。在我的例子中,我有一个额外的业务逻辑层作为数据源。此业务对象数据源表示数据库的快照,用于缓冲在GridView中进行的更改,直到单击“保存”按钮。即使业务对象不是可序列化的,我也能够通过使用会话缓存来跨回发来维护这个业务对象。我认为它必须是可序列化的,以便将其存储在viewstate中,但可能不是会话状态。也许viewstate是序列化的并且来回发送给客户端,而会话状态只存储在服务器上,所以不需要序列化。

希望其中任何一个都有帮助。

答案 2 :(得分:0)

您不能以您描述的方式将来自您的数据库的绑定记录与新记录混合。

为此,请使用从数据库填充的未绑定网格,然后添加新记录。

答案 3 :(得分:0)

您无法在非服务器端代码中手动填充服务器端控件GridView,即无需回发。

您可以使用手动数据将db中的数据连接起来,然后将数据绑定到GridView上。但是你会在代码隐藏中执行此操作,即使用回发。

如果GridView.DataSource没有InsertCommand,则不会插入任何数据!不要害怕回帖!

答案 4 :(得分:0)

一种方法。

1.从DB获取数据,将其放在表示行/记录的对象列表中 2.将此列表绑定到GridView,这样就可以绑定到对象列表而不是DB记录 3.添加新项目时,添加到列表中 4.重新绑定GridView