WinForm+C#小案例--->实现年月日三级平铺形式展示

C#WinForm案例(持续更新) 全选,反选,.两个ListBox中的内容左右相互移动,下拉框简易二级联动,简易2048,番茄钟,视频播放器 阅读详情

需求如下:

1.要求使用FlowLayoutPanel控件,存放年月日信息

效果预览:

方法一:

创建 Winform 项目并设计界面

编写代码实现切换逻辑
using System;
using System.Drawing;
using System.Windows.Forms;

namespace 第三题
{
    public partial class Form1 : Form
    {
        // 存储用户选中的年份
        private int selectedYear;
        // 存储用户选中的月份
        private int selectedMonth;
        // 存储用户选中的天数
        private int selectedDay;

        public Form1()
        {
            InitializeComponent();
        }

        //窗体加载事件
        private void Form1_Load(object sender, EventArgs e)
        {
            // 初始化年份(2004-2034)
            for (int year = 2004; year <= 2034; year++)
            {
                // 动态创建一个年份按钮
                Button yearBtn = new Button
                {
                    Text = year.ToString(),// 按钮显示文本:年份数字
                    Tag = year // 用Tag存储数值
                };
                // 给按钮绑定点击事件
                yearBtn.Click += YearBtn_Click;
                // 将按钮添加到年份面板
                flpYear.Controls.Add(yearBtn);
            }

            // 初始化月份(1-12)
            for (int month = 1; month <= 12; month++)
            {
                Button monthBtn = new Button
                {
                    Text = month.ToString(), // 按钮显示文本:月份数字
                    Tag = month // 存储int类型的月份值
                };
                // 绑定点击事件
                monthBtn.Click += MonthBtn_Click;
                // 添加到月份面板
                flpMonth.Controls.Add(monthBtn);
            }

            // 给年份面板设置默认值2025
            SelectDefaultControl(flpYear, 2025);
            // 给月份面板设置默认值12
            SelectDefaultControl(flpMonth, 12);
        }

        //年份按钮点击事件
        private void YearBtn_Click(object sender, EventArgs e)
        {
            // 将触发事件的控件转换为Button类型(因为sender是通用Control类型)
            Button btn = sender as Button;
            // 从按钮的Tag属性中获取选中的年份值
            selectedYear = (int)btn.Tag;
            // 重置年份面板所有按钮的样式(恢复默认颜色)
            ResetControlStyle(flpYear);
            // 将当前选中的按钮设置为紫色
            btn.BackColor = Color.Purple;
            // 若月份已选,更新天数
            if (selectedMonth > 0)
            {
                // 调用生成天数的方法,传入当前选中的年和月
                GenerateDays(selectedYear, selectedMonth);
            }
        }

        //月份按钮点击事件
        private void MonthBtn_Click(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            selectedMonth = (int)btn.Tag;
            // 更新选中样式
            ResetControlStyle(flpMonth);
            btn.BackColor = Color.Purple;
            // 若年份已选,更新天数
            if (selectedYear > 0)
            {
                GenerateDays(selectedYear, selectedMonth);
            }
        }
        /// <summary>
        /// 根据选中的年和月,动态生成对应月份的天数按钮
        /// </summary>
        /// <param name="year">选中的年份(用于计算闰年)</param>
        /// <param name="month">选中的月份(用于判断大月/小月/2月)</param>
        private void GenerateDays(int year, int month)
        {
            flpDay.Controls.Clear(); // 清空原有天数
            // 调用工具方法,获取当前年月的总天数
            int dayCount = GetDayCount(year, month);

            // 创建天数按钮
            for (int day = 1; day <= dayCount; day++)
            {
                Button dayBtn = new Button
                {
                    Text = day.ToString(),
                    Tag = day
                };
                dayBtn.Click += DayBtn_Click;
                flpDay.Controls.Add(dayBtn);
            }
        }

        /// <summary>
        /// 重置指定FlowLayoutPanel中所有按钮的样式(恢复默认颜色)
        /// 作用:确保同一面板中仅一个按钮高亮,实现"单选"
        /// </summary>
        /// <param name="flowPanel">需要重置样式的面板(年/月/日面板)</param>
        private void ResetControlStyle(FlowLayoutPanel flowPanel)
        {
            // 遍历面板中所有的控件
            foreach (Control c in flowPanel.Controls)
            {
                //判断当前是否为按钮
                if (c is Button)
                {
                    // 恢复按钮默认颜色
                    c.BackColor = SystemColors.Control;
                }
            }
        }

