(四)c#Winform自定义控件-选择按钮组
官网
前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
欢迎前来交流探讨: 企鹅群568015492 
目录
https://www.cnblogs.com/bfyx/p/11364884.html
准备工作
该控件是由多个按钮组合形成的,类似多选框和单选框,需要用到前面我们说到的控件UCBtnExt ,如果你对UCBtnExt 还不了解,请移步
我们先理一下思路,我们需要显示多个按钮,支持多选和单选,具有选中效果
开始
我们先看下有哪些属性
/// <summary>
/// 选中改变事件
/// </summary>
public event EventHandler SelectedItemChanged;
private Dictionary<string, string> m_dataSource = new Dictionary<string, string>();
/// <summary>
/// 数据源
/// </summary>
public Dictionary<string, string> DataSource
{
get { return m_dataSource; }
set
{
m_dataSource = value;
Reload();
}
} private List<string> m_selectItem = new List<string>();
/// <summary>
/// 选中项
/// </summary>
public List<string> SelectItem
{
get { return m_selectItem; }
set
{
m_selectItem = value;
if (m_selectItem == null)
m_selectItem = new List<string>();
SetSelected();
}
} private bool m_isMultiple = false;
/// <summary>
/// 是否多选
/// </summary>
public bool IsMultiple
{
get { return m_isMultiple; }
set { m_isMultiple = value; }
}
当数据源改变的时候,需要加载按钮到面板上
private void Reload()
{
try
{
ControlHelper.FreezeControl(flowLayoutPanel1, true);
this.flowLayoutPanel1.Controls.Clear();
if (DataSource != null)
{
foreach (var item in DataSource)
{
UCBtnExt btn = new UCBtnExt();
btn.BackColor = System.Drawing.Color.Transparent;
btn.BtnBackColor = System.Drawing.Color.White;
btn.BtnFont = new System.Drawing.Font("微软雅黑", 10F);
btn.BtnForeColor = System.Drawing.Color.Gray;
btn.BtnText = item.Value;
btn.ConerRadius = ;
btn.Cursor = System.Windows.Forms.Cursors.Hand;
btn.FillColor = System.Drawing.Color.White;
btn.Font = new System.Drawing.Font("微软雅黑", 15F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
btn.IsRadius = true;
btn.IsShowRect = true;
btn.IsShowTips = false;
btn.Location = new System.Drawing.Point(, );
btn.Margin = new System.Windows.Forms.Padding();
btn.Name = item.Key;
btn.RectColor = System.Drawing.Color.FromArgb(, , );
btn.RectWidth = ;
btn.Size = new System.Drawing.Size(, );
btn.TabStop = false;
btn.BtnClick += btn_BtnClick;
this.flowLayoutPanel1.Controls.Add(btn);
}
}
}
finally
{
ControlHelper.FreezeControl(flowLayoutPanel1, false);
}
SetSelected();
} void btn_BtnClick(object sender, EventArgs e)
{
var btn = sender as UCBtnExt;
if (m_selectItem.Contains(btn.Name))
{
btn.RectColor = System.Drawing.Color.FromArgb(, , );
m_selectItem.Remove(btn.Name);
}
else
{
if (!m_isMultiple)
{
foreach (var item in m_selectItem)
{
var lst = this.flowLayoutPanel1.Controls.Find(item, false);
if (lst.Length == )
{
var _btn = lst[] as UCBtnExt;
_btn.RectColor = System.Drawing.Color.FromArgb(, , );
}
}
m_selectItem.Clear();
}
btn.RectColor = System.Drawing.Color.FromArgb(, , );
m_selectItem.Add(btn.Name);
}
if (SelectedItemChanged != null)
SelectedItemChanged(this, e);
}
如果设置了初始选中项,那么还需要在加载后选中
private void SetSelected()
{
if (m_selectItem != null && m_selectItem.Count > && DataSource != null && DataSource.Count > )
{
try
{
ControlHelper.FreezeControl(flowLayoutPanel1, true);
if (m_isMultiple)
{
foreach (var item in m_selectItem)
{
var lst = this.flowLayoutPanel1.Controls.Find(item, false);
if (lst.Length == )
{
var btn = lst[] as UCBtnExt;
btn.RectColor = System.Drawing.Color.FromArgb(, , );
}
}
}
else
{
UCBtnExt btn = null;
foreach (var item in m_selectItem)
{
var lst = this.flowLayoutPanel1.Controls.Find(item, false);
if (lst.Length == )
{
btn = lst[] as UCBtnExt;
break;
}
}
if (btn != null)
{
m_selectItem = new List<string>() { btn.Name };
btn.RectColor = System.Drawing.Color.FromArgb(, , );
}
}
}
finally
{
ControlHelper.FreezeControl(flowLayoutPanel1, false);
}
}
}
至此所有的逻辑已经处理完成,下面看下完整的代码吧
// 版权所有 黄正辉 交流群:568015492 QQ:623128629
// 文件名称:UCBtnsGroup.cs
// 创建日期:2019-08-15 15:58:13
// 功能描述:按钮组
// 项目地址:https://gitee.com/kwwwvagaa/net_winform_custom_control
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
{
public partial class UCBtnsGroup : UserControl
{
/// <summary>
/// 选中改变事件
/// </summary>
public event EventHandler SelectedItemChanged;
private Dictionary<string, string> m_dataSource = new Dictionary<string, string>();
/// <summary>
/// 数据源
/// </summary>
public Dictionary<string, string> DataSource
{
get { return m_dataSource; }
set
{
m_dataSource = value;
Reload();
}
} private List<string> m_selectItem = new List<string>();
/// <summary>
/// 选中项
/// </summary>
public List<string> SelectItem
{
get { return m_selectItem; }
set
{
m_selectItem = value;
if (m_selectItem == null)
m_selectItem = new List<string>();
SetSelected();
}
} private bool m_isMultiple = false;
/// <summary>
/// 是否多选
/// </summary>
public bool IsMultiple
{
get { return m_isMultiple; }
set { m_isMultiple = value; }
}
public UCBtnsGroup()
{
InitializeComponent();
} private void Reload()
{
try
{
ControlHelper.FreezeControl(flowLayoutPanel1, true);
this.flowLayoutPanel1.Controls.Clear();
if (DataSource != null)
{
foreach (var item in DataSource)
{
UCBtnExt btn = new UCBtnExt();
btn.BackColor = System.Drawing.Color.Transparent;
btn.BtnBackColor = System.Drawing.Color.White;
btn.BtnFont = new System.Drawing.Font("微软雅黑", 10F);
btn.BtnForeColor = System.Drawing.Color.Gray;
btn.BtnText = item.Value;
btn.ConerRadius = ;
btn.Cursor = System.Windows.Forms.Cursors.Hand;
btn.FillColor = System.Drawing.Color.White;
btn.Font = new System.Drawing.Font("微软雅黑", 15F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
btn.IsRadius = true;
btn.IsShowRect = true;
btn.IsShowTips = false;
btn.Location = new System.Drawing.Point(, );
btn.Margin = new System.Windows.Forms.Padding();
btn.Name = item.Key;
btn.RectColor = System.Drawing.Color.FromArgb(, , );
btn.RectWidth = ;
btn.Size = new System.Drawing.Size(, );
btn.TabStop = false;
btn.BtnClick += btn_BtnClick;
this.flowLayoutPanel1.Controls.Add(btn);
}
}
}
finally
{
ControlHelper.FreezeControl(flowLayoutPanel1, false);
}
SetSelected();
} void btn_BtnClick(object sender, EventArgs e)
{
var btn = sender as UCBtnExt;
if (m_selectItem.Contains(btn.Name))
{
btn.RectColor = System.Drawing.Color.FromArgb(, , );
m_selectItem.Remove(btn.Name);
}
else
{
if (!m_isMultiple)
{
foreach (var item in m_selectItem)
{
var lst = this.flowLayoutPanel1.Controls.Find(item, false);
if (lst.Length == )
{
var _btn = lst[] as UCBtnExt;
_btn.RectColor = System.Drawing.Color.FromArgb(, , );
}
}
m_selectItem.Clear();
}
btn.RectColor = System.Drawing.Color.FromArgb(, , );
m_selectItem.Add(btn.Name);
}
if (SelectedItemChanged != null)
SelectedItemChanged(this, e);
} private void SetSelected()
{
if (m_selectItem != null && m_selectItem.Count > && DataSource != null && DataSource.Count > )
{
try
{
ControlHelper.FreezeControl(flowLayoutPanel1, true);
if (m_isMultiple)
{
foreach (var item in m_selectItem)
{
var lst = this.flowLayoutPanel1.Controls.Find(item, false);
if (lst.Length == )
{
var btn = lst[] as UCBtnExt;
btn.RectColor = System.Drawing.Color.FromArgb(, , );
}
}
}
else
{
UCBtnExt btn = null;
foreach (var item in m_selectItem)
{
var lst = this.flowLayoutPanel1.Controls.Find(item, false);
if (lst.Length == )
{
btn = lst[] as UCBtnExt;
break;
}
}
if (btn != null)
{
m_selectItem = new List<string>() { btn.Name };
btn.RectColor = System.Drawing.Color.FromArgb(, , );
}
}
}
finally
{
ControlHelper.FreezeControl(flowLayoutPanel1, false);
}
}
}
}
}
namespace HZH_Controls.Controls
{
partial class UCBtnsGroup
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null; /// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
} #region 组件设计器生成的代码 /// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.SuspendLayout();
//
// flowLayoutPanel1
//
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel1.Location = new System.Drawing.Point(, );
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(, );
this.flowLayoutPanel1.TabIndex = ;
//
// UCBtnsGroup
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.flowLayoutPanel1);
this.MinimumSize = new System.Drawing.Size(, );
this.Name = "UCBtnsGroup";
this.Size = new System.Drawing.Size(, );
this.ResumeLayout(false); } #endregion private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
}
}
用处及效果
用处:可以用选择按钮组来替换单选框和复选框,具有更和谐的界面效果
效果:

