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#

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();
}
}
}