        //天数按钮
        private void DayBtn_Click(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            selectedDay = (int)btn.Tag;
            ResetControlStyle(flpDay);
            btn.BackColor = Color.White;
            string dateStr = $"{selectedYear}年{selectedMonth}月{selectedDay}日";
            MessageBox.Show(dateStr, "选中日期", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        /// <summary>
        /// 根据公历规则,计算指定年、月的总天数
        /// 核心:处理大月/小月/2月闰年逻辑
        /// </summary>
        /// <param name="year">年份(用于判断2月是否为闰年)</param>
        /// <param name="month">月份(1-12)</param>
        /// <returns>当月总天数(31/30/29/28)</returns>
        private int GetDayCount(int year, int month)
        {
            switch (month)
            {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    return 31;
                case 4:
                case 6:
                case 9:
                case 11:
                    return 30;
                case 2:
                    // 闰年判断:能被4整除但不被100整除,或被400整除
                    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ? 29 : 28;
                default:
                    return 0;
            }
        }

        /// <summary>
        /// 在指定面板中,找到Tag值等于目标值的按钮并设置为默认选中
        /// 核心:通过模拟点击实现样式设置+联动更新天数
        /// </summary>
        /// <param name="flowPanel">目标面板(年/月面板)</param>
        /// <param name="targetValue">目标值(如2025、12)</param>
        private void SelectDefaultControl(FlowLayoutPanel flowPanel, int targetValue)
        {
            // 遍历面板中所有的按钮
            foreach (Button btn in flowPanel.Controls)
            {
                // 比较按钮的Tag值与目标值(找到需要默认选中的按钮)
                if ((int)btn.Tag == targetValue)
                {
                    // 模拟按钮点击(触发对应的Click事件,如YearBtn_Click)
                    // 效果:既设置了选中样式,又自动调用GenerateDays生成天数
                    btn.PerformClick();
                    break; // 找到后退出循环,避免重复触发(面板中仅一个目标按钮)
                }
            }
        }
    }
}

效果演示

方法二:

编写代码实现切换逻辑
using System;
using System.Drawing;
using System.Windows.Forms;

namespace _03_年月日三级平铺展示
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // 记录上一次选中的年份按钮
        private Button oldYearButton;
        // 记录上一次选中的月份按钮
        private Button oldMonthButton;

        // 窗体加载事件
        private void Form1_Load(object sender, EventArgs e)
        {
            // 添加年份信息:2004~2034年
            for (int i = 2004; i <= 2034; i++)
            {
                //动态创建年份按钮
                Button button = new Button();
                // 按钮显示文本
                button.Text = i.ToString();
                // 需要给button绑定点击事件
                button.Click += Button_Click;
                // 取消按钮边框
                button.FlatAppearance.BorderSize = 0;
                // 设置为扁平样式
                button.FlatStyle = FlatStyle.Flat;
                // button按钮添加到容器中
                flowLayoutPanel1.Controls.Add(button);
            }
        }

        // 年份点击事件
        private void Button_Click(object sender, EventArgs e)
        {
            // 将触发事件的通用控件
            Button button = sender as Button;

            if (oldYearButton != null)
            {
                // 背景色还原为系统默认控件色
                oldYearButton.BackColor = SystemColors.Control;
                // 字体色还原为系统默认文本色
                oldYearButton.ForeColor = SystemColors.ControlText;
            }
            // 替换
            oldYearButton = button; // 用oldYearButton记录当前选中项
            oldYearButton.BackColor = Color.Purple;// 选中项背景色设为紫色
            oldYearButton.ForeColor = Color.White;// 选中项字体色设为白色

            // 清空月份和天数容器
            flowLayoutPanel2.Controls.Clear();
            flowLayoutPanel3.Controls.Clear();

            // 添加月份信息
            for (int i = 1; i <= 12; i++)
            {
                Button monthButton = new Button();
                monthButton.Text = i.ToString();
                monthButton.Click += MonthButton_Click;
                monthButton.FlatAppearance.BorderSize = 0;
                monthButton.FlatStyle = FlatStyle.Flat;
                // button按钮添加到容器中
                flowLayoutPanel2.Controls.Add(monthButton);
            }
        }
        //月份按钮点击事件
        private void MonthButton_Click(object sender, EventArgs e)
        {
            Button button = sender as Button;
            if (oldMonthButton != null)
            {
                // 背景色和字体颜色还原
                oldMonthButton.BackColor = SystemColors.Control;
                oldMonthButton.ForeColor = SystemColors.ControlText;
            }
            // 替换
            oldMonthButton = button;
            oldMonthButton.BackColor = Color.Purple;
            oldMonthButton.ForeColor = Color.White;

            // 往月份容器中添加月份信息
            flowLayoutPanel3.Controls.Clear();
            // 获取年月文本信息
            int year = int.Parse(oldYearButton.Text);
            int month = int.Parse(oldMonthButton.Text);
            // 根据年月直接获取对应月份的天数
            int days = DateTime.DaysInMonth(year, month);
            for (int i = 1; i <= days; i++)
            {
                Button dayButton = new Button();
                dayButton.Text = i.ToString(); // 显示天数数字
                dayButton.Click += DayButton_Click;// 绑定天数点击事件
                dayButton.FlatAppearance.BorderSize = 0;// 无边框扁平样式
                dayButton.FlatStyle = FlatStyle.Flat;
                // button按钮添加到容器中
                flowLayoutPanel3.Controls.Add(dayButton);
            }
        }
        //天数按钮点击事件
        private void DayButton_Click(object sender, EventArgs e)
        {
            Button button = sender as Button;
            MessageBox.Show(oldYearButton.Text + "年" + oldMonthButton.Text + "月" + button.Text + "日");
        }
    }
}
效果演示

