zoukankan      html  css  js  c++  java
  • XtraGrid和数据集的更新

    .
    从基本来说,一个XtraGrid使用一个或多个View进行数据呈现,View是呈现器,例如CardView和GridView;而数据集通过DataSourse,DataMember属性设定向其提供DataLayer的Provider。

    2. 可以使用Embed Navagator来在XtraGrid的下方显示一个微型工具条,常常被称作Control Navigator/Embbed
    Navigator,这可以通过使能UseEmbbedNavigator属性来显示它。


    3.
    注意数据集提供者是使用的dotNet内置的OldDb层(或者ADO.NET,这两者没有什么区别),所以一般而言,总有一个DataTable/DataView最终和XtraGrid相关联和被绑定,例如:


    string tblName = "ASSET";
    Database db = new Database();
    DataTable dt1 = new DataTable();
    System.Data.SqlClient.SqlDataAdapter sda = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM " + tblName, db.Connection.ConnectionString);
    int re = sda.Fill(dt1);
    gridControl1.DataMember = tableName;
    gridControl1.DataSource = dt1;
    gridControl1.MainView.PopulateColumns(); 

    4. 既然总有一个DataView/DataTable和XtraGrid相绑定,那么这种情况下,编辑了XtraGrid中的数据之后,典型地导致一系列事件:


    gridView1_FocusedRowChanged
    gridView1_RowCountChanged
    gridView1_ValidatingEditor
    gridView1_ValidateRow
    gridView1_RowUpdated
    gridView1_FocusedRowChanged


    随着用户在Cell之间移动焦点,会有FocusedCellChanged,EditorShowing,EditorShown等等其他事件抛出,但是我这里且不管这些,而是提请注意编辑cell中数据然后通过移动到别的Row来激发RowUpdated事件,这个事件是每行改变向数据库进行提交的最好时机。实际上,对于高速局域网中的C/S结构而言,每行变更内容立即提交数据库在性能、易用性方面是能够满足实作需要的(如果想要Cache
    and BatchCommit也是可以的)。


    5. 好了,既然明白了RowUpdated是拦截并实际提交更新的关键点,现在来介绍如何更新:



       1: private void gridView1_RowUpdated(object sender, DevExpress.XtraGrid.Views.Base.RowObjectEventArgs e)
       2: {
       3:     DataRowView drv = (DataRowView)e.Row;
       4:     DataRow row = drv.Row;
       5:     Trace.Assert(row.RowState != DataRowState.Unchanged);
       6:     this.aSSETTableAdapter.Update(row);
       7:     Console.WriteLine("gridView1_RowUpdated");
       8: }

    GridView中的每一行实际上是和某个DataRowView绑定在一起的,进一步的,每个Cell是和DataRowView.Row["FieldName"]相绑定的——除非某个cell所在的Column是unbounded状态。
    明白了这个绑定关系,可以通过Adapter去Update这些变更了,Adapter足够聪明的话,他将会知道如何重构SqlCommand来仅仅提交变更列而不是整行。(tag:
    SqlCommandRebuild,if u want write a rebuilder to generator SQL yourself).


    若是想每个Cell都Update也可以,只是hook的时机应该选在CellValueChanged处了。
    有的人想整个rows做BatchCommit,实际上BatchCommit问题不是XtraGrid要管的问题,这时DataLayer如何搞定性能的问题,所以解决的办法显然应该是使用一个Commit按钮来做adapter.Update()就可以了,而不需要在XtraGrid上做任何额外的事情。

  • 相关阅读:
    FEniCS 1.1.0 发布,计算算术模型
    Piwik 1.10 发布,增加社交网站统计
    淘宝褚霸谈做技术的心态
    CyanogenMod 10.1 M1 发布
    Druid 发布 0.2.11 版本,数据库连接池
    GNU Gatekeeper 3.2 发布
    Phalcon 0.9.0 BETA版本发布,新增大量功能
    EUGene 2.6.1 发布,UML 模型操作工具
    CVSps 3.10 发布,CVS 资料库更改收集
    Opera 移动版将采用 WebKit 引擎
  • 原文地址:https://www.cnblogs.com/zhangtao/p/2347569.html
Copyright © 2011-2022 走看看