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.Collections; using JwKdsV.Core.Utils; namespace JwKdsV.Component { public partial class DualListBox : UserControl { private BindingSource sourceBindingSource = new BindingSource(); private BindingSource selectBindingSource = new BindingSource(); public DualListBox() { InitializeComponent(); this.sourceListBox.DataSource = sourceBindingSource; this.selectListBox.DataSource = selectBindingSource; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); } [Category("杂项"), Description("数据源")] private object _dataSource; public object DataSource { get { return _dataSource; } set { this._dataSource = value; sourceBindingSource.DataSource = this._dataSource; RefreshLabelInfo(); } } private string _displayMember; [Category("杂项"), Description("显示内容")] public string DisplayMember { get { return _displayMember; } set { if(value == null) { return; } this._displayMember = value; this.sourceListBox.DisplayMember = this._displayMember; } } public string _valueMember; [Category("杂项"), Description("取值内容")] public string ValueMember { get { return _valueMember; } set { if(value == null) { return; } this._valueMember = value; this.sourceListBox.ValueMember = this._valueMember; } } public object SelectedValues { get { var select = selectBindingSource.DataSource; if(select == null) { select = new List(); } return select; } set { var list = sourceBindingSource.DataSource as IList; if (list == null) { list = new List(); sourceBindingSource.DataSource = list; } var selectedBoxSource = selectBindingSource.DataSource as IList; if (selectedBoxSource == null) { selectedBoxSource = new List(); selectBindingSource.DataSource = selectedBoxSource; } List delObjectList = new List(); var temp = value as List; if (temp == null) { return; } foreach (var s in temp) { foreach (var obj in list) { var tempObjClone = ObjectUtils.Copy(obj); var tempValue = GetPropertyValue(tempObjClone, this.ValueMember); if (tempValue != null && tempValue.Equals(s)) { selectedBoxSource.Add(tempObjClone); delObjectList.Add(obj); break; } } } foreach (var obj in delObjectList) { list.Remove(obj); } if (selectedBoxSource.Count > 0) { this.selectListBox.DisplayMember = this.DisplayMember; this.selectListBox.ValueMember = this.ValueMember; } sourceBindingSource.ResetBindings(true); selectBindingSource.ResetBindings(true); RefreshLabelInfo(); } } /// /// 获取一个类指定的属性值 /// /// object对象 /// 属性名称 /// public static object GetPropertyValue(object info, string field) { if (info == null) return null; if (field == null) return null; Type t = info.GetType(); IEnumerable property = from pi in t.GetProperties() where pi.Name.ToLower() == field.ToLower() select pi; return property.First().GetValue(info, null); } public void RefreshLabelInfo() { string selectedValue = this.sourceListBox.SelectedValue as string; var list = sourceBindingSource.DataSource as IList; if (list == null) { list = new List(); } var selectedBoxSource = selectBindingSource.DataSource as IList; if (selectedBoxSource == null) { selectedBoxSource = new List(); } this.sourceLabel.Text = list.Count > 0 ? string.Format("可选项 {0}", list.Count) : "没有可选项"; this.selectLabel.Text = selectedBoxSource.Count > 0 ? string.Format("可选项 {0}", selectedBoxSource.Count) : "没有可选项"; } private void OnSourceItemClick(object sender, EventArgs e) { string selectedValue = this.sourceListBox.SelectedValue as string; var list = sourceBindingSource.DataSource as IList; if (list == null) { list = new List(); sourceBindingSource.DataSource = list; } var selectedBoxSource = selectBindingSource.DataSource as IList; if (selectedBoxSource == null) { selectedBoxSource = new List(); selectBindingSource.DataSource = selectedBoxSource; } List delObjectList = new List(); foreach (var obj in list) { var tempObjClone = ObjectUtils.Copy(obj); var tempValue = GetPropertyValue(tempObjClone, this.ValueMember); if (tempValue != null && tempValue.Equals(selectedValue)) { selectedBoxSource.Add(tempObjClone); delObjectList.Add(obj); break; } } foreach (var obj in delObjectList) { list.Remove(obj); } if (selectedBoxSource.Count > 0) { this.selectListBox.DisplayMember = this.DisplayMember; this.selectListBox.ValueMember = this.ValueMember; } sourceBindingSource.ResetBindings(true); selectBindingSource.ResetBindings(true); RefreshLabelInfo(); } private void OnSelectItemClick(object sender, EventArgs e) { string selectedValue = this.selectListBox.SelectedValue as string; var selectedBoxSource = selectBindingSource.DataSource as IList; if (selectedBoxSource == null) { return; } var list = sourceBindingSource.DataSource as IList; if (list == null) { list = new List(); sourceBindingSource.DataSource = list; } List delObjectList = new List(); foreach (var obj in selectedBoxSource) { var tempObjClone = ObjectUtils.Copy(obj); var tempValue = GetPropertyValue(tempObjClone, this.ValueMember); if (tempValue != null && tempValue.Equals(selectedValue)) { list.Add(tempObjClone); delObjectList.Add(obj); break; } } foreach (var obj in delObjectList) { selectedBoxSource.Remove(obj); } sourceBindingSource.ResetBindings(true); selectBindingSource.ResetBindings(true); RefreshLabelInfo(); } private void OnSourceAll2SelectClick(object sender, EventArgs e) { var list = sourceBindingSource.DataSource as IList; if (list == null) { list = new List(); sourceBindingSource.DataSource = list; } var selectedBoxSource = selectBindingSource.DataSource as IList; if (selectedBoxSource == null) { selectedBoxSource = new List(); selectBindingSource.DataSource = selectedBoxSource; } foreach(var item in list) { selectedBoxSource.Add(item); } if (selectedBoxSource.Count > 0) { this.selectListBox.DisplayMember = this.DisplayMember; this.selectListBox.ValueMember = this.ValueMember; } this.DataSource = null; sourceBindingSource.ResetBindings(true); selectBindingSource.ResetBindings(true); RefreshLabelInfo(); } private void OnSelect2SouceClick(object sender, EventArgs e) { var list = sourceBindingSource.DataSource as IList; if(list == null) { list = new List(); sourceBindingSource.DataSource = list; } var selectedBoxSource = selectBindingSource.DataSource as IList; if (selectedBoxSource == null) { selectedBoxSource = new List(); selectBindingSource.DataSource = selectedBoxSource; } foreach(var item in selectedBoxSource) { list.Add(item); } selectBindingSource.DataSource = null; sourceBindingSource.ResetBindings(true); selectBindingSource.ResetBindings(true); RefreshLabelInfo(); } } }