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.

168 lines
4.8 KiB
C#

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.MessageEvent;
using POSV.Bean;
using POSV.Utils;
using System.Threading.Tasks;
namespace POSV.Component
{
[ToolboxItem(true)]
public partial class CategoryXControl : BaseUserControl
{
/// <summary>
/// 数据源
/// </summary>
private List<ProductType> _dataSource = null;
public CategoryXControl()
{
InitializeComponent();
this.BackColor = Color.Transparent;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (this.DesignMode) return;
this.mainCategory.CategoryXCheckedChanged += OnMainCategoryXCheckedChanged;
this.subCategory.CategoryXCheckedChanged += OnSubCategoryXCheckedChanged;
InitProductType();
}
private void InitProductType()
{
try
{
var dataSource = new List<ProductType>();
//呈现品类下包含商品的
using (var db = Global.Instance.OpenDataBase)
{
dataSource = db.Query<ProductType>(" where products > @0 order by no", 0).ToList();
}
this.BindDataSource(dataSource);
}
catch (Exception ex)
{
LOGGER.Error(ex, "加载品类异常");
}
}
public void BindDataSource(List<ProductType> dataSource)
{
this._dataSource = dataSource;
BindMainCategory();
}
/// <summary>
/// 绑定大小类
/// </summary>
private void BindMainCategory()
{
Task.Factory.StartNew(() =>
{
List<ProductType> list = null;
if (this._dataSource != null)
{
list = this._dataSource.FindAll(x => string.IsNullOrEmpty(x.ParentId));
}
return list;
}).ContinueWith(task =>
{
if (task.IsFaulted)
{
LOGGER.Error(task.Exception.GetBaseException(), "过滤大类异常");
}
else
{
if (this.IsDisposed || !this.IsHandleCreated) return;
this.Invoke(new Action(() =>
{
var data = task.Result;
if (data != null)
{
this.mainCategory.PageNumber = 1;
this.mainCategory.BindDataSource(data);
//默认加载小类,避免首次打开界面不呈现小类
if (data.Count > 0)
{
var entity = data[0];
BindSubCategory(entity);
}
}
}));
}
});
}
private void BindSubCategory(ProductType entity)
{
Task.Factory.StartNew(() =>
{
List<ProductType> lists = null;
if (this._dataSource != null)
{
lists = this._dataSource.FindAll(x => x.Path.Contains(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);
}
}));
}
});
}
private void OnSubCategoryXCheckedChanged(object sender, CategoryXEventArgs e)
{
OnCategoryXCheckedChanged(new CategoryXEventArgs(e.Data));
}
private void OnMainCategoryXCheckedChanged(object sender, CategoryXEventArgs e)
{
BindSubCategory(e.Data);
OnCategoryXCheckedChanged(new CategoryXEventArgs(e.Data));
}
public event CategoryXEventHandler CategoryXCheckedChanged;
protected virtual void OnCategoryXCheckedChanged(CategoryXEventArgs e)
{
CategoryXCheckedChanged?.Invoke(this, e);
}
}
}