You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

873 lines
30 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 System.Threading.Tasks;
using JwKdsV.Entity.Normal;
using JwKdsV.Core.MessageEvent;
using JwKdsV.Core;
using JwKdsV.Core.Bean;
using JwKdsV.Core.Utils;
namespace JwKdsV.Component
{
[ToolboxItem(true)]
public partial class CategoryControl : BaseUserControl
{
/// <summary>
/// 数据源
/// </summary>
private List<ProductType> _dataSource = null;
public CategoryControl()
{
InitializeComponent();
this.BackColor = Color.Transparent;
}
protected override void OnPaint(PaintEventArgs e)
{
//base.OnPaint(e);
Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);
ControlPaint.DrawBorder(e.Graphics, rect, Color.Transparent, ButtonBorderStyle.Solid);//画个边框
//ControlPaint.DrawBorder(e.Graphics , rect ,
// Color.Transparent , 1 , ButtonBorderStyle.Solid ,
// Color.Transparent , 1 , ButtonBorderStyle.Solid ,
// Color.Transparent , 1 , ButtonBorderStyle.Solid ,
// Color.Transparent , 1 , ButtonBorderStyle.Solid
//);
}
protected override void OnResize(EventArgs e)
{
// this.Visible = false;
switch (this.ShowCagegoryType)
{
case CategoryShowType.:
{
base.Height = this.MainCategoryRows * this.MainCategoryItemHeight;
}
break;
case CategoryShowType.:
{
base.Height = this.SubCategoryRows * this.SubCategoryItemHeight;
}
break;
case CategoryShowType.:
{
base.Height = this.MainCategoryRows * this.MainCategoryItemHeight + this.SubCategoryRows * this.SubCategoryItemHeight;
}
break;
}
base.OnResize(e);
// this.Visible = true;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (this.DesignMode) return;
this.mainCategory.CategoryCheckedChanged += OnMainCategoryChecked;
this.subCategory.CategoryCheckedChanged += OnSubCategoryChecked;
InitProductType();
}
private void InitProductType()
{
try
{
var categoryItem = new CategoryItem();
this.RefreshUi(categoryItem);
var dataSource = new List<ProductType>();
//呈现品类下包含商品的
using (var db = Global.Instance.OpenDataBase)
{
dataSource = db.Query<ProductType>(" where products > @0 order by no", 0).ToList();
}
if (categoryItem.ShowAllProduct)
{
this.ShowAllProduct(categoryItem, dataSource);
}
this.BindDataSource(dataSource);
}
catch (Exception ex)
{
LOGGER.Error(ex, "加载品类异常");
}
}
private void ShowAllProduct(CategoryItem categoryItem, List<ProductType> dataSource)
{
if (categoryItem.ShowAllProduct)
{
if (!dataSource.Exists(x => x.No == Constant.ALL_PRODUCT_TAG))
{
var type = new ProductType();
type.Id = IdWorkerUtils.Instance.NextId();
type.ParentId = string.Empty;
type.No = Constant.ALL_PRODUCT_TAG;
type.Name = "全部";
type.Products = 99999;
switch (this.ShowCagegoryType)
{
case CategoryShowType.:
case CategoryShowType.:
{
type.Path = type.Id;
}
break;
case CategoryShowType.:
{
type.Path = string.Format("{0},{1}", type.Id, type.Id);
}
break;
}
dataSource.Insert(0, type);
}
}
else
{
if (dataSource.Exists(x => x.No == Constant.ALL_PRODUCT_TAG))
{
var productType = dataSource.Find(x => x.No == Constant.ALL_PRODUCT_TAG);
dataSource.Remove(productType);
}
}
}
public void RefreshUi(CategoryItem item)
{
this.ShowCagegoryType = item.ShowType;
this.CategoryCornerType = item.CategoryCornerType;
this.MainCategoryRows = item.MainCategoryRows;
this.MainCategoryColumns = item.MainCategoryColumns;
this.MainCategoryFont = item.MainCategoryFont;
this.MainCategoryCode = item.MainCategoryCode;
this.MainCategoryBackColor1 = item.MainCategoryBackColor1;
this.MainCategoryBackColor2 = item.MainCategoryBackColor2;
this.MainCategorySelectedColor = item.MainCategorySelectedColor;
this.MainCategoryTextColor = item.MainCategoryTextColor;
this.MainAutoPager = item.MainAutoPager;
this.MainAutoItemWidth = item.MainAutoItemWidth;
this.MainCustomItemWidth = item.MainCustomItemWidth;
this.MainCategoryItemHeight = item.MainCategoryItemHeight;
this.SubCategoryRows = item.SubCategoryRows;
this.SubCategoryColumns = item.SubCategoryColumns;
this.SubCategoryFont = item.SubCategoryFont;
this.SubCategoryCode = item.SubCategoryCode;
this.SubCategoryBackColor1 = item.SubCategoryBackColor1;
this.SubCategoryBackColor2 = item.SubCategoryBackColor2;
this.SubCategorySelectedColor = item.SubCategorySelectedColor;
this.SubCategoryTextColor = item.SubCategoryTextColor;
this.SubAutoPager = item.SubAutoPager;
this.SubAutoItemWidth = item.SubAutoItemWidth;
this.SubCustomItemWidth = item.SubCustomItemWidth;
this.SubCategoryItemHeight = item.SubCategoryItemHeight;
this.RefreshUi();
}
public void BindDataSource(List<ProductType> dataSource)
{
this._dataSource = dataSource;
switch (this.ShowCagegoryType)
{
case CategoryShowType.:
{
//仅绑定大类
BindAllCategory();
}
break;
case CategoryShowType.:
{
//仅绑定小类
BindAllSubCategory();
}
break;
case CategoryShowType.:
{
//绑定大类
BindDefaultCategory();
}
break;
}
}
private void RefreshUi()
{
switch (this.ShowCagegoryType)
{
case CategoryShowType.:
{
//隐藏大类
this.mainCategory.Visible = false;
this.mainCategory.Height = 0;
//全部用小类呈现
this.subCategory.Visible = true;
this.subCategory.Height = this.MainCategoryRows * this.MainCategoryItemHeight;
this.subCategory.Rows = this.MainCategoryRows;
this.subCategory.Columns = this.MainCategoryColumns;
this.subCategory.FontSize = this.MainCategoryFont;
this.subCategory.DisplayCategoryCode = this.MainCategoryCode;
this.subCategory.BackColor1 = this.MainCategoryBackColor1;
this.subCategory.BackColor2 = this.MainCategoryBackColor2;
this.subCategory.SelectedColor = this.MainCategorySelectedColor;
this.subCategory.TextColor = this.MainCategoryTextColor;
this.subCategory.AutoPager = this.MainAutoPager;
this.subCategory.AutoItemWidth = this.MainAutoItemWidth;
this.subCategory.ItemWidth = this.MainCustomItemWidth;
this.subCategory.ItemHeight = this.MainCategoryItemHeight;
this.Height = this.MainCategoryRows * this.MainCategoryItemHeight;
}
break;
case CategoryShowType.:
{
//隐藏大类
this.mainCategory.Visible = false;
this.mainCategory.Height = 0;
//全部用小类呈现
this.subCategory.Visible = true;
this.subCategory.Height = this.SubCategoryRows * this.SubCategoryItemHeight;
this.subCategory.Rows = this.SubCategoryRows;
this.subCategory.Columns = this.SubCategoryColumns;
this.subCategory.FontSize = this.SubCategoryFont;
this.subCategory.DisplayCategoryCode = this.SubCategoryCode;
this.subCategory.BackColor1 = this.SubCategoryBackColor1;
this.subCategory.BackColor2 = this.SubCategoryBackColor2;
this.subCategory.SelectedColor = this.SubCategorySelectedColor;
this.subCategory.TextColor = this.SubCategoryTextColor;
this.subCategory.AutoPager = this.SubAutoPager;
this.subCategory.AutoItemWidth = this.SubAutoItemWidth;
this.subCategory.ItemWidth = this.SubCustomItemWidth;
this.subCategory.ItemHeight = this.SubCategoryItemHeight;
this.Height = this.SubCategoryRows * this.SubCategoryItemHeight;
}
break;
case CategoryShowType.:
{
//隐藏大类
this.mainCategory.Visible = true;
this.mainCategory.Height = this.MainCategoryRows * this.MainCategoryItemHeight;
//全部用小类呈现
this.subCategory.Visible = true;
this.subCategory.Height = this.SubCategoryRows * this.SubCategoryItemHeight;
this.mainCategory.Rows = this.MainCategoryRows;
this.mainCategory.Columns = this.MainCategoryColumns;
this.mainCategory.FontSize = this.MainCategoryFont;
this.mainCategory.DisplayCategoryCode = this.MainCategoryCode;
this.mainCategory.BackColor1 = this.MainCategoryBackColor1;
this.mainCategory.BackColor2 = this.MainCategoryBackColor2;
this.mainCategory.SelectedColor = this.MainCategorySelectedColor;
this.mainCategory.TextColor = this.MainCategoryTextColor;
this.mainCategory.AutoPager = this.MainAutoPager;
this.mainCategory.AutoItemWidth = this.MainAutoItemWidth;
this.mainCategory.ItemWidth = this.MainCustomItemWidth;
this.mainCategory.ItemHeight = this.MainCategoryItemHeight;
this.subCategory.Rows = this.SubCategoryRows;
this.subCategory.Columns = this.SubCategoryColumns;
this.subCategory.FontSize = this.SubCategoryFont;
this.subCategory.DisplayCategoryCode = this.SubCategoryCode;
this.subCategory.BackColor1 = this.SubCategoryBackColor1;
this.subCategory.BackColor2 = this.SubCategoryBackColor2;
this.subCategory.SelectedColor = this.SubCategorySelectedColor;
this.subCategory.TextColor = this.SubCategoryTextColor;
this.subCategory.AutoPager = this.SubAutoPager;
this.subCategory.AutoItemWidth = this.SubAutoItemWidth;
this.subCategory.ItemWidth = this.SubCustomItemWidth;
this.subCategory.ItemHeight = this.SubCategoryItemHeight;
this.Height = this.MainCategoryRows * this.MainCategoryItemHeight + this.SubCategoryRows * this.SubCategoryItemHeight;
}
break;
}
this.mainCategory.CategoryCornerType = this.CategoryCornerType;
this.subCategory.CategoryCornerType = this.CategoryCornerType;
this.mainCategory.Invalidate();
this.subCategory.Invalidate();
}
private int _subCategoryRows = 1;
/// <summary>
/// 显示内容的呈现方式
/// </summary>
[Category("小类设置"), DisplayName("显示行数"), Browsable(true)]
public int SubCategoryRows
{
get { return this._subCategoryRows; }
set
{
this._subCategoryRows = (value <= 0 ? 1 : value);
}
}
private int _subCategoryItemHeight = 45;
/// <summary>
/// 显示内容的呈现方式
/// </summary>
[Category("小类设置"), DisplayName("每行高度"), Browsable(true)]
public int SubCategoryItemHeight
{
get { return this._subCategoryItemHeight; }
set
{
this._subCategoryItemHeight = (value <= 0 ? 1 : value);
}
}
private int _subCategoryColumns = 1;
/// <summary>
/// 显示内容的呈现方式
/// </summary>
[Category("小类设置"), DisplayName("每行数量"), Browsable(true)]
public int SubCategoryColumns
{
get { return this._subCategoryColumns; }
set
{
this._subCategoryColumns = (value <= 0 ? 1 : value);
}
}
private bool _subCategoryCode = false;
/// <summary>
/// 是否显示小类编码
/// </summary>
[Category("小类设置"), DisplayName("显示编码"), Browsable(true)]
public bool SubCategoryCode
{
get { return this._subCategoryCode; }
set { this._subCategoryCode = value; }
}
private SystemFont _subCategoryFont = SystemFont.;
/// <summary>
/// 显示内容的呈现方式
/// </summary>
[Category("小类设置"), DisplayName("字体大小"), Browsable(true)]
public SystemFont SubCategoryFont
{
get { return this._subCategoryFont; }
set
{
this._subCategoryFont = value;
}
}
private string _subCategoryBackColor1 = ColorTranslator.ToHtml(Color.DimGray);
/// <summary>
/// 品类显示颜色
/// </summary>
[Category("小类设置"), DisplayName("背景色1"), Browsable(true)]
public string SubCategoryBackColor1
{
get { return this._subCategoryBackColor1; }
set { this._subCategoryBackColor1 = value; }
}
private string _subCategoryBackColor2 = ColorTranslator.ToHtml(Color.DimGray);
/// <summary>
/// 品类显示颜色
/// </summary>
[Category("小类设置"), DisplayName("背景色2"), Browsable(true)]
public string SubCategoryBackColor2
{
get { return this._subCategoryBackColor2; }
set { this._subCategoryBackColor2 = value; }
}
private string _subCategorySelectedColor = ColorTranslator.ToHtml(Color.DimGray);
/// <summary>
/// 品类选中的颜色
/// </summary>
[Category("小类设置"), DisplayName("选中颜色"), Browsable(true)]
public string SubCategorySelectedColor
{
get { return this._subCategorySelectedColor; }
set { this._subCategorySelectedColor = value; }
}
private string _subCategoryTextColor = ColorTranslator.ToHtml(Color.White);
/// <summary>
/// 品类显示颜色
/// </summary>
[Category("小类设置"), DisplayName("字体颜色"), Browsable(true)]
public string SubCategoryTextColor
{
get { return this._subCategoryTextColor; }
set { this._subCategoryTextColor = value; }
}
private bool _subAutoPager = true;
/// <summary>
/// 是否自动隐藏分页
/// </summary>
[Category("小类设置"), DisplayName("智能分页"), Browsable(true)]
public bool SubAutoPager
{
get
{
return this._subAutoPager;
}
set
{
this._subAutoPager = value;
}
}
private bool _subAutoItemWidth = true;
/// <summary>
/// 是否自动计算宽度
/// </summary>
[Category("小类设置"), DisplayName("自动适配"), Browsable(true)]
public bool SubAutoItemWidth
{
get
{
return this._subAutoItemWidth;
}
set
{
this._subAutoItemWidth = value;
}
}
private int _subItemWidth = 80;
/// <summary>
/// 自定义宽度
/// </summary>
[Category("小类设置"), DisplayName("自定义宽度"), Browsable(true)]
public int SubCustomItemWidth
{
get
{
return this._subItemWidth;
}
set
{
this._subItemWidth = value;
}
}
private bool _mainAutoItemWidth = true;
/// <summary>
/// 是否自动计算宽度
/// </summary>
[Category("大类设置"), DisplayName("自动适配"), Browsable(true)]
public bool MainAutoItemWidth
{
get
{
return this._mainAutoItemWidth;
}
set
{
this._mainAutoItemWidth = value;
}
}
private int _mainItemWidth = 80;
/// <summary>
/// 自定义宽度
/// </summary>
[Category("大类设置"), DisplayName("自定义宽度"), Browsable(true)]
public int MainCustomItemWidth
{
get
{
return this._mainItemWidth;
}
set
{
this._mainItemWidth = value;
}
}
private int _mainCategoryRows = 1;
/// <summary>
/// 显示内容的呈现方式
/// </summary>
[Category("大类设置"), DisplayName("显示行数"), Browsable(true)]
public int MainCategoryRows
{
get { return this._mainCategoryRows; }
set
{
this._mainCategoryRows = (value <= 0 ? 1 : value);
}
}
private int _mainCategoryItemHeight = 45;
/// <summary>
/// 显示内容的呈现方式
/// </summary>
[Category("大类设置"), DisplayName("每行高度"), Browsable(true)]
public int MainCategoryItemHeight
{
get { return this._mainCategoryItemHeight; }
set
{
this._mainCategoryItemHeight = (value <= 0 ? 1 : value);
}
}
private int _mainCategoryColumns = 1;
/// <summary>
/// 显示内容的呈现方式
/// </summary>
[Category("大类设置"), DisplayName("每行数量"), Browsable(true)]
public int MainCategoryColumns
{
get { return this._mainCategoryColumns; }
set
{
this._mainCategoryColumns = (value <= 0 ? 1 : value);
}
}
private SystemFont _mainCategoryFont = SystemFont.;
/// <summary>
/// 显示内容的呈现方式
/// </summary>
[Category("大类设置"), DisplayName("字体大小"), Browsable(true)]
public SystemFont MainCategoryFont
{
get { return this._mainCategoryFont; }
set
{
this._mainCategoryFont = value;
}
}
private bool _mainAutoPager = true;
/// <summary>
/// 是否自动隐藏分页
/// </summary>
[Category("大类设置"), DisplayName("智能分页"), Browsable(true)]
public bool MainAutoPager
{
get
{
return this._mainAutoPager;
}
set
{
this._mainAutoPager = value;
}
}
private bool _mainCategoryCode = false;
/// <summary>
/// 是否显示大类编码
/// </summary>
[Category("大类设置"), DisplayName("显示编码"), Browsable(true)]
public bool MainCategoryCode
{
get { return this._mainCategoryCode; }
set { this._mainCategoryCode = value; }
}
private string _mainCategoryBackColor1 = ColorTranslator.ToHtml(Color.DimGray);
/// <summary>
/// 品类显示颜色
/// </summary>
[Category("大类设置"), DisplayName("背景色1"), Browsable(true)]
public string MainCategoryBackColor1
{
get { return this._mainCategoryBackColor1; }
set { this._mainCategoryBackColor1 = value; }
}
private string _mainCategoryBackColor2 = ColorTranslator.ToHtml(Color.DimGray);
/// <summary>
/// 品类显示颜色
/// </summary>
[Category("大类设置"), DisplayName("背景色2"), Browsable(true)]
public string MainCategoryBackColor2
{
get { return this._mainCategoryBackColor2; }
set { this._mainCategoryBackColor2 = value; }
}
private string _mainCategorySelectedColor = ColorTranslator.ToHtml(Color.DimGray);
/// <summary>
/// 品类选中的颜色
/// </summary>
[Category("大类设置"), DisplayName("选中颜色"), Browsable(true)]
public string MainCategorySelectedColor
{
get { return this._mainCategorySelectedColor; }
set { this._mainCategorySelectedColor = value; }
}
private string _mainCategoryTextColor = ColorTranslator.ToHtml(Color.White);
/// <summary>
/// 品类显示颜色
/// </summary>
[Category("大类设置"), DisplayName("字体颜色"), Browsable(true)]
public string MainCategoryTextColor
{
get { return this._mainCategoryTextColor; }
set { this._mainCategoryTextColor = value; }
}
private CategoryShowType _showCagegoryType = CategoryShowType.;
/// <summary>
/// 显示内容的呈现方式
/// </summary>
[Category("品类控件"), DisplayName("呈现方式"), Browsable(true)]
public CategoryShowType ShowCagegoryType
{
get { return this._showCagegoryType; }
set
{
this._showCagegoryType = value;
}
}
/// <summary>
/// 显示样式
/// </summary>
[Category("品类控件"), DisplayName("显示样式"), Browsable(true)]
public CornerType CategoryCornerType { get; set; } = CornerType.;
/// <summary>
/// 显示大类和小类
/// </summary>
private void BindDefaultCategory()
{
Task.Factory.StartNew(() =>
{
List<ProductType> lists = null;
if (this._dataSource != null)
{
//大类小类显示,不支持全部标签
if (this._dataSource.Exists(x => x.No == Constant.ALL_PRODUCT_TAG))
{
var productType = this._dataSource.Find(x => x.No == Constant.ALL_PRODUCT_TAG);
//this._dataSource.Remove(productType);
}
lists = this._dataSource.FindAll(x => string.IsNullOrEmpty(x.ParentId));
}
return lists;
}).ContinueWith(task =>
{
if (task.IsFaulted)
{
LOGGER.Error(task.Exception.GetBaseException(), "过滤大类异常");
}
else
{
this.Invoke(new Action(() =>
{
var data = task.Result;
if (data != null)
{
this.mainCategory.BindDataSource(data);
//默认加载小类,避免首次打开界面不呈现小类
if (data.Count > 0)
{
var entity = data[0];
var subs = new List<ProductType>();
if (this._dataSource != null)
{
subs = this._dataSource.FindAll(x => !string.IsNullOrEmpty(x.ParentId) && x.ParentId.Equals(entity.Id));
}
this.subCategory.BindDataSource(subs);
}
}
}));
}
});
}
private void BindSubCategory(ProductType entity)
{
Task.Factory.StartNew(() =>
{
List<ProductType> lists = null;
if (this._dataSource != null)
{
lists = this._dataSource.FindAll(x => !string.IsNullOrEmpty(x.ParentId) && x.ParentId.Equals(entity.Id));
}
return lists;
}).ContinueWith(task =>
{
if (task.IsFaulted)
{
LOGGER.Error(task.Exception.GetBaseException(), "大类点击操作异常");
}
else
{
this.Invoke(new Action(() =>
{
var data = task.Result;
if (data != null)
{
//初始化页码
this.subCategory.PageNumber = 1;
this.subCategory.BindDataSource(data);
}
}));
}
});
}
/// <summary>
/// 绑定大类
/// </summary>
private void BindAllCategory()
{
Task.Factory.StartNew(() =>
{
List<ProductType> lists = null;
if (this._dataSource != null)
{
//仅绑定大类
lists = this._dataSource.FindAll(x => string.IsNullOrEmpty(x.ParentId));
}
return lists;
}).ContinueWith(task =>
{
if (task.IsFaulted)
{
LOGGER.Error(task.Exception.GetBaseException(), "过滤大类异常");
}
else
{
this.Invoke(new Action(() =>
{
var data = task.Result;
if (data != null)
{
this.subCategory.BindDataSource(data);
}
}));
}
});
}
/// <summary>
/// 绑定小类
/// </summary>
private void BindAllSubCategory()
{
Task.Factory.StartNew(() =>
{
List<ProductType> lists = null;
if (this._dataSource != null)
{
lists = new List<ProductType>();
//仅绑定小类
//lists.AddRange(this._dataSource.FindAll(x => x.Path.Length == (x.Id.Length * 2 + 1)));
//zhangy 2020-03-07 Edit 修改分类显示的Bug引发Bug的核心问题在IdWorkerUtils生成的数字长度变为19位了
lists.AddRange(this._dataSource.FindAll(x => x.Path.Contains(",") && x.Path.Split(',').Length == 2));
}
return lists;
}).ContinueWith(task =>
{
if (task.IsFaulted)
{
LOGGER.Error(task.Exception.GetBaseException(), "过滤小类异常");
}
else
{
this.Invoke(new Action(() =>
{
var data = task.Result;
if (data != null)
{
this.subCategory.BindDataSource(data);
}
}));
}
});
}
public event CategoryEventHandler CategoryCheckedChanged;
protected virtual void OnCategoryCheckedChanged(CategoryEventArgs e)
{
CategoryCheckedChanged?.Invoke(this, e);
}
private void OnMainCategoryChecked(object sender, CategoryEventArgs e)
{
BindSubCategory(e.Data);
OnCategoryCheckedChanged(new CategoryEventArgs(e.Data));
}
private void OnSubCategoryChecked(object sender, CategoryEventArgs e)
{
OnCategoryCheckedChanged(new CategoryEventArgs(e.Data));
}
}
}