using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Windows.Forms; using DPumpHydr.WinFrmUI.WenSkin.Controls.ListBoxControl; namespace DPumpHydr.WinFrmUI.WenSkin.Controls { [Designer(typeof(Design.Designer.WenListBoxControlDesigner))] public class WenListBoxControl : WenControl { public WenListBoxControl() : base() { flow = new FlowLayoutPanel() { Dock = DockStyle.Fill, AutoScroll = true, BorderStyle = BorderStyle.FixedSingle }; this.Controls.Add(flow); Size = new Size(120, 120); } private FlowLayoutPanel flow; private WenListBoxControlItemCollection items; protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); if (!AutoItemHight) foreach (Control control in flow.Controls) { control.Width = this.Width - 25; } } #region 委托 public delegate void ButtonClickEventHandler(object sender, ButtonClickEventArgs e); public class ButtonClickEventArgs : EventArgs { public object Value { get; set; } public Control ItemControl { get; set; } public string Text { get; set; } public string Name { get; set; } public WenListBoxControlItem Item { get; set; } public bool State { get; set; } = true; } public event ButtonClickEventHandler ButtonClick; public event ButtonClickEventHandler RemoveClick; public event ButtonClickEventHandler RemoveItemBeforeChanged; public event ButtonClickEventHandler ItemClick; protected virtual void OnRemoveClick(ButtonClickEventArgs e) { RemoveClick?.Invoke(this, e); } protected virtual void OnButtonClick(ButtonClickEventArgs e) { ButtonClick?.Invoke(this, e); } protected virtual void OnItemClick(ButtonClickEventArgs e) { ItemClick?.Invoke(this, e); } #endregion #region 公有属性 [Category("Wen"), Description("选项值"), DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [Editor(typeof(Design.Editor.WenCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))] public WenListBoxControlItemCollection Items => items ??= new WenListBoxControlItemCollection(this); [Category("Wen"), Description("设置模板 类请用typeof(Class)"), DefaultValue(typeof(WenListBoxControlItemTemplate))] public Type Template { get; set; } = typeof(WenListBoxControlItemTemplate); [Category("Wen"), Description("设置当行的高度"), DefaultValue(30)] public int ItemHight { get; set; } = 30; [Category("Wen"), Description("是否自动大小"), DefaultValue(false)] public bool AutoItemHight { get; set; } = false; [Category("Wen"), Description("是否显示删除按钮"), DefaultValue(true)] public bool RemoveButtonShow { get; set; } = true; [Category("WenImage"), Description("是否显示自定义按钮"), DefaultValue(true)] public bool ButtonShow { get; set; } = true; [Category("WenImage"), Description("自定义按钮图标"), DefaultValue(true)] public Image ButtonImage { get; set; } #endregion #region 绑定数据 [Category("WenData"), Description("绑定数据列"), DefaultValue(null)] public string ColumnName { get; set; } private object dataSource { get; set; } [Browsable(false)] public object DataSource { get => dataSource; set { if (value != null) { dataSource = value; DataBind(); } } } private void DataBind() { if (dataSource == null) return; this.Items.Clear(); //分类数据绑定 switch (dataSource) { case DataSet ds: DataBindDataTable(ds.Tables[0]); break; case DataTable dt: DataBindDataTable(dt); break; case System.Collections.IList ilist: if (string.IsNullOrWhiteSpace(ColumnName)) { foreach (var li in ilist) { List propertyInfos = new List(li.GetType().GetProperties()); string value = propertyInfos.Find(a => a.Name.ToUpper() == ColumnName.ToUpper())?.GetValue(li, null)?.ToString(); WenListBoxControlItem item = new WenListBoxControlItem() { Text = value, Tag = li }; Items.Add(item); } } else { foreach (var li in ilist) { string value = li.GetType().GetProperties()[0].GetValue(li, null)?.ToString(); WenListBoxControlItem item = new WenListBoxControlItem() { Text = value, Tag = li }; Items.Add(item); } } break; default: break; } //绑定数据 void DataBindDataTable(DataTable dt) { if (string.IsNullOrWhiteSpace(ColumnName)) { foreach (DataRow dr in dt.Rows) { WenListBoxControlItem item = new WenListBoxControlItem() { Text = dr[0]?.ToString(), Tag = dr }; Items.Add(item); } } else { foreach (DataRow dr in dt.Rows) { WenListBoxControlItem item = new WenListBoxControlItem() { Text = dr[ColumnName]?.ToString(), Tag = dr }; Items.Add(dr[ColumnName]); } } } } #endregion #region 子类 public class WenListBoxControlItemCollection : WenCollection { private readonly WenListBoxControl owner; public WenListBoxControlItemCollection(WenListBoxControl owner) { this.owner = owner; } public WenListBoxControlItem this[int index] { get => Items[index] as WenListBoxControlItem; set { if (value is WenListBoxControlItem item) Items[index] = item; } } public WenListBoxControlItem this[string str] { get => Items.ToArray().ToList().Find(q => (q as WenListBoxControlItem).Text.ToUpper() == str.ToUpper() || (q as WenListBoxControlItem).Name.ToUpper() == str.ToUpper()) as WenListBoxControlItem; } public override int Add(object value) { if (value is WenListBoxControlItem controlItem) { //自定义模板处理 if (controlItem.Template != null) { var type = System.Activator.CreateInstance(owner.Template); if (type is Control control) { control.Text = controlItem.Text; control.Name = controlItem.Name; control.Tag = controlItem.Tag; controlItem.Control = control; } } else if (owner.Template != null) { controlItem.Template = owner.Template; var type = System.Activator.CreateInstance(owner.Template); if (type is Control control) { control.Text = controlItem.Text; control.Name = controlItem.Name; control.Tag = controlItem.Tag; controlItem.Control = control; } } //模板继承控件事件处理 if (controlItem.Control is WenListBoxControlItemTemplate template) { template.RemoveButtonShow = owner.RemoveButtonShow; template.ButtonShow = owner.ButtonShow; template.ButtonImage = owner.ButtonImage; ButtonClickEventArgs ex = new ButtonClickEventArgs { Item = controlItem, Text = controlItem.Text, Name = controlItem.Name, ItemControl = controlItem.Control, }; //删除按钮点击事件移除内容 template.RemoveClick += (s, e) => { ex.State = true; this.owner.RemoveItemBeforeChanged(owner, ex); if (ex.State) { this.Remove(controlItem); } this.owner.OnRemoveClick(ex); }; //自定义按钮点击事件 template.ButtonClick += (s, e) => { owner.OnButtonClick(ex); }; //单击事件 template.Click += (s, e) => { owner.OnItemClick(ex); }; } //添加单项 owner.flow.Controls.Add(controlItem.Control); //是否自定义尺寸 if (!owner.AutoItemHight) { controlItem.Control.Width = owner.Width - 25; controlItem.Control.Height = owner.ItemHight; } } else { return Add(value?.ToString()); } return base.Add(value); } public int Add(string text) { WenListBoxControlItem controlItem = new WenListBoxControlItem(text); return this.Add(controlItem); } public override void Clear() { base.Clear(); owner.flow.Controls.Clear(); } public override void Remove(object value) { base.Remove(value); if (value is WenListBoxControlItem controlItem) { owner.flow.Controls.Remove(controlItem.Control); } } public override void RemoveAt(int index) { base.RemoveAt(index); if (this[index] is WenListBoxControlItem controlItem) { owner.flow.Controls.Remove(controlItem.Control); } } } public class WenListBoxControlItem { public WenListBoxControlItem() { value = "文本"; Name = "Name"; Tag = null; } public WenListBoxControlItem(string text) : this() { value = text; } public WenListBoxControlItem(object val) { value = val; } #region 私有属性 private string name; private object tag; private object value; #endregion #region 公有属性 /// /// 控件 /// [Browsable(false)] public Control Control { get; set; } /// /// text内容 /// [Category("Wen"), Description("内容"), DefaultValue(true)] public string Text { get => this.Value?.ToString(); set => this.Value = value; } /// /// Value值 /// [Category("Wen"), Description("内容"), DefaultValue(true)] public object Value { get => this.value; set { this.value = value; if (Control != null) { Control.Text = value?.ToString(); this.Control.Invalidate(); } } } /// /// 名称 /// [Category("Wen"), Description("名称"), DefaultValue(true)] public string Name { get => name; set { name = value; if (Control != null) Control.Name = value; } } /// /// 绑定数据 /// [Category("Wen"), Description("绑定数据"), DefaultValue(true)] public object Tag { get => tag; set { tag = value; if (Control != null) Control.Tag = value; } } /// /// 单项模板 请使用typeof(class) /// [Browsable(false)] [Category("Wen"), Description("单项模板"), DefaultValue(true)] public Type Template { get; set; } #endregion public override string ToString() { return Text; } } #endregion } }