找回密码
 立即注册

QQ登录

只需一步,快速开始

gw0506

超级版主

177

主题

4208

帖子

9025

积分

超级版主

Rank: 8Rank: 8

积分
9025

活字格认证

gw0506
超级版主   /  发表于:2012-5-11 11:10  /   查看:6939  /  回复:3
很多时候,我们在使用 GridView 展示数据时,希望最终用户可以编辑数据并且同步到数据源中。这是一项繁琐的工作。我们需要自定义模板列,并且在后台手动获取更新值,最后使用 SQL 语句同步到数据库中。

但是,现在我们有了 C1 Wijmo GridView ,这些繁琐的工作都成为历史。C1GridView 仅仅通过一个属性-AllowClientEditing 便允用户在客户端编辑单元格内容。
需要编辑时,我们可以通过双击单元格使其进入编辑状态即可。完成编辑后,选择其它单元格去保存编辑值。

这篇文章将叙述在不执行任何 PostBack 的情况下,如何轻而易举的更新数据库。

1.定义数据库连接字符串并且绑定到 C1GridView
C1GridView 可以绑定 Oledb 数据源或 SQL 数据源。本文中,我们将使用 Oledb 数据源。请根据下面的代码设置 DataKeyNames 和 C1GridView 相关列。同时,我们需要设定 CallbackSettings 值为 editing ,这样在我们保存时,不会发生 Postback。
参考代码:

  1. <wijmo:C1GridView ID="C1GridView1" runat="server"
  2. AutogenerateColumns="false" DataKeyNames="CustomerID"
  3. ClientSelectionMode="SingleRow"
  4. AllowClientEditing="true" ShowFilter="true"
  5. OnEndRowUpdated="C1GridView1_EndRowUpdated">
  6. <CallbackSettings Action="Editing, Filtering" />
  7. <Columns>
  8. <wijmo:C1BoundField DataField="CustomerID" HeaderText="CustomerID"
  9. SortExpression="CustomerID">
  10. </wijmo:C1BoundField>
  11. <wijmo:C1BoundField DataField="CompanyName" HeaderText="Company Name"
  12. SortExpression="CompanyName">
  13. </wijmo:C1BoundField>
  14. <wijmo:C1BoundField DataField="ContactName" HeaderText="Contact Name"
  15. SortExpression="ContactName">
  16. </wijmo:C1BoundField>
  17. <wijmo:C1BoundField DataField="City" HeaderText="City"
  18. SortExpression="City">
  19. </wijmo:C1BoundField>
  20. <wijmo:C1BoundField DataField="Country" HeaderText="Country"
  21. SortExpression="Country">
  22. </wijmo:C1BoundField>
  23. </Columns>
  24. </wijmo:C1GridView>
