我有一个绑定到数据视图的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的新手..
[我的替代选项]:创建临时数据库表并保存...但我不想使用此选项..
答案 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