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

你可能感兴趣的文章
Python 实现定时任务的八种方案!
查看>>
Python 实现自动化测试 dubbo 协议接口
查看>>
python 对json数据读取及保存与读取,对dump,dumps,load,loads的理解
查看>>
Python 对mysql数据库的操作
查看>>
Python 对象数据库列表
查看>>
Python 导入requests报错No module named requests
查看>>
python 将函数加到列表中进行调用
查看>>
python 将图片与字符串相互转换
查看>>
Python 嵌套字典全面指南
查看>>
Python 常见的错误类型和继承关系
查看>>
python 常量_零基础学Python系列之一:Python的变量与常量
查看>>
Python 并发编程
查看>>
python 序列化操作
查看>>
Python 开发者,这 7 个 VS Code 插件极力推荐
查看>>
python手把手视频_硬货 | 手把手带你构建视频分类模型(附Python演练))
查看>>
python 录音左右声道_Python分离立体声wav压缩文件的左右声道
查看>>
Python 循环异或对文件进行加解密
查看>>
Python开发环境搭建(附VMware安装包及虚拟机环境)
查看>>
python 微信扫码登录_python实现微信第三方网站扫码登录(Django)
查看>>
Python 快速下载依赖
查看>>