(六)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
准备工作
准备4个图片,分别对应选中,没选中,选中禁用,没选中禁用

复选框需要支持分组,当同一面板上具有多种选择的时候,分组就显得更为重要了
开始
添加一个用户控件,命名为:UCRadioButton
看一下有哪些属性
[Description("选中改变事件"), Category("自定义")]
public event EventHandler CheckedChangeEvent;
private Font _Font = new Font("微软雅黑", );
[Description("字体"), Category("自定义")]
public new Font Font
{
get { return _Font; }
set
{
_Font = value;
label1.Font = value;
}
}
private Color _ForeColor = Color.FromArgb(, , );
[Description("字体颜色"), Category("自定义")]
public new Color ForeColor
{
get { return _ForeColor; }
set
{
label1.ForeColor = value;
_ForeColor = value;
}
}
private string _Text = "单选按钮";
[Description("文本"), Category("自定义")]
public string TextValue
{
get { return _Text; }
set
{
label1.Text = value;
_Text = value;
}
}
private bool _checked = false;
[Description("是否选中"), Category("自定义")]
public bool Checked
{
get
{
return _checked;
}
set
{
if (_checked != value)
{
_checked = value;
if (base.Enabled)
{
if (_checked)
{
panel1.BackgroundImage = Properties.Resources.radioButton1;
}
else
{
panel1.BackgroundImage = Properties.Resources.radioButton0;
}
}
else
{
if (_checked)
{
panel1.BackgroundImage = Properties.Resources.radioButton10;
}
else
{
panel1.BackgroundImage = Properties.Resources.radioButton00;
}
}
SetCheck(value);
if (CheckedChangeEvent != null)
{
CheckedChangeEvent(this, null);
}
}
}
}
private string _groupName;
[Description("分组名称"), Category("自定义")]
public string GroupName
{
get { return _groupName; }
set { _groupName = value; }
}
public new bool Enabled
{
get
{
return base.Enabled;
}
set
{
base.Enabled = value;
if (value)
{
if (_checked)
{
panel1.BackgroundImage = Properties.Resources.radioButton1;
}
else
{
panel1.BackgroundImage = Properties.Resources.radioButton0;
}
}
else
{
if (_checked)
{
panel1.BackgroundImage = Properties.Resources.radioButton10;
}
else
{
panel1.BackgroundImage = Properties.Resources.radioButton00;
}
}
}
}
当选中状态改变时需要根据分组名称来做相应的处理
private void SetCheck(bool bln)
{
if (!bln)
return;
if (this.Parent != null)
{
foreach (Control c in this.Parent.Controls)
{
if (c is UCRadioButton && c != this)
{
UCRadioButton uc = (UCRadioButton)c;
if (_groupName == uc.GroupName && uc.Checked)
{
uc.Checked = false;
return;
}
}
}
}
}
当点击时改变选中状态
private void Radio_MouseDown(object sender, MouseEventArgs e)
{
this.Checked = true;
}
加载时做一下处理,防止多选了
private void UCRadioButton_Load(object sender, EventArgs e)
{
if (this.Parent != null && this._checked)
{
foreach (Control c in this.Parent.Controls)
{
if (c is UCRadioButton && c != this)
{
UCRadioButton uc = (UCRadioButton)c;
if (_groupName == uc.GroupName && uc.Checked)
{
Checked = false;
return;
}
}
}
}
}
来看下完整的代码吧
// 版权所有 黄正辉 交流群:568015492 QQ:623128629
// 文件名称:UCRadioButton.cs
// 创建日期:2019-08-15 16:03:13
// 功能描述:RadioButton
// 项目地址: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
{
[DefaultEvent("CheckedChangeEvent")]
public partial class UCRadioButton : UserControl
{
[Description("选中改变事件"), Category("自定义")]
public event EventHandler CheckedChangeEvent; private Font _Font = new Font("微软雅黑", );
[Description("字体"), Category("自定义")]
public new Font Font
{
get { return _Font; }
set
{
_Font = value;
label1.Font = value;
}
} private Color _ForeColor = Color.FromArgb(, , );
[Description("字体颜色"), Category("自定义")]
public new Color ForeColor
{
get { return _ForeColor; }
set
{
label1.ForeColor = value;
_ForeColor = value;
}
}
private string _Text = "单选按钮";
[Description("文本"), Category("自定义")]
public string TextValue
{
get { return _Text; }
set
{
label1.Text = value;
_Text = value;
}
}
private bool _checked = false;
[Description("是否选中"), Category("自定义")]
public bool Checked
{
get
{
return _checked;
}
set
{
if (_checked != value)
{
_checked = value;
if (base.Enabled)
{
if (_checked)
{
panel1.BackgroundImage = Properties.Resources.radioButton1;
}
else
{
panel1.BackgroundImage = Properties.Resources.radioButton0;
}
}
else
{
if (_checked)
{
panel1.BackgroundImage = Properties.Resources.radioButton10;
}
else
{
panel1.BackgroundImage = Properties.Resources.radioButton00;
}
}
SetCheck(value); if (CheckedChangeEvent != null)
{
CheckedChangeEvent(this, null);
}
}
}
} private string _groupName; [Description("分组名称"), Category("自定义")]
public string GroupName
{
get { return _groupName; }
set { _groupName = value; }
} public new bool Enabled
{
get
{
return base.Enabled;
}
set
{
base.Enabled = value;
if (value)
{
if (_checked)
{
panel1.BackgroundImage = Properties.Resources.radioButton1;
}
else
{
panel1.BackgroundImage = Properties.Resources.radioButton0;
}
}
else
{
if (_checked)
{
panel1.BackgroundImage = Properties.Resources.radioButton10;
}
else
{
panel1.BackgroundImage = Properties.Resources.radioButton00;
}
}
}
}
public UCRadioButton()
{
InitializeComponent();
} private void SetCheck(bool bln)
{
if (!bln)
return;
if (this.Parent != null)
{
foreach (Control c in this.Parent.Controls)
{
if (c is UCRadioButton && c != this)
{
UCRadioButton uc = (UCRadioButton)c;
if (_groupName == uc.GroupName && uc.Checked)
{
uc.Checked = false;
return;
}
}
}
}
} private void Radio_MouseDown(object sender, MouseEventArgs e)
{
this.Checked = true;
} private void UCRadioButton_Load(object sender, EventArgs e)
{
if (this.Parent != null && this._checked)
{
foreach (Control c in this.Parent.Controls)
{
if (c is UCRadioButton && c != this)
{
UCRadioButton uc = (UCRadioButton)c;
if (_groupName == uc.GroupName && uc.Checked)
{
Checked = false;
return;
}
}
}
}
}
}
}
namespace HZH_Controls.Controls
{
partial class UCRadioButton
{
/// <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.label1 = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.SuspendLayout();
//
// label1
//
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
this.label1.Font = new System.Drawing.Font("微软雅黑", 12F);
this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)()))), ((int)(((byte)()))), ((int)(((byte)()))));
this.label1.Location = new System.Drawing.Point(, );
this.label1.Name = "label1";
this.label1.Padding = new System.Windows.Forms.Padding(, , , );
this.label1.Size = new System.Drawing.Size(, );
this.label1.TabIndex = ;
this.label1.Text = "单选按钮";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Radio_MouseDown);
//
// panel1
//
this.panel1.BackgroundImage = global::HZH_Controls.Properties.Resources.radioButton0;
this.panel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.panel1.Dock = System.Windows.Forms.DockStyle.Left;
this.panel1.Location = new System.Drawing.Point(, );
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(, );
this.panel1.TabIndex = ;
this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Radio_MouseDown);
//
// UCRadioButton
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.Controls.Add(this.label1);
this.Controls.Add(this.panel1);
this.Name = "UCRadioButton";
this.Size = new System.Drawing.Size(, );
this.Load += new System.EventHandler(this.UCRadioButton_Load);
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Radio_MouseDown);
this.ResumeLayout(false); } #endregion private System.Windows.Forms.Label label1;
private System.Windows.Forms.Panel panel1;
}
}
用处及效果
用处:就是单选框
效果:

最后的话
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧
(六)c#Winform自定义控件-单选框的更多相关文章
- (十六)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年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (八十二)c#Winform自定义控件-穿梭框
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- (二十八)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年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- winform 自定义控件(高手)
高手推荐:https://www.cnblogs.com/bfyx/p/11364884.html c#Winform自定义控件-目录 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件 ...
随机推荐
- Node.js热部署代码,实现修改代码后自动重启服务方便实时调试
写PHP等脚本语言的时候,已经习惯了修改完代码直接打开浏览器去查看最新的效果.而Node.js 只有在第一次引用时才会去解析脚本文件,以后都会直接访问内存,避免重复载入,这种设计虽然有利于提高性能,却 ...
- 理解vue-loader
事情的起源是被人问到,一个以.vue结尾的文件,是如何被编译然后运行在浏览器中的?突然发现,对这一块模糊的很,而且看mpvue的文档,甚至小程序之类的都是实现了自己的loader,所以十分必要抽时间去 ...
- 【bfs基础】①
bfs,即广度优先搜索,主要通过队列(queue)进行操作. 稍微解释一下,队列是一种基础数据结构,其形态类似于一支长长的队伍,大概如下: 在C++中,队列的头文件定义为:#include<qu ...
- VS2010 winform开发笔记---combox的SelectedIndexChanged事件及级联问题
DisplayMember绑定需要显示的数据表字段, 而ValueMember绑定需要获取选择的项的值. 然后通过 combo.SelectedValue就可以取得选中项的值了. DisplayMem ...
- SGU495 Kids andPrices[期望DP]
也许更好的阅读体验 \(\mathcal{Description}\) 有\(n\)个格子,每次等概率随机给一个格子染色,问涂\(m\)次后期望有多少格子被染色了 \(\mathcal{Solutio ...
- 【MySQL】(三)文件
本篇文章分析构成MySQL数据库和InnoDB存储引擎表的各种累类型文件.这些文件有以下这些. 参数文件:告诉MySQL实例启动时在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内 ...
- 【Java中级】(一)面向对象的特性与八种基本类型
1.1.Java 基本数据类型: Java提供了8种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. byte.short.int.long.float.double. ...
- Tomcat(Windows)
百度云:链接:http://pan.baidu.com/s/1pKYrf79 密码:56t0 官网下载网址:http://archive.apache.org/dist/tomcat/tomca ...
- docker环境下使用gitlab,gitlab-runner 为 NetCore 持续集成
环境 Centos7.6 安装应用docker,docker-compose (我的Centos是用Hyper-V跑的分了8G的内存,阿里云2G根本跑不起来gitlab) 为了保证我的Centos环境 ...
- 让Controller支持对平铺参数执行@Valid数据校验
每篇一句 在金字塔塔尖的是实践,学而不思则罔,思而不学则殆(现在很多编程框架都只是教你碎片化的实践) 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JS ...