希望对大家有所帮助。感谢大家的关注和点赞。

C# WinForm 实例 WinForm 是 Windows Form 的简称,是基于 .NET Framework 平台的客户端(PC软件)开发技术,一般使用 C# 编程。C# WinForm 编程需要创建「Windows窗体应用程序」项目。 .NET 提供了大量 Windows 风格的控件和事件,我们可以直接拿来使用,上手简单,开发快速。 Windows 窗体应用程序是 C# 语言中的一个重要应用,也是 C# 语言最常见的应用。这套 C# WinForm 教程将教会大家如何使用 WinForm 进行界面设计,并绑定对应的事件,开 阅读详情

相关推荐

【24】C# 窗体应用WinForm ——日历MonthCalendar属性、方法、实例应用

本文介绍了WinForm中的MonthCalendar日历控件及其使用方法。MonthCalendar是用于选择日期的控件,支持设置每周起始日、最大选择天数等属性,并能显示周数和当天日期。通过一个实例演示了如何实现入职日期选择功能:在窗体中添加MonthCalendar、Label、TextBox和Button控件,编写代码将选择的日期显示在文本框中,并通过按钮点击事件弹出提示信息。文章还提供了控件添加、属性设置和代码实现的详细步骤及运行效果图,适合.NET平台下的Windows应用程序开发。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 529

C#新手试着使用winform去做一个时间显示器(可计算)

(3)计算时间,我们已经拿到了两个值,一个是我们输入的时间,一个获得的时间,我们要将我们输入的时间加到我们获得的时间上,这里需要用到字符串切割,因为我们获得的时间是xxxx/xx/xx xx:xx:xx这样的格式,当我做到这里的时候我本来想用的是通过位数来控制我拿到对应位置的时间,(1)获取时间,我使用的是textBox.Text,我在上一个textBox里能够获得时间,然后我创建了一个betton,然后我写到。通过Split方法切割字符串,成功的获得了我们的所有位置的时间;if hour满24进一。

SZP78120812的博客 2828

C# WinForm项目实战:198个源码实例解析

本文还有配套的精品资源,点击获取 简介:这是一套包含198个C# Windows Forms实例源代码的资源集合,专为C#开发者提供学习和参考。Windows Forms作为.NET Framework的一部分,用于构建具有丰富用户界面和事件处理的Windows桌面应用程序。这些实例涵盖了从基本控件使用到复杂事件处理的各种场景,适合初学者和经验丰富的开发者深入研究和实践。通...

weixin_36184718的博客 4954

WinForm应用实战开发指南 —— 一些综合案例Demo

本文为大家介绍在WinForm开发框架中的一些综合案例Demo,希望能帮助到大家~

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 2415

C#初学小项目—WinForm图书管理系统6

图书管理页面功能实现

weixin_44427356的博客 916

c# winform实例大全(198个经典Csharp WinForm实例源码)

c# winform实例大全(198个经典Csharp WinForm实例源码),学习c#的朋友可以参考下。

198个经典C#WinForm实例源码