最后的话
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧
(四)c#Winform自定义控件-选择按钮组的更多相关文章
- c#Winform自定义控件-目录
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- winform 自定义控件(高手)
高手推荐:https://www.cnblogs.com/bfyx/p/11364884.html c#Winform自定义控件-目录 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件 ...
- (三十一)c#Winform自定义控件-文本框(四)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (四十二)c#Winform自定义控件-进度条扩展
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- (四十九)c#Winform自定义控件-下拉框(表格)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- (四十六)c#Winform自定义控件-水波进度条-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- (二十四)c#Winform自定义控件-单标题窗体
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (四十一)c#Winform自定义控件-进度条
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (四十五)c#Winform自定义控件-水波图表
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
随机推荐
- dockerfile 制作镜像
# Set the base image to UbuntuFROM ubuntu # File Author chenghanMAINTAINER chenghan ################ ...
- [原创]lvs+ospf+nginx实现高可用大流量web架构
lvs+ospf+nginx实现高可用大流量web架构配置总概述 架构图: 配置如下: .quagga之zebra配置: # cat /etc/quagga/zebra.conf ! ! Zebra ...
- nginx连接资源管理
本文介绍在nginx中连接资源(即ngx_connection_t)的管理与使用. 连接池的初始化 在ngx_cycle_t结构体中维护了几个和连接相关的数据,具体如下 struct ngx_cycl ...
- 个人永久性免费-Excel催化剂功能第37波-把Sqlserver的强大分析函数拿到Excel中用
本人一直钟情于使用Sqlserver数据库的一大原因是其提供了非常好用.高效的数据分析函数(窗口函数),可以在做数据清洗和数据分析场合等多个场景使用.只需简单的一个函数即可做出常规SQL语句很难以实现 ...
- Excel催化剂开源第30波-在Excel上尽情地使用LINQ
对于笔者这样的数据分析工作者来说,对数据库有较深的掌握,当然少不了对SQL查询的深度使用,如果在编程的世界中,可以复用这样的能力,真的是一件多么令人高兴的事情. 在.Net的世界中,恰恰提供了这样的能 ...
- 2019牛客多校第二场H-Second Large Rectangle
Second Large Rectangle 题目传送门 解题思路 先求出每个点上的高,再利用单调栈分别求出每个点左右两边第一个高小于自己的位置,从而而得出最后一个大于等于自己的位置,进而求出自己的位 ...
- 说说Java线程间通信
序言 正文 [一] Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在 ...
- bean的创建(五)第三部分 bean工厂方法参数的解析
准备好一系列参数之后,开始参数类型的转换,方法参数的对应. ConstructorResolver.createArgumentArray private ArgumentsHolder create ...
- PHP Composer安装使用
1.安装composer curl -sS https:\\getcomposer.org/install | php 如果出现这样的提示,打开php.ini检查是否开启openssl扩展 2.下载成 ...
- Linux常用命令3
useradd 添加用户账号 -n 制定uid标记号 -d 指定宿主目录,缺省默认为/home/用户名 -e 制定账号失效时间 -M 不为用户建立初始化宿主目录(通常作为不登陆账号) -s 指定用户的 ...