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

你可能感兴趣的文章
ntko web firefox跨浏览器插件_深度比较:2019年6个最好的跨浏览器测试工具
查看>>
ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
查看>>
ntp server 用法小结
查看>>
ntpdate 通过外网同步时间
查看>>
ntpdate同步配置文件调整详解
查看>>
NTPD使用/etc/ntp.conf配置时钟同步详解
查看>>
NTP及Chrony时间同步服务设置
查看>>
NTP服务器
查看>>
NTP配置
查看>>
NUC1077 Humble Numbers【数学计算+打表】
查看>>
NuGet Gallery 开源项目快速入门指南
查看>>
NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
查看>>
nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
查看>>
Nuget~管理自己的包包
查看>>
NuGet学习笔记001---了解使用NuGet给net快速获取引用
查看>>
nullnullHuge Pages
查看>>
NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
查看>>
null可以转换成任意非基本类型(int/short/long/float/boolean/byte/double/char以外)
查看>>
Number Sequence(kmp算法)
查看>>
Numix Core 开源项目教程
查看>>