向GridView添加新记录,但不应更新数据库
我有一个绑定到数据视图的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的不应该得到更新。我试图通过保持DataView
在ViewState or Session variable
,但后来我才知道我会错误的方式,这不会工作,因为Dataview
不能是Serialized
。我只需要一个想法或正确的道路来做到这一点,这可能是做什么?可能是我认为jQuery将有所帮助,我使用Google搜索jQuery来做东西,但我失败了,也许我没有理解,因为马新手jQuery ..
[我的替代选项]:创建一个临时数据库表和保存...但我不想使用此选项..
您应该将数据放入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添加一个表行,但如果你需要在多个页面上,你必须坚持表/数据。
非常感谢亲爱的..这正是我想要的...我不知道'DataTable'可以存储在会话中,可能是我错了,但我试图把'DataSet'在会话中,但我正在'串行化'错误.. – FosterZ 2010-11-02 06:53:35
我还是很新的.NET所以采取这种有“盐粮” ......
我觉得' “绑定”是一种双向绑定,意味着来自GridView数据源的数据用于填充网格,并且在编辑模式下输入到GridView中的数据也将填充数据源。有一种叫做'Eval'的单向绑定指令,我认为这可能会填充网格而不填充数据源。
另一个观察结果是,GridViews本身不支持插入操作,所以如果你打算允许不是来自数据库的新行,你将不得不添加插入控件并挂接它(或者选择不挂接它)自己到数据源。我有一个类似的要求,修改gridview不应该修改数据源,直到点击一个外部的“保存”按钮。就我而言,我有一层额外的业务逻辑作为数据源。此业务对象数据源表示数据库的快照,用于缓存GridView中所做的更改,直到单击“保存”按钮为止。即使业务对象不可序列化,我仍能通过使用会话缓存跨回发保持此业务对象。我认为它必须是可序列化的才能将其存储在视图状态中,但可能不是会话状态。也许视图状态被序列化并且发送到客户端,而会话状态仅存储在服务器上,所以不需要序列化。
希望任何帮助。
您不能以您描述的方式将来自数据库的绑定记录与新记录混合使用。
为此,请使用从数据库填充的未绑定网格,然后添加新记录。
我没有得到你.. – FosterZ 2010-11-01 12:24:04
您无法在非服务器端代码中手动填充服务器端控件GridView,即无回发。
你可以从数据库加入数据与手动数据,然后数据绑定到GridView。但是,您会在代码隐藏中执行此操作,即使用回发。
如果GridView.DataSource没有InsertCommand,则不会插入任何数据!不要害怕回帖!
这样做的一种方法。
1.从数据库中获取数据,将其放入表示行/记录的对象列表中。
2.将此列表绑定到GridView,这样您绑定到对象列表而不是数据库记录。
3.添加新项目时,添加到列表中。
4. rebind GridView
你是否执行任何插入?我的意思是,如果您需要跳过新数据,那么是否应该插入旧数据?或者你只是选择了数据,而不是把它插回去? – abatishchev 2010-11-01 10:46:43
no thr's no insert !!我只需要添加新的数据到网格,但新的数据应该只在页面上?我的意思是数据应该添加到网格而不回发。 – FosterZ 2010-11-01 10:56:47