【WinForm详细教程一】WinForm中的窗体、Label、TextBox及Button控件、RadioButton和CheckBox、ListBox

文章目录

    • 1.WinForm文件结构
    • 2. 窗体的常用属性、方法与事件
      • 2.1 常用属性(可直接在属性中设置)
      • 2.2 常用方法
      • 2.3 常用事件
    • 3.Label、TextBox及Button控件
    • 4.RadioButton和CheckBox
    • 5.ListBox(列表框)

1.WinForm文件结构

.sln文件 :解决方案文件 位置引用
bin文件夹: 存放项目的编译结果 exe dll debug 调试 release 发布 pdb 位置信息–调试
obj文件夹 object 编译过程中生成的中间临时文件 加快编译速度
Properties 引用 添加引用 --选择需要的程序集
App.config 配置文件
.csproj 项目文件 位置引用 双击打开项目

Program.cs :程序入口

Form.cs 源代码(窗口处理代码)
Form.Designer.cs 窗体布局代码 自动生成对应的控件代码
Form.resx 窗体的资源

2. 窗体的常用属性、方法与事件

image-20231023181932153

2.1 常用属性(可直接在属性中设置)

属性名称描述示例代码
Text窗体的标题this.Text = "My Application";
Size窗体的尺寸this.Size = new Size(800, 600);
Location窗体在屏幕上的位置this.Location = new Point(100, 100);
WindowState窗体的状态(正常、最小化、最大化)this.WindowState = FormWindowState.Maximized;
BackColor窗体的背景颜色this.BackColor = Color.Red;
FormBorderStyle窗体边框的样式this.FormBorderStyle = FormBorderStyle.FixedDialog;
StartPosition窗体的初始位置this.StartPosition = FormStartPosition.CenterScreen;

2.2 常用方法

方法名称描述示例代码
Show()显示窗体this.Show();
ShowDialog()模态显示窗体this.ShowDialog();
Hide()隐藏窗体this.Hide();
Close()关闭窗体this.Close();
Activate()激活窗体this.Activate();
Invalidate()强制重新绘制窗体this.Invalidate();

Show()ShowDialog() 是用于显示窗体的两个不同方法,区别如下:

  • Show()

    • 非模态窗体(Non-modal): 当你使用 Show() 方法显示一个窗体时,用户可以自由地在新打开的窗体和原窗体之间切换。

    • 并行交互: 用户可以同时与父窗体和子窗体交互。

    • 代码继续执行: 在 Show() 方法后面的代码会立即执行,不会等待新打开的窗体关闭。

  • ShowDialog()

    • 模态窗体(Modal): 当你使用 ShowDialog() 打开一个窗体时,用户必须首先关闭该窗体才能继续与父窗体交互。

    • 串行交互: 用户在关闭新窗体之前不能与父窗体交互。

    • 代码等待: ShowDialog() 后面的代码会等待用户关闭新打开的窗体才会执行。

2.3 常用事件

事件名称描述示例用途
Load窗体加载时触发初始化窗体内容
Click在窗体上单击时触发处理单击事件
MouseMove鼠标在窗体上移动时触发实现自定义的鼠标跟踪
KeyPress键盘按键被按下时触发处理键盘输入
FormClosing窗体即将关闭时触发弹出确认对话框或保存设置
Resize窗体尺寸改变时触发动态调整控件位置和大小

3.Label、TextBox及Button控件

Label(标签)控件:

  1. 属性:
    • Name:控件的名称,用于在代码中引用它,一般以lbl开头,例如: lblUserName
    • Text:设置或获取显示在标签上的文本信息。
    • Image:用于显示图像。
    • ImageList:图像集控件。
    • Size:控件的尺寸,包括Width和Height。
    • Tag:与控件相关的自定义数据。
    • Enabled:确定是否启用标签。
    • Location:控件在窗体上的位置,包括X和Y坐标。
  2. 事件:
    • Click:当用户单击标签时触发。
    • TextChanged:当标签的文本内容发生更改时触发。

