当前位置: 首页 > news >正文

WinForms开发基础:实现带X按钮的ClearableTextBox控件

在这里插入图片描述

前言

我们经常看到这样的带X按钮的输入框在这里插入图片描述
如果使用WinForms开发中,该如何进行设计,普通的TextBox控件如何进行改造?为了提升用户体验,在TextBox文本框内添加一个“x”按钮,方便用户一键清除内容。本文将介绍如何通过继承TextBox控件实现自定义的ClearableTextBox

功能需求

  1. 当文本框为空时,隐藏“x”按钮。
  2. 当文本框有输入内容时,显示“x”按钮。
  3. 点击“x”按钮时,清空文本框内容并隐藏按钮。

实现步骤

1. 创建ClearableTextBox控件

首先,在项目中添加一个新类ClearableTextBox,继承自TextBox

using System;
using System.Drawing;
using System.Windows.Forms;public class ClearableTextBox : TextBox
{private Button clearButton;public ClearableTextBox(){InitializeClearButton();AttachEventHandlers();}private void InitializeClearButton(){clearButton = new Button{Text = "x",Font = new Font(FontFamily.GenericSansSerif, 8, FontStyle.Bold),Size = new Size(18, 18),FlatStyle = FlatStyle.Flat,Visible = false,Cursor = Cursors.Hand,Dock = DockStyle.Right};clearButton.FlatAppearance.BorderSize = 0;Controls.Add(clearButton);}private void AttachEventHandlers(){TextChanged += (s, e) => clearButton.Visible = !string.IsNullOrEmpty(Text);clearButton.Click += (s, e) => ClearText();}private void ClearText(){Text = string.Empty;clearButton.Visible = false;}protected override void OnResize(EventArgs e){base.OnResize(e);PositionClearButton();}private void PositionClearButton(){clearButton.Location = new Point(Width - clearButton.Width - 2, (Height - clearButton.Height) / 2);}
}

2. 关键逻辑解析

  • 按钮显示与隐藏:通过TextChanged事件,根据文本是否为空来控制按钮的可见性。
  • 文本框内容清除:按钮点击时调用ClearText()方法,清空文本并隐藏按钮。
  • 按钮位置调整:重写OnResize方法,确保在控件大小改变时,按钮始终位于右侧中央。

3. 在WinForms窗体中使用

编译之后,可以在工具箱中查看新的ClearableTextBox控件
在这里插入图片描述
在窗体设计器中拖拽一个ClearableTextBox控件,或通过代码添加:

public partial class Form1 : Form
{public Form1(){InitializeComponent();var textBox = new ClearableTextBox{Location = new Point(20, 20),Width = 200};Controls.Add(textBox);}
}

在这里插入图片描述

总结

通过继承TextBox并添加Button控件,我们实现了一个带“x”按钮的文本框,提升了用户操作的便捷性。此方法不仅简化了UI逻辑,还易于在项目中复用。

相关文章:

  • 【数论】3260. 找出最大的 N 位 K 回文数|2370
  • 老婆是用来爱的,不是用来吼的
  • 探秘Python 工匠:案例、技巧与工程实践:解锁Python进阶的通关秘籍
  • Mixture-of-Experts with Expert Choice Routing:专家混合模型与专家选择路由
  • LeetCode 1365. 有多少小于当前数字的数字 java题解
  • @EnableAsync+@Async源码学习笔记之一
  • C语言格式化输入输出总结 (printf和scanf)
  • ubuntu18.04安装QT问题汇总
  • 【STM32单片机】#10 USART串口通信
  • Kubernetes 多主多从集群部署完整文档
  • 解码 Web Service:从技术原理到应用场景的深度剖析
  • (2)Vue事件绑定的使用
  • 测试第四课---------性能测试
  • JAVA IO、BIO、NIO、AIO及零拷贝
  • 数据从辅存调入主存,页表中一定存在
  • LinearLayout 线性布局
  • 6.7 ChatGPT自动生成定时任务脚本:Python与Cron双方案实战指南
  • dac直通线还是aoc直通线? sfp使用
  • Shell脚本-什么时候需要定义变量
  • 【2025】Datawhale AI春训营-蛋白质预测(AI+生命科学)-Task2笔记
  • 深交所修订创业板指数编制方案,引入ESG负面剔除机制
  • 200枚篆刻聚焦北京中轴线,“印记”申遗往事
  • 司法服务保障西部陆海新通道建设,最高法专门发文
  • 圆桌|如何应对特朗普政府的关税霸凌?一种联合国视角的思考
  • 中国科学院院士张泽民已任重庆医科大学校长
  • 浙商银行一季度净赚超59亿微增0.61%,非息净收入降逾22%