博客
关于我
(八十二)c#Winform自定义控件-穿梭框-HZHControls
阅读量:415 次
发布时间:2019-03-06

本文共 7054 字,大约阅读时间需要 23 分钟。

自定义控件开发系列 | 数据可视化用户控件实现

本系列文章将介绍一套漂亮点的自定义数据可视化用户控件的开发过程
发布于 2023-10-10

作为一名开发人员,我一直对自定义控件充满兴趣。通过多年的实践积累,我决定开发一套简洁美观的数据可视化用户控件。今天,我将分享我开发这套控件的全过程。

NuGet 包管理工具

要快速获取所需的自定义控件,可以通过以下命令安装NuGet包:

Install-Package HZH_Controls

控件功能概述

本控件主要功能包括:

- 支持双向数据传输 - 可视化数据列表展示 - 多列操作 - 数据源管理 - 事件触发机制

控件属性详解

以下是控件主要属性的详细说明:

///

/// 数据移动事件 /// [Description("移动数据事件"), Category("自定义")] public event TransferEventHandler Transfered;

///

/// 左侧列表列
///
private DataGridViewColumnEntity[] leftColumns;

///

/// 右侧列表列
///
private DataGridViewColumnEntity[] rightColumns;

///

/// 左侧数据源
///
[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 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 });  }

}

完整代码展示

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

}

总结

以上是关于自定义数据可视化用户控件开发的完整实现方案。如果你对这段代码感兴趣,欢迎前往我的GitHub或码云仓库进行查阅和下载。

如有任何疑问或建议,欢迎在评论区留言交流。你的支持是我最大的动力!

转载地址:http://hdvkz.baihongyu.com/

你可能感兴趣的文章
python3 grpc安装
查看>>
python3 mysql 封装多表_python3 mysql-多表查询
查看>>
python3 mysql8_Python MySQL8.0 错误:authentication plugin 'calling_sha2_password' is not supported....
查看>>
Python关键代码总览!从Zero到Hero必看的考点
查看>>
python3 robotframework+pycharm框架搭建
查看>>
Python3 shutil模块
查看>>
Python关于strftime函数详细解析 附实战代码
查看>>
Python3 tutorial day3
查看>>
python3 week4
查看>>
Python3 创建数组
查看>>
python3 套接字异常(a byte-like object is required not str)
查看>>
python3 实现用户三次输入错误记录黑名单并对该用户登录锁定-day1
查看>>
python3 文本变图片
查看>>
Python3 查看 com 组件的属性
查看>>
python3 案例分享--发邮件
查看>>
python3 模板库_Python3 标准库概览_Python教程_我爱模板网 - 提供下载各种免费建站资源,免费网站模板,免费网页特效,让你爱上建站!...
查看>>
Python3 求最大/小值及索引值 Numpy
查看>>
python3+django使用celery执行某些任务失败的解决方案
查看>>
Python3+Requests+Unittest实战系列【一】
查看>>
python3+requests+unittest实战系列【一】
查看>>