TextBox(文本框)控件:

  1. 属性:
    • Name:控件的名称。一般以txt开头,例如:txtUserName
    • Text:用于输入和获取文本信息。
    • MultiLine:确定文本框是否支持多行文本输入。
    • WordWrap:确定是否可以自动换行。
    • PasswordChar:指定密码框中的密码字符。
    • Size:控件的尺寸。
    • Enabled:确定是否启用文本框。
    • Location:控件在窗体上的位置。
  2. 方法:
    • AppendText(text):将指定的text文本追加到文本框的末尾。
    • Clear():清除文本框中的文本。
    • Focus():使文本框获取焦点。
    • Select():选择文本框中的文本。
    • SelectAll():选择文本框中的所有文本。
  3. 事件:
    • TextChanged:当文本框的文本内容发生更改时触发。
    • Click:一般不用于文本框,通常用于按钮等控件。

Button(按钮)控件:

  1. 属性:
    • Name:控件的名称。
    • Text:用于显示在按钮上的文本。
    • BackgroundImage:背景图片。
    • Image:按钮上显示的图像。
    • BackColor:背景色。
    • ForeColor:文本颜色。
    • Visible:确定按钮是否可见。
  2. 事件:
    • Click:当用户单击按钮时触发,通常用于执行与按钮相关的命令。

案例:做一个简单的登录界面

image-20231024105614900

代码

 public partial class FrmUser : Form
 {
     public FrmUser()
     {
         InitializeComponent();
         txtName.Text = "请输入账户";
         txtPassword.Text = "请输入密码";
         txtName.ForeColor = Color.Gray;
         txtPassword.ForeColor = Color.Gray;
     }

     private void Form1_Load(object sender, EventArgs e) //sender事件触发的对象
     {
     }

     private void textBox2_TextChanged(object sender, EventArgs e)
     {
         txtPassword.ForeColor = Color.Black;
     }

     private void txtName_TextChanged(object sender, EventArgs e)
     {
         txtName.ForeColor = Color.Black;
     }
     
     private void button2_Click(object sender, EventArgs e)
     {
         string UserName = txtName.Text.Trim();
         string userPwd = txtPassword.Text;

         if (string.IsNullOrEmpty(UserName) || UserName == "请输入账户")
         {
             MessageBox.Show("请输入用户名!", "登录页面", MessageBoxButtons.OK, MessageBoxIcon.Error);
             return;
         }
         if (string.IsNullOrEmpty(userPwd) || UserName == "请输入密码")
         {
             MessageBox.Show("请输入密码!", "登录页面", MessageBoxButtons.OK, MessageBoxIcon.Error);
             return;
         }
         MessageBox.Show("登录成功!", "进入主界面中....", MessageBoxButtons.OK, MessageBoxIcon.Information);
     }

     private void btn_Click(object sender, EventArgs e)
     {
         this.Close();
     }
 }

代码实现了一个基本的用户登录界面,用户可以输入用户名和密码,点击 “登录” 按钮进行登录,或者点击 “关闭” 按钮关闭窗体。同时,也包含了一些用户友好的功能,如在文本框中显示提示文本,输入文本时改变文本颜色,以及在输入验证时显示错误消息框。

image-20231024110514232
image-20231024110446593

4.RadioButton和CheckBox

RadioButton(单选按钮)

RadioButton 用于在一组选项中选择单一选项。在一组单选按钮中,只能选中其中一个,互相排斥。

属性

  • Name: 控件的名称
  • Text: 显示在界面上的文本
  • Checked: 是否被选中,返回布尔值
  • AutoCheck: 自动更改其他 RadioButton 的选中状态,默认为 true。

事件

  • CheckedChanged: 当选中状态改变时触发该事件。

应用场景

  • 角色选择登录
  • 性别选择

分组与代码操作: RadioButton 控件通常会放在一个 GroupBox 控件内,以形成一个逻辑分组,从而在这个分组中只能选择一个选项。通过代码也可以轻易地改变 RadioButton 的状态,例如 radioButton1.Checked = true;

事件处理: 你可以在 CheckedChanged 事件的事件处理器中添加逻辑,以响应用户的操作。例如:

csharpCopy codeprivate void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    if (radioButton1.Checked)
    {
        // 执行某些操作
    }
}

CheckBox(复选框)

CheckBox 用于在一组选项中选择一个或多个项。

属性

  • Name: 控件的名称
  • Text: 显示在界面上的文本
  • Checked: 是否被选中,返回布尔值。
  • AutoCheck: 单击时自动更改选中状态,默认为 true,通常不要去修改这个属性。
  • CheckState: 表示三种不同的状态——未选中、选中、中间状态。
  • ThreeState: 控制 CheckBox 是三种状态还是两种,默认为 false。

事件

  • CheckedChanged: 当 Checked 属性值改变时触发。
  • CheckStateChanged: 当 CheckState 改变时触发。

