首页 文章详情

(四)C# Winform自定义控件-选择按钮组

| 627 2020-07-28 17:24 0 0 0
UniSMS (合一短信)

(四)C# Winform自定义控件-选择按钮组

准备工作

该控件是由多个按钮组合形成的,类似多选框和单选框,需要用到前面我们说到的控件UCBtnExt ,如果你对UCBtnExt 还不了解,请移步

请移步 (二)c#Winform自定义控件-按钮 查看

我们先理一下思路,我们需要显示多个按钮,支持多选和单选,具有选中效果

开始

我们先看下有哪些属性

/// 
/// 选中改变事件
/// 

public event EventHandler SelectedItemChanged;
private Dictionary<stringstring> m_dataSource = new Dictionary<stringstring>();
/// 
/// 数据源
/// 

public Dictionary<stringstring> DataSource
{
    get { return m_dataSource; }
    set
    {
        m_dataSource = value;
        Reload();
    }
}

private List<string> m_selectItem = new List<string>();
/// 
/// 选中项
/// 

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;
/// 
/// 是否多选
/// 

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 = 5;
                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(55);
                btn.Margin = new System.Windows.Forms.Padding(5);
                btn.Name = item.Key;
                btn.RectColor = System.Drawing.Color.FromArgb(224224224);
                btn.RectWidth = 1;
                btn.Size = new System.Drawing.Size(7238);
                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(224224224);
        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 == 1)
                {
                    var _btn = lst[0as UCBtnExt;
                    _btn.RectColor = System.Drawing.Color.FromArgb(224224224);
                }
            }
            m_selectItem.Clear();
        }
        btn.RectColor = System.Drawing.Color.FromArgb(2557759);
        m_selectItem.Add(btn.Name);
    }
    if (SelectedItemChanged != null)
        SelectedItemChanged(this, e);
}

如果设置了初始选中项,那么还需要在加载后选中

private void SetSelected()
{
    if (m_selectItem != null && m_selectItem.Count > 0 && DataSource != null && DataSource.Count > 0)
    {
        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 == 1)
                    {
                        var btn = lst[0as UCBtnExt;
                        btn.RectColor = System.Drawing.Color.FromArgb(2557759);
                    }
                }
            }
            else
            {
                UCBtnExt btn = null;
                foreach (var item in m_selectItem)
                {
                    var lst = this.flowLayoutPanel1.Controls.Find(item, false);
                    if (lst.Length == 1)
                    {
                        btn = lst[0as UCBtnExt;
                        break;
                    }
                }
                if (btn != null)
                {
                    m_selectItem = new List<string>() { btn.Name };
                    btn.RectColor = System.Drawing.Color.FromArgb(2557759);
                }
            }
        }
        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
    {
        /// 
        /// 选中改变事件
        /// 

        public event EventHandler SelectedItemChanged;
        private Dictionary<stringstring> m_dataSource = new Dictionary<stringstring>();
        /// 
        /// 数据源
        /// 

        public Dictionary<stringstring> DataSource
        {
            get { return m_dataSource; }
            set
            {
                m_dataSource = value;
                Reload();
            }
        }

        private List<string> m_selectItem = new List<string>();
        /// 
        /// 选中项
        /// 

        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;
        /// 
        /// 是否多选
        /// 

        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 = 5;
                        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(55);
                        btn.Margin = new System.Windows.Forms.Padding(5);
                        btn.Name = item.Key;
                        btn.RectColor = System.Drawing.Color.FromArgb(224224224);
                        btn.RectWidth = 1;
                        btn.Size = new System.Drawing.Size(7238);
                        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(224224224);
                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 == 1)
                        {
                            var _btn = lst[0as UCBtnExt;
                            _btn.RectColor = System.Drawing.Color.FromArgb(224224224);
                        }
                    }
                    m_selectItem.Clear();
                }
                btn.RectColor = System.Drawing.Color.FromArgb(2557759);
                m_selectItem.Add(btn.Name);
            }
            if (SelectedItemChanged != null)
                SelectedItemChanged(this, e);
        }

        private void SetSelected()
        {
            if (m_selectItem != null && m_selectItem.Count > 0 && DataSource != null && DataSource.Count > 0)
            {
                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 == 1)
                            {
                                var btn = lst[0as UCBtnExt;
                                btn.RectColor = System.Drawing.Color.FromArgb(2557759);
                            }
                        }
                    }
                    else
                    {
                        UCBtnExt btn = null;
                        foreach (var item in m_selectItem)
                        {
                            var lst = this.flowLayoutPanel1.Controls.Find(item, false);
                            if (lst.Length == 1)
                            {
                                btn = lst[0as UCBtnExt;
                                break;
                            }
                        }
                        if (btn != null)
                        {
                            m_selectItem = new List<string>() { btn.Name };
                            btn.RectColor = System.Drawing.Color.FromArgb(2557759);
                        }
                    }
                }
                finally
                {
                    ControlHelper.FreezeControl(flowLayoutPanel1, false);
                }
            }
        }
    }
}
namespace HZH_Controls.Controls
{
    partial class UCBtnsGroup
    {
        ///  
        /// 必需的设计器变量。
        /// 

        private System.ComponentModel.IContainer components = null;

        ///  
        /// 清理所有正在使用的资源。
        /// 

        /// 如果应释放托管资源,为 true;否则为 false。
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region 组件设计器生成的代码

        ///  
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// 

        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(00);
            this.flowLayoutPanel1.Name = "flowLayoutPanel1";
            this.flowLayoutPanel1.Size = new System.Drawing.Size(42050);
            this.flowLayoutPanel1.TabIndex = 0;
            // 
            // 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(050);
            this.Name = "UCBtnsGroup";
            this.Size = new System.Drawing.Size(42050);
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
    }
}

用处及效果

用处: 可以用选择按钮组来替换单选框和复选框,具有更和谐的界面效果

效果:

最后的话

如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧,另本站转载地址:https://dotnet9.com/5270.html。

  • 作者:冰封一夏
  • 出处:http://www.hzhcontrols.com/doc.html
  • 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • GitHub:https://github.com/kwwwvagaa/NetWinformControl
  • 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

Dotnet9网站常驻编辑


长按关注我,

欢迎技术交流!

-好东西要转发,设为"星标"★抢先看-

点击阅读原文,查看HZHControls站点更多博文。

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter