using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using POSV.Entity; using POSV.Bean; using DevComponents.DotNetBar.Metro; using DevComponents.DotNetBar; using POSV.Utils; using System.Threading.Tasks; namespace POSV.Component { [ToolboxItem(true)] public partial class TableX : BaseUserControl { /// /// 桌台数据源 /// private List _dataSource = null; public TableX() { InitializeComponent(); this.BackColor = Color.Transparent; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) return; //当前页码 this.PageNumber = 1; } /// /// 刷新界面元素 /// public void RefreshUi() { if (this.itemPanel.Items.Count > 0) { var items = this.itemPanel.Items[0].SubItems; if (items.Count > 0) { var lists = this._dataSource.FindAll(x => x.TableExt != null); Parallel.ForEach(lists , table => { if (items.Count > 0 && items.Contains(table.Id)) { var item = items[table.Id] as MetroTileItem; this.ChangedStyle(table , item); } }); } } } public void BindDataSource(List
dataSource , KeyboardAction action = KeyboardAction.None) { this._dataSource = dataSource; if (this._dataSource == null) { this._dataSource = new List
(); } //总数量 this.TotalCount = dataSource.Count; //每页的显示数量 this.PageSize = this.Rows * this.Columns; //清空历史数据 this.itemPanel.Items.Clear(); this.itemPanel.Font = this.GetSystemFont(this.FontSize); //复制新的数据源,进行分页运算 var merge = TableMerge.Merge(this.Rows , this.Columns , dataSource , false); var pager = ListPager(merge); ItemContainer ic = new ItemContainer(); ic.MultiLine = true; ic.ItemSpacing = 0; ic.LayoutOrientation = eOrientation.Horizontal; foreach (var entity in pager) { MetroTileItem item = this.GetItemTemplate(); item.EnableMarkup = true; item.Name = entity.Id; //绑定品类ID到Tag属性 item.Tag = entity; switch (entity.Name) { case Constant.PREV_PAGER: { item.Image = POSV.Properties.Resources.left; item.ImageTextAlignment = System.Drawing.ContentAlignment.MiddleCenter; item.TileStyle.BackColor = ColorTranslator.FromHtml(this.PagerColor); item.TileStyle.BackColor2 = ColorTranslator.FromHtml(this.PagerColor); } break; case Constant.NEXT_PAGER: { item.Image = POSV.Properties.Resources.right; item.ImageTextAlignment = System.Drawing.ContentAlignment.MiddleCenter; item.TileStyle.BackColor = ColorTranslator.FromHtml(this.PagerColor); item.TileStyle.BackColor2 = ColorTranslator.FromHtml(this.PagerColor); } break; default: { //绑定人数 item.Text = string.Format("可供{0}人",entity.Number); //绑定桌名 item.TitleText = string.Format("{0}" , entity.Name); } break; } this.ChangedStyle(entity,item); ic.SubItems.Add(item); } this.itemPanel.Items.Add(ic); this.itemPanel.Invalidate(); } public void ChangedStyle(Table entity,MetroTileItem item = null) { if (entity == null || entity.TableExt == null) return; if(item == null) { if (this.itemPanel.Items.Count > 0) { var items = this.itemPanel.Items[0].SubItems; if (items.Count > 0 && items.Contains(entity.Id)) { item = items[entity.Id] as MetroTileItem; } } } if (item == null) return; switch (entity.TableExt.TableStatus) { case TableStatus.空闲: { //文字颜色 item.TileStyle.TextColor = ColorTranslator.FromHtml(this.TextColor0); //背景颜色 item.TileStyle.BackColor = ColorTranslator.FromHtml(this.BackColor0); item.TileStyle.BackColor2 = ColorTranslator.FromHtml(this.BackColor0); //边框颜色 item.TileStyle.BorderColor = ColorTranslator.FromHtml(this.BackColor0); item.TileStyle.BorderColor2 = ColorTranslator.FromHtml(this.BackColor0); //绑定桌名 item.TitleText = entity.Name; //绑定人数 item.Text = string.Format("可供{0}人" , entity.Number); } break; case TableStatus.在用: { //文字颜色 item.TileStyle.TextColor = ColorTranslator.FromHtml(this.TextColor1); //背景颜色 item.TileStyle.BackColor = ColorTranslator.FromHtml(this.BackColor1); item.TileStyle.BackColor2 = ColorTranslator.FromHtml(this.BackColor1); //边框颜色 item.TileStyle.BorderColor = ColorTranslator.FromHtml(this.BackColor1); item.TileStyle.BorderColor2 = ColorTranslator.FromHtml(this.BackColor1); //绑定桌名 item.TitleText = entity.Name; //已经过去的时间,HH:mm var diff = DateTimeUtils.MinuteDiff(DateTime.Now , Convert.ToDateTime(entity.TableExt.OpenTime)); //绑定人数 item.Text = string.Format("{0}人 {1} {2}" , entity.TableExt.TableNumber , diff , Constant.CNY + "0.00"); } break; } } private MetroTileItem GetItemTemplate() { MetroTileItem template = new MetroTileItem(); template.TileStyle.PaddingLeft = template.TileStyle.PaddingRight = -2; template.EnableMarkup = true; template.OptionGroup = "Table"; template.TileStyle.Font = this.itemPanel.Font; template.TileStyle.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center; template.TileStyle.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Far; template.TitleTextAlignment = System.Drawing.ContentAlignment.TopCenter; template.TileStyle.BorderWidth = 1; template.TileStyle.CornerDiameter = 8; template.TileStyle.CornerType = eCornerType.Rounded; //桌号文字颜色 template.TitleTextColor = ColorTranslator.FromHtml(this.TextColor0); //文字颜色 template.TileStyle.TextColor = ColorTranslator.FromHtml(this.TextColor0); //背景颜色 template.TileStyle.BackColor = ColorTranslator.FromHtml(this.BackColor0); template.TileStyle.BackColor2 = ColorTranslator.FromHtml(this.BackColor0); //边框颜色 template.TileStyle.BorderColor = ColorTranslator.FromHtml(this.BackColor0); template.TileStyle.BorderColor2 = ColorTranslator.FromHtml(this.BackColor0); //显示大小 template.TileSize = new Size(this.ItemWidth , this.ItemHeight); template.MouseDown += OnItemMouseDown; template.DoubleClick += OnItemDoubleClick; return template; } private void OnItemMouseDown(object sender , MouseEventArgs e) { MetroTileItem item = (MetroTileItem)sender; var table = item.Tag as Table; switch (table.Name) { case Constant.PREV_PAGER: { item.Checked = false; this.PageNumber = table.Pager; this.BindDataSource(this._dataSource); } break; case Constant.NEXT_PAGER: { item.Checked = false; this.PageNumber = table.Pager; this.BindDataSource(this._dataSource); } break; default: { item.Checked = true; this.OnTableCheckedChanged(new TableEventArgs(table)); } break; } } private void OnItemDoubleClick(object sender , EventArgs e) { MetroTileItem item = (MetroTileItem)sender; var table = item.Tag as Table; this.OnTableDoubleClick(new TableEventArgs(table)); } public event TableEventHandler TableDoubleClick; protected virtual void OnTableDoubleClick(TableEventArgs e) { TableDoubleClick?.Invoke(this , e); } public event TableEventHandler TableCheckedChanged; protected virtual void OnTableCheckedChanged(TableEventArgs e) { TableCheckedChanged?.Invoke(this , e); } /// /// 分页List数据 /// /// /// public List
ListPager(List
data) { var result = new List
(); result.AddRange(data.Skip((this.PageNumber - 1) * this.PageSize).Take(this.PageSize)); return result; } /// /// 显示的高度 /// public int ItemHeight { get; set; } = 70; /// /// 显示的宽度 /// public int ItemWidth { get; set; } = 92; /// ///默认行数 /// public int Rows => this.Height / this.ItemHeight; /// /// 每一行显示的数量 /// public int Columns { get; set; } = 8; /// /// 字体大小 /// public SystemFont FontSize { get; set; } = SystemFont.正常; /// /// 空闲状态显示颜色 /// public string BackColor0 { get; set; } = ColorTranslator.ToHtml(Color.Green); /// /// 在用状态显示颜色 /// public string BackColor1{ get; set; } = ColorTranslator.ToHtml(Color.OrangeRed); /// /// 分页按钮的颜色 /// public string PagerColor { get; set; } = ColorTranslator.ToHtml(Color.Green); /// /// 文字显示颜色 /// public string TextColor0 { get; set; } = ColorTranslator.ToHtml(Color.Black); /// /// 开台模式的文字颜色 /// public string TextColor1 { get; set; } = ColorTranslator.ToHtml(Color.Blue); /// /// 每页的大小 /// public int PageSize { get; private set; } /// /// 总页数 /// public int PageCount => this.PageSize <= 0 ? 0 : ((this.TotalCount + this.PageSize - 1) / this.PageSize); /// /// 当前页码 /// public int PageNumber { get; set; } /// /// 总数量 /// public int TotalCount { get; private set; } //是否有上一页 public bool HasPreviousPage { get { return PageNumber > 1; } } //是否有下一页 public bool HasNextPage { get { return PageNumber < this.PageCount; } } } public delegate void TableEventHandler(object sender , TableEventArgs e); public class TableEventArgs : EventArgs { public Table Table; public TableEventArgs(Table data) { this.Table = data; } } }