事件触发顺序

  1. CheckedChanged(Checked 属性值改变)
  2. CheckStateChanged(CheckState 改变)

应用场景

  • 权限分配
  • 角色分配

高级用法与代码操作: 当 ThreeState 属性设置为 true 时,CheckBox 可以有三种状态:未选中、选中和中间状态。这在一些复杂的场景中(例如,批量操作)可能会很有用。通过代码也可以轻易地改变 CheckBox 的状态,例如 checkBox1.Checked = true;checkBox1.CheckState = CheckState.Indeterminate;

事件处理: 你可以在 CheckedChangedCheckStateChanged 事件的事件处理器中添加逻辑,以响应用户的操作。例如:

csharpCopy codeprivate void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    if (checkBox1.Checked)
    {
        // 执行某些操作
    }
}

示例:

 public partial class frmSubmit : Form
 {
     public frmSubmit()
     {
         InitializeComponent();
     }

     private void btnCancel_Click(object sender, EventArgs e)
     {
         this.Close();
     }

     private void btnOk_Click(object sender, EventArgs e)
     {
         MessageBox.Show("提交成功!", "提交完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
     }
     private void rdWriter_CheckedChanged(object sender, EventArgs e)
     {
         DialogResult result = MessageBox.Show("确定切换吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
         // 判断用户的选择
         if (result == DialogResult.OK)
         {
             // 用户选择了 OK,执行相应的操作
             // 这里可以放置你想要执行的代码
         }
         else if (result == DialogResult.Cancel)
         {
             // 用户选择了 Cancel,可以选择不执行任何操作
             // 或者放置一些取消操作的代码
         }

     }
 }

上面代码包含了按钮点击事件和单选按钮选择事件的处理逻辑。在用户与窗体进行交互时,它会显示消息框以获得用户的确认或取消操作,并根据用户的选择执行相应的操作。

在这里插入图片描述

5.ListBox(列表框)

ListBox 是 Windows Forms 中的一个控件,用于显示一列可选项,用户可以选择一项或多项。

属性

  • Name: 控件的名称
  • Items: 列表框中的项集合,可以通过它来添加、移除和操作列表中的项。
  • DataSource: 数据源,用于绑定 ListBox 到外部数据源,通常与 DisplayMemberValueMember 属性一起使用。
  • DisplayMember: 指定绑定数据源时显示的字段的名称。
  • ValueMember: 指定绑定数据源时用作值的字段的名称。

事件

  • SelectedIndexChanged: 当选择项更改时触发的事件,可以用于捕捉用户的选择变化。

示例:

public partial class FrmListBox : Form
{
    public FrmListBox()
    {
        InitializeComponent();
    }

    private void FrmListBox_Load(object sender, EventArgs e)
    {
        //项的清除
        listBox1.Items.Clear();
        //避免控件闪烁的问题
        listBox1.BeginUpdate();//闪烁
        //for循环等加载大量的项 

        listBox1.EndUpdate();
        //添加项
        listBox1.Items.Add(123);
        listBox1.Items.Add("jason");
        string[] list = { "adbc", "admin", "sqlserver" };
        listBox1.Items.AddRange(list);

        listBox1.Items.Insert(3, "micosoft");

        int index = listBox1.Items.IndexOf("admin");//获取索引
        bool bl = listBox1.Items.Contains("sqlserver");//存在
        listBox1.Items.Remove("admin");
        listBox1.Items.RemoveAt(3);
    }
}

在这里插入图片描述
**示例二:**使用ListBox控件,并且通过自定义的UserInfo类来进行数据绑定。

 List<UserInfo> userInfos = new List<UserInfo>();
 userInfos.Add(new UserInfo()
 {
     ID = 1,
     Name = "admin"
 });
 userInfos.Add(new UserInfo()
 {
     ID = 2,
     Name = "lycchun"
 });
 userInfos.Add(new UserInfo()
 {
     ID = 3,
     Name = "lwb"
 });
 userInfos.Add(new UserInfo()
 {
     ID = 4,
     Name = "Eleven"
 });
 userInfos.Add(new UserInfo()
 {
     ID = 5,
     Name = "Jason"
 });
 //绑定数据 项的实际值一般来说,就会指定对应显示值的编号
 listBox1.DataSource = userInfos;//选项的来源
 listBox1.DisplayMember = "Name";//项显示的文本对应属性名
 listBox1.ValueMember = "ID";//项的实际值对应的属性名


 //将对项集合的修改转换成对数据源集合的修改
 List<UserInfo> listNew = listBox1.DataSource as List<UserInfo>;
 listNew.Add(new UserInfo()
 {
     ID = 6,
     Name = "adbc"
 });
 listNew.RemoveAt(2);

 listBox1.DataSource = null;
 listBox1.DataSource = listNew;
 listBox1.DisplayMember = "Name";//项显示的文本对应属性名
 listBox1.ValueMember = "ID";//项的实际值对应的属性名

 //var indexes =listBox1.SelectedIndex;
 //var items = listBox1.SelectedItem;
 //int index = listBox1.SelectedValue;
 //var item0 =listBox1.SelectedIndices;
 //var val = listBox1.SelectedItems;

精彩推荐:
【C#进阶一】C#中的数组(Array)、集合(ArrayList,Queue,Stack, HashList)、List<T>、字典(Dictionary<K,T>)和双向链表LinkedList
【C#进阶八】C#中的序列化与反序列化下(二进制序列化、XML序列化及JSON序列化)

希望有所帮助,同时欢迎关注我,后面将更新更多相关内容!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/104881.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop分布式安装

首先准备好三台服务器或者虚拟机&#xff0c;我本机安装了三个虚拟机&#xff0c;安装虚拟机的步骤参考我之前的一篇 virtualBox虚拟机安装多个主机访问虚拟机虚拟机访问外网配置-CSDN博客 jdk安装 参考文档&#xff1a;Linux 环境下安装JDK1.8并配置环境变量_linux安装jdk1.8并…

干货很干:5个有效引流方法,让客户找上门

如何才能把用户引流到私域&#xff1f;是很多老板&#xff0c;店主&#xff0c;线上创业者的卡点&#xff0c;今天分享5个实用方法&#xff1a; ✅线下导流 ✅巧用搜索 ✅同行互推 ✅社群引流 ✅内容输出 所以引流不仅需要知道方法&#xff0c;还需要知道底层逻辑&#xff0c;也…

uniapp开发微信小程序的巨坑

1、不能使用v-show 2、关于插槽的巨坑 这里我真的是摸索了好久。 小程序版本&#xff1a; hbuilderx版本&#xff1a; 其他版本不知道会不会出现以下情况。 如果组件中带有插槽&#xff0c;那么使用插槽时有以下要注意&#xff1a; 1、如果子组件通过slot&#xff0c;向外…

SQL sever中的函数(基础)

目录 一、聚合函数 1.1聚合函数概述 1.2SUM(求和)函数 1.3AVG(平均值)函数 1.4MIN(最小值)函数 1.5MAX(最大值)函数 1.6COUNT(统计)函数 1.6.1COUNT函数用法分类 1.6.2COUNT函数用法示例 1.7DISTINCT(取不重复记录)函数 1.8查询重复记录 二、数学函数 2.1数学函数…

ELK概述部署和Filebeat 分布式日志管理平台部署

ELK概述部署、Filebeat 分布式日志管理平台部署 一、ELK 简介二、ELK部署2.1、部署准备2.2、优化elasticsearch用户拥有的内存权限2.3、启动elasticsearch是否成功开启2.4、浏览器查看节点信息2.5、安装 Elasticsearch-head 插件2.6、ELK Logstash 部署&#xff08;在 Apache 节…

中国密码算法与NIST标准对比

1. 引言 NIST定义AES为标准的对称密钥加密算法。但NIST被指出可能在加密算法中添加NSA后门。为此&#xff0c;在中国&#xff0c;ShāngM (SM) 系列密码算法&#xff0c;作为TLS 1.3集成和无线认证的备选方案&#xff1a; SM2&#xff1a;定义了认证&#xff08;签名&#xf…

cuda卸载

去查看你的电脑显卡对应的cuda版本&#xff0c;不然还是一整个用不到gpu的情况嘿嘿. 啊啊啊啊打开控制面板看一下&#xff0c;驱动不要乱卸载&#xff1a; 这些东西不能全部卸载了哦&#xff0c;只能卸载含有“CUDA”的那几个&#xff08;其实其他的可能也没有用 但是不懂的哇 …

用Rust和cURL库做一个有趣的爬虫

以下是一个使用 Rust 和 cURL 库的下载器程序&#xff0c;用于从wechat下载音频。此程序使用了 [/get_proxy] 提供的代码。 extern crate curl;use std::io::{self, Read}; use std::process::exit; use curl::easy::Easy;fn main() {let url "https://www.wechat.com/au…

vue3 源码解析(1)— reactive 响应式实现

前言 本文是 vue3 源码解析系列的第一篇文章&#xff0c;项目代码的整体实现是参考了 v3.2.10 版本&#xff0c;项目整体架构可以参考之前我写过的文章 rollup 实现多模块打包。话不多说&#xff0c;让我们通过一个简单例子开始这个系列的文章。 举个例子 <!DOCTYPE html…

Web攻防05_MySQL_二次注入堆叠注入带外注入

文章目录 MYSQL-二次注入-74CMS思路描述&#xff1a;注入条件&#xff1a;案例&#xff1a;74CMS个人中心简历功能 MYSQL-堆叠注入-CTF强网思路描述注入条件案例&#xff1a;2019强网杯-随便注&#xff08;CTF题型&#xff09; MYSQL-带外注入-DNSLOG注入条件使用平台带外应用场…

Mybatis-Plus CRUD

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Mybatis-Plus CRUD 通用 Service CRUD 封装 IService 接口&#xff0c;进一步封装 CRUD 采用 get 查询、remove 删除 、list 查询集合、page 分页的前缀命名方式区分 …

【0229】libpq库实现压测PG服务器max_connections的最大连接数

1. PG服务器接收的最大连接数 在PG服务的postgresql.conf配置文件中,参数:max_connections 注明了PG服务所能够接受的最大客户端的连接数量。此值默认是100,那么PG服务此参数最大能够调到多大呢? 本文将采用libpq库编写demo来进行压测,并将最终的结论和数据于文章中给出。…

UWB技术在定位系统中的革新应用

超宽带技术&#xff08;Ultra-Wideband, UWB&#xff09;的崛起为定位系统领域带来了前所未有的机遇。其亚米级别的高精度定位、强大的穿透能力以及高速数据传输的特性&#xff0c;使得UWB在室内和室外定位系统中得以广泛应用。本文将深入探讨UWB技术在定位系统中的应用&#x…

关于数据可视化那些事

干巴巴的数据没人看&#xff0c;数据可视化才能直观展现数据要点&#xff0c;提升数据分析、数字化运营决策效率。那关于可视化的实现方式、技巧、工具等&#xff0c;你了解几分&#xff1f;接下来&#xff0c;我们就来聊聊数据可视化那些事。 1、什么是数据可视化&#xff1f…

java 企业工程管理系统软件源码 自主研发 工程行业适用

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

LeetCode刷题---简单组(三)

文章目录 &#x1f352;题目一 20. 有效的括号&#x1f352;解法一&#x1f352;题目二 26. 删除有序数组中的重复项&#x1f352;解法一&#x1f352;题目三 21. 合并两个有序链表&#x1f352;解法一 &#x1f352;题目一 20. 有效的括号 给定一个只包括 ‘(’&#xff0c;‘…

在antd里面渲染MarkDown并且自定义一个锚点目录TOC(重点解决导航目录不跟随文档滚动的问题)

一、整体思路 由于有很多很长的文档需要渲染&#xff0c;我觉得用MarkDown的方式会比较适合管理&#xff0c;所以这两天测试了一下在antd里面集成MarkDown的渲染模块。 总体思路参考&#xff1a; https://blog.csdn.net/Sakuraaaa_/article/details/128400497 感恩大佬的倾情付…

windows安装最新pip官方教程

在执行pip的pip install --upgrade pip更新时&#xff0c;出现如下错误&#xff0c;怎么也无法重新安装&#xff1a; 根据官网的安装教程来 命令的方式一&#xff1a; • 卸载PIP的命令&#xff1a;python -m pip uninstall pip • 重装PIP的命令&#xff1a;python -m ensure…

Biome-BGC生态系统模型与Python融合技术教程

详情点击公众号链接&#xff1a;Biome-BGC生态系统模型与Python融合技术教程 前言 Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数&#xff0c;模拟日尺度碳、水和氮通量的有效模型&#xff0c;其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型…

thinkphp6项目使用多应用开发

使用composer安装项目&#xff0c;命令&#xff1a;composer create-project topthink/think thinkphp6使用多应用开发&#xff0c;安装多应用扩展&#xff0c;命令&#xff1a;composer require topthink/think-multi-app安装多应用扩展成功后&#xff0c;删除app/controller文…