using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Linq; using System.Text; namespace DPumpHydr.WinFrmUI.WenSkin.Controls.Paging { public class WenDataTablePaging : WenPaging { public WenDataTablePaging() : base() { } #region 公有属性 private PagingPageCollection items; private object dataSource; #endregion #region 公有属性 [Category("Wen"), Description("获取或设置每一页设置数量数量"), DefaultValue(100)] public int PageRowCount { get; set; } = 100; [Category("Wen"), Description("获取设置单项数据"), DefaultValue(null)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [Editor(typeof(Design.Editor.WenCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))] [EditorBrowsable(EditorBrowsableState.Always)] public PagingPageCollection Items => items ??= new PagingPageCollection(this); public object DataSource { get => dataSource; set { dataSource = value; DataBind(); } } #endregion private void DataBind() { Items.Clear(); if (dataSource is DataTable dt) { //向上取整 MaxPageCout = (int)Math.Ceiling((decimal)dt.Rows.Count / PageRowCount); for (int i = 1; i <= MaxPageCout; i++) { List dataRows = new List(); for (int r = PageRowCount * (i - 1); r < (i * PageRowCount > dt.Rows.Count ? dt.Rows.Count : i * PageRowCount); r++) { dataRows.Add(dt.Rows[r]); } PagingPage paging = new PagingPage() { PageIndex = i, Value = dataRows.ToArray(), }; Items.Add(paging); } OnPagingButtonClick(new PagingButtonClickEventArgs(1)); } } #region 重写 protected override void OnPagingButtonClick(PagingButtonClickEventArgs e) { base.OnPagingButtonClick(e); PagingPageChange?.Invoke(this, new PagingPageChangeEventArgs(e.PageIndex, Items[e.PageIndex-1])); } #endregion #region 委托 public delegate void PagingPageChangeEventHandler(object sender, PagingPageChangeEventArgs e); [Category("Wen"), Description("绑定数据值变化事件")] public event PagingPageChangeEventHandler PagingPageChange; public class PagingPageChangeEventArgs : PagingButtonClickEventArgs { private readonly PagingPage pagingPage; public PagingPageChangeEventArgs(int pageIndex, PagingPage pagingPage) : base(pageIndex) { this.pagingPage = pagingPage; } public PagingPage PagingPage => pagingPage; } #endregion #region 子类 [ToolboxItem(false)] [DesignTimeVisible(false)] public class PagingPage : Component { public object Value { get; set; } public int PageIndex { get; set; } public DataRow[] DataRows => Value as DataRow[]; public DataTable DataTable { get { DataTable dt = DataRows[0].Table.Clone(); foreach (DataRow dataRow in DataRows) { dt.Rows.Add(dataRow.ItemArray); } return dt; } } public override string ToString() { return PageIndex.ToString(); } } public class PagingPageCollection : WenCollection { public PagingPageCollection(WenPaging owner) { this.owner = owner; } #region 私有属性 private WenPaging owner; #endregion public PagingPage this[int index] => index < Items.Count ? Items[index] as PagingPage : null; } #endregion } }