FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 3851|回复: 2
打印 上一主题 下一主题

扩展Grid.DataSourceID以支持ObjectDataSource

[复制链接]
跳转到指定楼层
楼主
发表于 2012-4-2 13:17:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 大石头 于 2012-4-2 13:19 编辑

给Grid增加DataSourceID属性,用于指定ObjectDataSource的ID。
然后在OnPreRender阶段执行绑定DataBind,无需手工编写获取数据的代码,Grid可以直接从ObjectDataSource获取数据,用法与GridView完全兼容。
目前已测试通过多条件高级查询、千万数据分页、排序、删除等操作,其中高级查询、分页、排序可以混合进行。

主要修改点如下:
      
  1.         #region DataSourceID
  2.         /// <summary>数据源控件</summary>
  3.         public String DataSourceID
  4.         {
  5.             get
  6.             {
  7.                 object obj = XState["DataSourceID"];
  8.                 return obj == null ? null : (String)obj;
  9.             }
  10.             set { XState["DataSourceID"] = value; }
  11.         }

  12.         private DataSourceSelectArguments _SelectArguments;
  13.         /// <summary>查询参数</summary>
  14.         public DataSourceSelectArguments SelectArguments { get { return _SelectArguments ?? (_SelectArguments = CreateDataSourceSelectArguments()); } }

  15.         /// <summary>从关联的数据源中检索数据。</summary>
  16.         protected void PerformSelect()
  17.         {
  18.             if (String.IsNullOrEmpty(DataSourceID)) return;

  19.             var view = GetData();
  20.             _SelectArguments = CreateDataSourceSelectArguments();

  21.             view.Select(_SelectArguments, data =>
  22.             {
  23.                 if (SelectArguments.RetrieveTotalRowCount)
  24.                 {
  25.                     RecordCount = SelectArguments.TotalRowCount;
  26.                     IsDatabasePaging = true;
  27.                 }
  28.                 DataBindToEnumerable(data);
  29.             });
  30.         }

  31.         /// <summary>创建 <see cref="T:System.Web.UI.DataSourceSelectArguments" /> 对象,该对象包含传递到数据源进行处理的参数。</summary>
  32.         /// <returns>一个 <see cref="T:System.Web.UI.DataSourceSelectArguments" />,包含传递到数据源进行处理的参数。</returns>
  33.         protected DataSourceSelectArguments CreateDataSourceSelectArguments()
  34.         {
  35.             var arg = new DataSourceSelectArguments();

  36.             var view = GetData();

  37.             // 准备排序表达式
  38.             if (view.CanSort)
  39.             {
  40.                 string sortExp = null;
  41.                 if (SortColumnIndex >= 0 && SortColumnIndex < Columns.Count) sortExp = Columns[SortColumnIndex].SortField;
  42.                 if (!String.IsNullOrEmpty(sortExp))
  43.                 {
  44.                     if (String.Equals(SortDirection, "DESC", StringComparison.OrdinalIgnoreCase)) sortExp += " DESC";
  45.                     arg.SortExpression = sortExp;
  46.                 }
  47.             }

  48.             // 准备分页相关
  49.             if (AllowPaging && view.CanPage)
  50.             {
  51.                 if (view.CanRetrieveTotalRowCount)
  52.                 {
  53.                     arg.RetrieveTotalRowCount = true;
  54.                     arg.MaximumRows = PageSize;
  55.                 }
  56.                 else
  57.                     arg.MaximumRows = -1;
  58.                 arg.StartRowIndex = PageSize * PageIndex;
  59.             }
  60.             return arg;
  61.         }

  62.         /// <summary>检索数据绑定控件用于执行数据操作的 <see cref="T:System.Web.UI.DataSourceView" /> 对象。</summary>
  63.         /// <returns>数据绑定控件用于执行数据操作的 <see cref="T:System.Web.UI.DataSourceView" />。如果设置了 <see cref="P:System.Web.UI.WebControls.DataBoundControl.DataMember" /> 属性,则返回特定的已命名的 <see cref="T:System.Web.UI.DataSourceView" />;否则,返回默认的 <see cref="T:System.Web.UI.DataSourceView" />。</returns>
  64.         /// <exception cref="T:System.InvalidOperationException">同时设置了 <see cref="P:System.Web.UI.WebControls.BaseDataBoundControl.DataSource" /> 和 <see cref="P:System.Web.UI.WebControls.BaseDataBoundControl.DataSourceID" /> 属性。- 或 -设置了 <see cref="P:System.Web.UI.WebControls.DataBoundControl.DataMember" /> 属性,但不存在具有该名称的 <see cref="T:System.Web.UI.DataSourceView" /> 对象。</exception>
  65.         protected DataSourceView GetData()
  66.         {
  67.             string dataSourceID = DataSourceID;
  68.             if (String.IsNullOrEmpty(dataSourceID)) return null;

  69.             var ds = FindControl(this, dataSourceID) as IDataSource;
  70.             if (ds == null || ds.GetViewNames().Count < 1) return null;

  71.             foreach (String item in ds.GetViewNames())
  72.             {
  73.                 var view = ds.GetView(item);
  74.                 if (view != null) return view;
  75.             }
  76.             return null;
  77.         }

  78.         public static Control FindControl(Control control, string controlID)
  79.         {
  80.             Control namingContainer = control;
  81.             Control control3 = null;
  82.             if (control != control.Page)
  83.             {
  84.                 while (control3 == null && namingContainer != control.Page)
  85.                 {
  86.                     namingContainer = namingContainer.NamingContainer;
  87.                     if (namingContainer == null) return null;
  88.                     control3 = namingContainer.FindControl(controlID);
  89.                 }
  90.                 return control3;
  91.             }
  92.             return control.FindControl(controlID);
  93.         }
  94.         #endregion

  95.         #region 删除功能
  96.         private void HandleDelete(GridCommandEventArgs e)
  97.         {
  98.             if (String.IsNullOrEmpty(DataSourceID)) return;

  99.             var view = this.GetData();
  100.             if (view == null) return;

  101.             var dic = new Dictionary<Object, Object>();
  102.             if (DataKeys.Count > e.RowIndex)
  103.             {
  104.                 var vs = DataKeys[e.RowIndex];
  105.                 for (int i = 0; i < DataKeyNames.Length && i < vs.Length; i++)
  106.                 {
  107.                     dic.Add(DataKeyNames[i], vs[i]);
  108.                 }
  109.             }

  110.             view.Delete(dic, null, (rows, ex) =>
  111.             {
  112.                 if (ex == null)
  113.                 {
  114.                     //Alert.Show("删除成功!");
  115.                     RequiresDataBinding = true;
  116.                     return true;
  117.                 }
  118.                 else
  119.                 {
  120.                     Alert.Show("删除失败!" + ex.Message, MessageBoxIcon.Error);
  121.                     //return false;
  122.                     // 返回false会导致抛出异常
  123.                     return true;
  124.                 }
  125.             });
  126.         }
  127.         #endregion
复制代码

沙发
 楼主| 发表于 2012-4-2 13:18:15 | 只看该作者
我吐血!

贴的代码那么乱……
板凳
 楼主| 发表于 2012-4-2 13:20:17 | 只看该作者
  1.         private Boolean RequiresDataBinding = true;

  2.         protected override void OnPreRender(EventArgs e)
  3.         {
  4.             if (RequiresDataBinding) DataBind();

  5.             base.OnPreRender(e);
  6.         }

  7.         protected virtual void OnRowCommand(GridCommandEventArgs e)
  8.         {
  9.             EventHandler<GridCommandEventArgs> handler = Events[_rowCommandHandlerKey] as EventHandler<GridCommandEventArgs>;
  10.             if (handler != null)
  11.             {
  12.                 handler(this, e);
  13.             }

  14.             if (String.Equals(e.CommandName, "Delete")) HandleDelete(e);
  15.         }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|FineUI 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-5-8 04:23 , Processed in 0.045830 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表