博客
关于我
(八十二)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/

你可能感兴趣的文章
PostgreSQL 导入 .gz 备份文件
查看>>
PostgreSQL 批量插入&更新数据时报错(ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time)
查看>>
PostgreSQL 新增数据返回自增ID
查看>>
postgresql 更新多列数据
查看>>
PostgreSQL 服务启动后停止
查看>>
PostgreSQL 辟谣存在任意代码执行漏洞:消息不实
查看>>
PostgreSQL+PostGIS实现两坐标点之间最短路径查询算法函数(地图工具篇.12)
查看>>
Qt开发——简易调色板QPalette
查看>>
PostgreSQL-解决连接时遇到的乱码问题
查看>>
PostgreSQL15.2最新版本安装_远程连接_Navicat操作_pgAdmin操作_Windows10上安装---PostgreSQL工作笔记001
查看>>
PostgreSQL9.1 双机部署配置(主备数据同步)
查看>>
Qt开发——简易网络浏览器(一)
查看>>
Qt开发——简易成绩登记系统
查看>>
Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句
查看>>
Postgresql中PL/pgSQL的游标、自定义函数、存储过程的使用
查看>>
Postgresql中的表结构和数据同步/数据传输到Mysql
查看>>
Postgresql中自增主键序列的使用以及数据传输时提示:错误:关系“xxx_xx_xx_seq“不存在
查看>>
postgreSQL入门命令
查看>>
PostgreSQL删除数据库报"ERROR: There is 1 other session using the database."
查看>>
Qt开发——爱情公寓人事管理系统
查看>>