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.
321 lines
10 KiB
C#
321 lines
10 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 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<object>();
|
|
}
|
|
return select;
|
|
}
|
|
set
|
|
{
|
|
var list = sourceBindingSource.DataSource as IList;
|
|
if (list == null)
|
|
{
|
|
list = new List<object>();
|
|
sourceBindingSource.DataSource = list;
|
|
}
|
|
var selectedBoxSource = selectBindingSource.DataSource as IList;
|
|
if (selectedBoxSource == null)
|
|
{
|
|
selectedBoxSource = new List<object>();
|
|
selectBindingSource.DataSource = selectedBoxSource;
|
|
}
|
|
|
|
List<object> delObjectList = new List<object>();
|
|
var temp = value as List<string>;
|
|
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();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取一个类指定的属性值
|
|
/// </summary>
|
|
/// <param name="info">object对象</param>
|
|
/// <param name="field">属性名称</param>
|
|
/// <returns></returns>
|
|
public static object GetPropertyValue(object info, string field)
|
|
{
|
|
if (info == null) return null;
|
|
if (field == null) return null;
|
|
Type t = info.GetType();
|
|
IEnumerable<System.Reflection.PropertyInfo> 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<object>();
|
|
}
|
|
var selectedBoxSource = selectBindingSource.DataSource as IList;
|
|
if (selectedBoxSource == null)
|
|
{
|
|
selectedBoxSource = new List<object>();
|
|
}
|
|
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<object>();
|
|
sourceBindingSource.DataSource = list;
|
|
}
|
|
var selectedBoxSource = selectBindingSource.DataSource as IList;
|
|
if (selectedBoxSource == null)
|
|
{
|
|
selectedBoxSource = new List<object>();
|
|
selectBindingSource.DataSource = selectedBoxSource;
|
|
}
|
|
|
|
List<object> delObjectList = new List<object>();
|
|
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<object>();
|
|
sourceBindingSource.DataSource = list;
|
|
}
|
|
List<object> delObjectList = new List<object>();
|
|
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<object>();
|
|
sourceBindingSource.DataSource = list;
|
|
}
|
|
var selectedBoxSource = selectBindingSource.DataSource as IList;
|
|
if (selectedBoxSource == null)
|
|
{
|
|
selectedBoxSource = new List<object>();
|
|
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<object>();
|
|
sourceBindingSource.DataSource = list;
|
|
}
|
|
var selectedBoxSource = selectBindingSource.DataSource as IList;
|
|
if (selectedBoxSource == null)
|
|
{
|
|
selectedBoxSource = new List<object>();
|
|
selectBindingSource.DataSource = selectedBoxSource;
|
|
}
|
|
|
|
foreach(var item in selectedBoxSource)
|
|
{
|
|
list.Add(item);
|
|
}
|
|
selectBindingSource.DataSource = null;
|
|
sourceBindingSource.ResetBindings(true);
|
|
selectBindingSource.ResetBindings(true);
|
|
RefreshLabelInfo();
|
|
}
|
|
|
|
}
|
|
}
|