/// 左侧数据源 /// [Description("左侧列表数据源"), Category("自定义"), Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public object[] LeftDataSource { get { return leftDataSource; } set { leftDataSource = value; dgvLeft.DataSource = value; } }
///
/// 右侧数据源 /// [Description("右侧列表数据源"), Category("自定义"), Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public object[] RightDataSource { get { return rightDataSource; } set { rightDataSource = value; dgvRight.DataSource = value; } }
数据交互实现
控件的核心功能是实现左右数据的双向移动。以下是实现细节:
private void btnRight_BtnClick(object sender, EventArgs e) { if (LeftDataSource == null || RightDataSource == null) { throw new Exception("左右数据源列表不能为空"); } if (LeftDataSource.GetType() != RightDataSource.GetType()) { throw new Exception("左右数据源列表类型不一致,无法进行操作"); } if (dgvLeft.SelectRows == null || dgvLeft.SelectRows.Count <= 0) return;
List
}
private void btnLeft_BtnClick(object sender, EventArgs e) { if (LeftDataSource == null || RightDataSource == null) { throw new Exception("左右数据源列表不能为空"); } if (LeftDataSource.GetType() != RightDataSource.GetType()) { throw new Exception("左右数据源列表类型不一致,无法进行操作"); } if (dgvRight.SelectRows == null || dgvRight.SelectRows.Count <= 0) return;
List lst = new List(); dgvRight.SelectRows.ForEach(p => { lst.Add(p.DataSource); p.IsChecked = false; }); var lstLeft = LeftDataSource.ToList(); lstLeft.AddRange(lst); var lstRight = RightDataSource.ToList(); lstRight.RemoveAll(p => lst.Contains(p)); RightDataSource = lstRight.ToArray(); LeftDataSource = lstLeft.ToArray(); if (Transfered != null) { Transfered(this, new TransferEventArgs() { TransferDataSource = lst.ToArray(), ToRightOrLeft = false }); }
}
完整代码展示
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;
namespace HZH_Controls.Controls
{ /// /// Class UCTransfer. /// Implements the . /// [DefaultEvent("Transfered")] public partial class UCTransfer : UserControl { /// /// 移动数据事件 /// [Description("移动数据事件"), Category("自定义")] public event TransferEventHandler Transfered;
private DataGridViewColumnEntity[] leftColumns; private DataGridViewColumnEntity[] rightColumns; private object[] leftDataSource; private object[] rightDataSource; public DataGridViewColumnEntity[] LeftColumns { get { return leftColumns; } set { leftColumns = value; this.dgvLeft.Columns = leftColumns.ToList(); } } public DataGridViewColumnEntity[] RightColumns { get { return rightColumns; } set { rightColumns = value; this.dgvRight.Columns = leftColumns.ToList(); } } [Description("左侧列表数据源"), Category("自定义"), Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public object[] LeftDataSource { get { return leftDataSource; } set { leftDataSource = value; dgvLeft.DataSource = value; } } [Description("右侧列表数据源"), Category("自定义"), Browsable(false), EditorBrowsable(EditorBrowsableState.Now)] public object[] RightDataSource { get { return rightDataSource; } set { rightDataSource = value; dgvRight.DataSource = value; } } public UCTransfer() { InitializeComponent(); dgvLeft.IsCloseAutoHeight = true; dgvRight.IsCloseAutoHeight = true; LeftColumns = new DataGridViewColumnEntity[0]; RightColumns = new DataGridViewColumnEntity[0]; LeftDataSource = new object[0]; RightDataSource = new object[0]; } private void btnRight_BtnClick(object sender, EventArgs e) { if (LeftDataSource == null || RightDataSource == null) { throw new Exception("左右数据源列表不能为空"); } if (LeftDataSource.GetType() != RightDataSource.GetType()) { throw new Exception("左右数据源列表类型不一致,无法进行操作"); } if (dgvLeft.SelectRows == null || dgvLeft.SelectRows.Count <= 0) return; List lst = new List(); dgvLeft.SelectRows.ForEach(p => { lst.Add(p.DataSource); p.IsChecked = false; }); var lstRight = RightDataSource.ToList(); lstRight.AddRange(lst); var lstLeft = LeftDataSource.ToList(); lstLeft.RemoveAll(p => lst.Contains(p)); RightDataSource = lstRight.ToArray(); LeftDataSource = lstLeft.ToArray(); if (Transfered != null) { Transfered(this, new TransferEventArgs() { TransferDataSource = lst.ToArray(), ToRightOrLeft = true }); } } private void btnLeft_BtnClick(object sender, EventArgs e) { if (LeftDataSource == null || RightDataSource == null) { throw new Exception("左右数据源列表不能为空"); } if (LeftDataSource.GetType() != RightDataSource.GetType()) { throw new Exception("左右数据源列表类型不一致,无法进行操作"); } if (dgvRight.SelectRows == null || dgvRight.SelectRows.Count <= 0) return; List lst = new List(); dgvRight.SelectRows.ForEach(p => { lst.Add(p.DataSource); p.IsChecked = false; }); var lstLeft = LeftDataSource.ToList(); lstLeft.AddRange(lst); var lstRight = RightDataSource.ToList(); lstRight.RemoveAll(p => lst.Contains(p)); RightDataSource = lstRight.ToArray(); LeftDataSource = lstLeft.ToArray(); if (Transfered != null) { Transfered(this, new TransferEventArgs() { TransferDataSource = lst.ToArray(), ToRightOrLeft = false }); } } }