复制代码
2.下面,我们定义 Oledb 数据库连接字符串。因为需要将更改同步到数据库中,所以我们需要写 SQL 语句去同步数据源。
参考代码:

  1. public DataTable GetDataTable()
  2. {
  3. DataTable dt = Page.Session["Customers"] as DataTable;
  4. OleDbConnection con = new OleDbConnection("provider=Microsoft.Jet.Oledb.4.0;
  5. Data Source=" + Server.MapPath("~/App_Data/C1NWind.mdb"));
  6. OleDbDataAdapter da = new OleDbDataAdapter();
  7. da.SelectCommand = new OleDbCommand("SELECT * FROM [Customers] Order By
  8. [CustomerID]", con);
  9. da.UpdateCommand = new OleDbCommand("Update [Customers] set [CompanyName]=?,
  10. [ContactName]=?, [City]=?, [Country]=? where CustomerID = ?", con);
  11. da.UpdateCommand.Parameters.Add("@CompanyName", OleDbType.VarChar, 50,
  12. "CompanyName");
  13. da.UpdateCommand.Parameters.Add("@ContactName", OleDbType.VarChar, 50,
  14. "ContactName");
  15. da.UpdateCommand.Parameters.Add("@City", OleDbType.VarChar, 50, "City");
  16. da.UpdateCommand.Parameters.Add("@Country", OleDbType.VarChar, 50,
  17. "Country");
  18. da.UpdateCommand.Parameters.Add("@CustomerID", OleDbType.VarChar, 50,
  19. "CustomerID");
  20. if (dt == null)
  21. {
  22. dt = new DataTable();
  23. da.Fill(dt);
  24. dt.PrimaryKey = new DataColumn[] { dt.Columns["CustomerID"] };
  25. Page.Session["Customers"] = dt;
  26. }
  27. da.Update(dt);
  28. return dt;
  29. }
复制代码
3.我们仅需在 RowUpdating 和 EndRowUpdated 事件中更新被编辑的行。在客户端使用 C1 Wijmo GridView 修改数据源。

  1. protected void C1GridView1_RowUpdating(object sender,
  2. C1.Web.Wijmo.Controls.C1GridView.C1GridViewUpdateEventArgs e)
  3. {
  4. DataTable customers = GetDataTable();
  5. DataRow row =
  6. customers.Rows.Find(C1GridView1.DataKeys[e.RowIndex].Value);
  7. if (row != null)
  8. {
  9. foreach (DictionaryEntry entry in e.NewValues)
  10. {
  11. row[(string)entry.Key] = entry.Value;
  12. }
  13. }
  14. else
  15. {
  16. throw new RowNotInTableException();
  17. }
  18. Page.Session["Customers"] = customers;
  19. }
复制代码
在 EndRowUpdated 事件中重新绑定 C1GridView 数据源。

  1. protected void C1GridView1_EndRowUpdated(object sender,
  2. C1.Web.Wijmo.Controls.C1GridView.C1GridViewEndRowUpdatedEventArgs e)
  3. {
  4. C1GridView1.DataSource = GetDataTable();
  5. C1GridView1.DataBind();
  6. }
复制代码





不过,有时 C1GridView 中仅仅有一行数据(例如:执行了过滤操作)。用户编辑这一行,但是我们并没有其他行可以点击,从而无法保存更改。不要着急!
我们只需要添加 button 去调用 C1GridView 的前台方法 Update即可。

  1. <asp:Button ID="btn1" runat="server" Text="Update
  2. C1GridView"OnClientClick="btn_ClientClick(); return false;" />
复制代码
使用下面代码调用 Update() 方法:

  1. function btn_ClientClick(sender, args)
  2. {
  3. var grid = $("#C1GridView1");
  4. grid.c1gridview("endEdit");
  5. grid.c1gridview("update");
  6. }
复制代码
好了,现在我们可以运行程序查看效果了。


Demo 下载:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

3 个回复

倒序浏览
abcba
论坛元老   /  发表于:2012-7-18 17:40:00
沙发
有没有使用ObjectDataSource做数据源的示例?
回复 使用道具 举报
abcba
论坛元老   /  发表于:2012-7-21 12:24:00
板凳
使用客户端更改C1GridView数据源时只能使用 C1BoundField 来绑定数据吗?

使用ItemTemplate绑定的好像无效
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-7-23 17:39:00
地板
如果使用ItemTemplate不能像C1BoundField 一样实现绑定,需要使用类似于下面代码的使用方法:
  1.     <wijmo:C1TemplateField HeaderText="名称">
  2.         <UpdateBindings>
  3.             <wijmo:C1GridViewUpdateBinding ControlProperty="tbName.Text" UpdateField="名称" />
  4.         </UpdateBindings>
  5.         <EditItemTemplate>
  6.             <asp:TextBox ID="tbName" runat="server" Text='<%# Bind("名称") %>' BorderStyle="None"
  7.                 Width="100%" />
  8.         </EditItemTemplate>
  9.         <ItemTemplate>
  10.             <%# Eval("名称") %>
  11.         </ItemTemplate>
  12.     </wijmo:C1TemplateField>
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部