目录 1、窗体技巧 2、控件操作 3、图像操作 4、报表打印 5、系统操作 6、文件处理 7、网络操作 8、数据库操作 9、加密和解密 10、硬件读写 1、窗体技巧 链接:https://pan.baidu.com/s/1825O8o-8lumNyp1okp9x5g 提取码:v77o 2、控件操作 链接:https://pan.baidu.com/s/1w2BSd3AQRxa77O4h9F6R9A 提取码:0b6o 3、图像操作 链接:https:......

panjinliang066333的博客 1万+

《机器人学一(Robotics(1))》_台大林沛群 第 3 周 【机械手臂 顺运动学】Quiz 3

的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。bug 的图 要求解的 i 位置有误 两套 题目?B. 第2个 坐标系 的原点位置 不便于 计算;上面的正确,后两题 有误, 不知道问题在哪里。标准部分, 前面的更常用,这种仅作为 了解。还是计算过程中保留两位有效数字 不符合。2、确定 旋转角 α 正负的右手定则。1、确定坐标系方向的右手定则。可相交,距离为 0。A: 右手拇指指向。小数点后两位,不符合。

weixin_46034116的博客 1243

C#+winform登陆界面案例

    这俩天做登陆界面设计,也在网上查了一些资料,发现大部分都是针对某个功能介绍,而很少有完整的案列。我呢就结合自己的需求,把有些功能整合在一起了,欢迎大家修改完善。    SQL数据库设计:    登陆界面设计:using System; using System.Collections.Generic; using System.ComponentModel; using System.Da...

langwen2048的博客 3万+

从零到一:Zephyr RTOS 在 STM32F4 上的移植与实战(含设备树配置详解)

本文详细介绍了如何从零开始将Zephyr RTOS移植到STM32F4开发板,涵盖开发环境搭建、硬件抽象层分析、设备树配置及系统裁剪等关键步骤。通过实战案例,帮助开发者掌握Zephyr RTOS在嵌入式设备中的应用,提升物联网边缘计算设备的开发效率。

weixin_26976635的博客 591

专有钉钉小程序(浙政钉)开发搭建流程总览

最近公司有一个项目要做浙政钉,让我来负责做。靠,我一脸懵,开发了两年多不知道浙政钉是啥,感觉我眼界还是低了。然后就去百度、同事问了一圈才知道就是个钉钉小程序嘛,然后发布到浙政钉上了。就搭建项目跑起来我都肥了很多事,中间走了很多坑。正好领导让我写《钉钉小程序前端开发流程》,这想着也写个博客吧。下面就是整个流程及我所遇到的坑!

m0_53910290的博客 6356

C# 用鼠标拖动无边框窗体

首先,在程序.Designer.cs中添加以下两句:   this.MouseDown += new System.Windows.Forms.MouseEventHandler(Form1_MouseDown); this.MouseMove += new System.Windows.Forms.MouseEventHandler(Form1_MouseMove); 然后在主程序c

znd8866的专栏 920

基于小波变换的信号降噪处理及仿真研究_信号处理方法推荐--1(转载自用,侵删)...

综述作者:aresmiki链接:https://www.zhihu.com/question/23701194/answer/167005497来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。非平稳信号处理应该是现在信号处理技术最新的也是最热的研究方向了,信号处理方法从最早的时域统计到傅里叶变换的频域分析,是人们认识信号本质的一次巨大飞跃,给了分析人员换个角度看世界的...

weixin_32144483的博客 1249

使用C#设计几个简单有趣的WinForm程序

使用C#设计几个简单有趣的WinForm程序 在Visual Studio 2015中,新建winform新项目。开始编写窗体程序。 简易计算器 如下图设计好winform程序,然后双击相应的控件进行代码的编写。 using System; using System.Collections.Generic; using System.ComponentModel; using System....

weixin_43996007的博客 6716

WPF的基础设施:XAML基础语法

XAML是WPF的核心标记语言,采用XML语法实现界面与逻辑分离。其基础语法包括:1)控件声明方式(特性语法和属性元素语法);2)x:Name与Name的区别(适用范围和编译行为);3)注释规范与代码折叠技巧;4)实用特性如属性继承、附加属性等。文章还提供了常见错误排查方法,建议通过实践练习掌握XAML开发技巧。全文系统介绍了XAML的核心语法与应用场景,是WPF开发者的基础学习指南。

Hare的博客 1757

ESP-01S使用micropython,利用Thonny烧写固件

在家舒服的太久了,想学习点新的东西,这次看上了ESP8266系列的联网设备,想自己做点小玩意出来耍耍,下面跟我一起来学习吧。本篇主要记录固件的烧写及测试。Thonny下载链接不算难,但是网上资源较少。也是提醒自己不要忘记这个步骤,记录一下,也分享给和我一样开始接触的小伙伴,加油加油,万事开头难。

weixin_43422072的博客 1693

C#的MonthCalendar控件(月历控件)

MonthCalendar控件(月历控件)提供了一个直观的图形界面,可以让用户查看和设置日期。MonthCalendar控件中可以使用鼠标进行拖曳,用于选择一段连续的时间,此段连续的时间包括时间的起始和结束。一、更改控件的外观MonthCalendar控件允许用多种方法自定义月历的外观。例如,可以选择显示或隐藏周数和当前日期。将ShowWeekNumbers属性设置为true,实现在控件中显示周数。也可以用代码或在“属性”窗口中设置此属性。周数以单独的列出现在一周的第一天的左边。二、在。

wenchm的博客 2405

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

努力,加油每一天鸭~ 1037

工控实战案例(一):WinForms 扫码枪数据采集与MES预备系统

本文是「工控上位机实战案例系列」的第一篇。我们将从一条真实的电子装配线需求出发,手把手教你构建一个轻量级、可运行的。

weixin_46858388的博客 566

月薪30k+的工业视觉,必备Java+YOLO技能(工业级落地全拆解)

30k+工业视觉岗的核心不是算法调参,而是用Java把YOLO落地到工业场景的能力——稳运行、能对接、可管理是高薪的核心壁垒;必备技能分五层:模型工业级适配、Java推理核心、SpringBoot后端、工业部署运维、场景适配,每层都要练到“能落地、能讲清、能避坑”;学习路径的核心是“实战驱动”:不要只学理论,从一个完整的工业项目(如锂电缺陷检测)入手,练完就能对标高薪岗。

2601_94871597的博客 525

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C#高级:Winform桌面开发中DataGridView的详解

3.改:建议如标题二,选中某条数据然后将数据信息转移到textbox上,label显示“您已选中xxx数据”,然后点击button去修改相应信息(选中数据和点击按钮都能获取到对应实体)1.增: 建议用textbox、combobox等工具增,而不是直接datagridview新增,一来麻烦,二来输入工具不能多样化。5.如果单纯用datagridview作增删查改,虽然能实现,但是代码复杂难以维护,而且输入条件单一,容易操作失误,不建议这么做。2.删:建议如标题一,每条数据加一个删除按钮,方便操作。

m0_67412019的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

WinForm+C#小案例--->写一个记事本程序

需求如下:1.文件菜单中有两个下拉列表:保存、打开2.格式菜单中有一个下拉列表:自动换行点击自动换行---->下拉列表中选项变成取消自动换行,点击取消自动换行变成自动换行,同时附带换行和不换行对应的效果3. 样式菜单中有两个下拉列表:字体、颜色,点击字体修改下方输入框中的字体样式,点击颜色修改下方输入框中颜色样式。

MM_MS的博客 531

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

198个经典C#WinForm实例源码(超赞) 里面的例子 .sln 目录

\01-窗体技巧\QQ窗体\QQFrm.sln; \01-窗体技巧\仿XP系统的任务栏菜单\仿XP系统的任务栏菜单.sln; \01-窗体技巧\向窗体中拖放图片并显示\向窗体中拖放图片并显示.sln; \01-窗体技巧\手动改变自制窗体的大小\手动改变自制窗体的大小.sln; \01-窗体技巧\无边框窗体\Noframe.sln; \01-窗体技巧\滚动字幕\FollCaption....

weixin_34041003的博客 2510

C#带复选框的日历控件,本人原创

客户刚好有这个需求,就是日历上面横支持复选功能,也能取消,但是用了很多控件都没法达到要求,网上找了很多控件也都不好用,所以没办法,只能自己开发一个。   不多说,刚刚写了一个初始版本的,还有待改进。主要思路是用代码循环生产复选控件及其控制排布。   看图:   后续版本将封装成一个用户控件,然后通过属性暴露出一个数据集或数组或哈希表,里面存储选中的日期。 再后续的版本将暴露数据绑

yangyuanlife的专栏 1944

三层构架+winform实例(以注册和登录为例)

小白都能看懂的三层构架!!!!

weixin_45332998的博客 2906
上一篇: WinForm+C#小案例--->美女图像随机展示
下一篇: WinForm+C#小案例--->写一个记事本程序
MM_MS
博客等级 码龄1年 58粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MM_MS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值