Winform

2023-05-16

  1. 自适应窗口布局:OnLayout()

  • 窗口在尺寸变化时,会调用OnLayout方法, 所以 , 在form1.cs文件里重写OnLayout方法即可实现自适应

  • 在OnLayout方法中,我们获取一下窗口的宽度和高度,根据窗口的宽度和高度重新设定控件的位置和尺寸

注意: 1. Size是指整个窗口的大小, ClientSize是窗口的用户区域大小
2.有些控件的尺寸是被锁住的,比如textBox的高度。

效果展示:

  • 窗口里的三个控件都随着界面改变位置和大小

//窗体随页面拉动变大变小
protected override void OnLayout (LayoutEventArgs levent){
    //1.调父类的onLayout(),不是必需的
    base. OnLayout (levent) ;
    //2.获取窗口大小clientsize(仅客户区,不含标题栏)
    int w = this. ClientSize. Width;
    int h = this. ClientSize. Height;
    //3.计算每-一个控件的位置和大小
    int yoff = 0;
    yoff = 4;
    this. textBox1. Location = new Point(0,yoff);|
    this. textBoxl.Size = new Size(w-80,40) ;
    this. button1. Location = new Point(w - 80,yoff) ;
    this. button1.Size = new Size(80,40) ;
    yoff += 40;//第一行的高度
    yoff += 4;//间隔
    this. pictureBoxl. Location = new Point(0, yoff) ;
    this. pictureBoxl.Size = new Size(w,h - yoff - 4) ;
}

2. 锚点固定

  • 每个控件都有一个通用属性Anchor (锚点)

  • 也可以实现拉伸的效果:

  • 也可以实现居中效果:

  • 也可以实现水平竖直同时居中:

  • 也可以实现平铺效果:

3. Dock栏

用dock方式设置了一个典型的布局

注意:锚点Anchor和Dock不能同时设置,设置Dock属性后,Anchor属性就会失效

4.自定义布局器:LayoutEngine()

  • 布局器LayoutEngine :负责子控件的布局

  • 默认地,一个Form或 Panel 都自带了一个布局器

  • 在窗口改变大小时,由窗口的布局器来负责调整布局

  • 自己编写一个布局规则,在也页面设计时,拉过来就能使用了

5.流式布局:FlowLayoutPanel

  • 在流式布局容器里的控件是按规律一行排序,排满才换行

  • 控件未知会随容器变化而改变位置

  • winform自带了流式布局面板,拖入即可用

注意:flowLayoutPanel至少一个面板,它并不是一个布局器,但是它内部默认实现了一个布局器

6.表格布局:TableLayoutPanel

  • winform自带了表格布局面板,拖入即可用

  • 右键添加行列

  • 也可以在属性里设置

  • 点击这个按钮可以打开行列的具体设置

7.DockLayout

  • DockLayout:是对默认Dock布局的优化版

  • 需要自己定义一个控件(我还不会)

  • DockLayout的特点:

  • 1支持上、下、左、右、中位置,顺序无关

  • 2支持各个控件的Margin

  • 3支持设置容器本身的Padding

8.常用的控件

8.1 TextBox 文本框控件

  • 想要设置宽高时,需要在cs文件中的click控制方法中编写:

textBox.AutoSize = false;//也可以在属性栏中设置,当为true时,文本框会自己计算所需大小
textBox.Height = 40;
  • 属性
  • 设计

Name:变量名

  • 外观

Text:文本

Font:字体

  • 事件

KeyPress:按键事件,常用于文本框输入完成后,用户回车触发处理

private void TestKeyPress(object sender, KeyPressEventArgs e)
        {
            char keyChar = e.KeyChar;
            if (keyChar == '\r')
            {
                string text = textBox1.Text;
                MessageBox.Show(text, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

8.2 CheckBox 复选框

  • 属性:
  • 外观:

Text : 文本显示

Checked : √/否

  • 事件:

Click:点击动作

CheckedChanged :选中状态发生变化

  • 练习:复选框显示密码选择,当勾选时,密码可见,未勾选时密码隐藏

  • 使用这个

//复选框状态变化世家 
private void TestPassWordCheckChanged(object sender, EventArgs e)
        {
            bool che = checkBox1.Checked;
            if (che)
            {
                textBox1.PasswordChar = '\0';
            }
            else {
                textBox1.PasswordChar = '*';
            }
        }
注意:

区分Click和CheckedChanged两种事件
Click:用户手动点击
CheckedChanged :状态值发生变化,可能是用户点击,也可能是程序代码改变了这个值
例如:
checkBox1.Checked = true;

8.3 comboBox 下拉列表

  • 1.添加数据项
  • 在设计器里直接编辑

属性|数据|Items

  • 也可以在构造方法里手工添加

  public Form1()
        {
            InitializeComponent();
            //注意:必须写在这个类的构造方法这个位置才会生效
            comboBox1.Items.Clear();
            comboBox1.Items.Add("张三");
            comboBox1.Items.Add("李四");
            comboBox1.Items.Add("王五");
            comboBox1.SelectedIndex = 0;//默认选中下标为0的选项
        }
  • 2.获取选中的项
  • SelectedItem :选中项的值,null表示未选中

  • SelectedIndex :选中项的索引,-1表示未选中

//选中后,点击按钮触发按钮绑定的事件,编译模式下控制台输出,选中的选项
private void button1_ Click (object sender,EventArgs e)
{
    // selectedItem :选中项的值,null表示未选中
    // selectedIndex :选中项的索引,-1表示未选中
    int index = comboBox1. SelectedIndex; 
    string sel = (string) comboBox1. SelectedItem;
    Console. WriteLine ("选中了:”+ sel) ;
}
comboBox1.SelectedIndex = 0;//默认选中下标为0的选项
  • 3.事件
  • 事件|行为| SelectedIndexChanged

 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
 {
     Console.WriteLine("现在选中的是"+comboBox1.SelectedItem);
 }

8.4 ListBox列表框

  • 属性:

  • (行为) SelectionMode:单选/多选

  • 事件:

  • (行为) SelectedIndexChanged:选项操作事件

8.5 (练习)学生信息编辑

  • 练习:实现一个学生信息的编辑器-学号,姓名,性别,手机号

  • 将数据保存到文件

  • 启动时从文件读取

1界面布局
  • 添加需要的控件.修改显示文本Text-手工对齐

  • 修改控件名id、Name、sex、number

2保存功能
  • 点保存时,将界面的数据保存到文件中-添加NewtonSoft.json支持

  • 添加按钮事件处理

  • 将数据保存为JSON,存到文件中

3加载功能
  • 当程序启动时,自动读取student.txt中的数据

  • 在构造方法中加载

  • 读取文件,转成JSON

  • 将数据显示到界面

8.6 CheckListBox 多选框

  • 简介类似ListBox项的列表区别:每个项前面有个复选框

  • 事件:

  • CheckOnClick() :设置true,点击时会选中或者取消复选框

  • 属性:

  • Items : 复选框中各项的集合

  • 方法 :

  • checkedListBox1.Items.Add() :添加复选框的选项

DataSource DisplayMember ValueMember4.事件: SelectedIndexChangedItemCheck

9.图片

10.启动后台工作支线程:backgroundWorker

  • 我们在项目中,应该经常需要进行多线程操作,比如需要开辟一个线程去执行很耗时的任务。如果不使用多线程,那么页面就会被卡死(主线程运行时,界面无法拖动,知道界面运行完毕,界面才可以拖动)。

  • 属性:

  • WorkerReportsProgress:用于设置后台任务是否可以把它的进度汇报给主线程

  • WorkerSupportsCancellation:是否支持从主线程取消

  • IsBusy:检查后台任务是否正在运行

  • 事件:

  • DoWork:在后台线程开始的时候触发DoWork。DoWork事件处理程序(在后台线程)

在希望向主线程汇报进度的时候,调用 backgroundWorker1.ReportProgress(i);方法。

  • ProgressChanged:在后台任务汇报状态的时候触发ProgressChanged事件

  • RunWorkerCompleted:后台工作线程退出的时候触发RunWorkerCompleted事件

  • 用来发送不同的程序事件和状态。你需要为自己的程序写这些事件的事件处理方法来执行适合程序的行为;

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //开启跨线程修改UI界面(不推荐使用,不安全),默认为true
            //CheckForIllegalCrossThreadCalls = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "开始")
            {
                backgroundWorker1.RunWorkerAsync();
                button1.Enabled = false;
            }
        }

        //1、开启异步后台运行时,自动做的工作
        private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            for (int i = 1; i < 101; i++)
            {
                Thread.Sleep(1000);
                backgroundWorker1.ReportProgress(i);

                //方法一:
                //使用Invoke方式跨线程直接修改UI界面
                //Invoke(() => {
                //    progressBar1.Value = i;
                //});

                //方法二:
                //进程改变处理函数,汇报进度(以供backgroundWorker1_ProgressChanged()时间获取后台DoWork进度)
                backgroundWorker1.ReportProgress(i);
            }
        }
        //1、获取后台汇报的进度,在主线程中执行
        private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;//获取后台工作汇报的进度
        }

        //3、后台工作运行结束后开启的事件
        private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("后台工作执行完毕");
            button1.Enabled = true;
            progressBar1.Value = 1;
        }
    }

11、DataGripView : 数据单元格

public partial class Form2 : Form{
        public Form2(){
            InitializeComponent();

       //一次选择一整行
            dgv1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
       //去掉表格最下面的空白行
            dgv1.AllowUserToAddRows = false;
       //设置是否可以多选
            dgv1.MultiSelect = false;
       //行头是否隐藏
            dgv1.RowHeadersVisible = false;

            var style = dgv1.RowsDefaultCellStyle;
       //行的背景颜色
            style.BackColor = Color.AliceBlue;
       //行的字体颜色
            style.ForeColor = Color.Blue;
       //设置选中行的背景颜色
            style.SelectionBackColor = Color.Red;
        }
        private void Form2_Load(object sender, EventArgs e){
            dgv1.Columns.Add("id", "编号");
            dgv1.Columns.Add("name", "姓名");
            dgv1.Columns.Add("age", "年龄");
            dgv1.Columns.Add("sex", "性别");
            for (int i = 0; i <= 100; i++) {
                if (i == 0){
                    dgv1.Rows.Add(i, "王一", 20, "男");
                }
                else if (i % 2 == 0){
                    dgv1.Rows.Add(i, "李二", 21, "男");
                }
                else if (i % 2 == 1) {
                    dgv1.Rows.Add(i, "刘思思", 18, "女");
                }
            }
        }

        private void dgv1_SelectionChanged(object sender, EventArgs e){
            DataGridViewSelectedRowCollection srs = dgv1.SelectedRows;
            DataGridViewRow row = srs[0];
            if (row != null){
                textBox1.Text = row.Cells[0].Value.ToString();
                textBox2.Text = row.Cells[1].Value.ToString();
                textBox3.Text = row.Cells[2].Value.ToString();
                textBox4.Text = row.Cells[3].Value.ToString();
            }
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Winform 的相关文章

  • C# winform使用SQLite

    本文仅是一个笔记 xff0c 仅供参考 SQLite SQLite是遵守ACID的关系数据库管理系统 xff0c 它包含在一个相对小的C程序库中 与许多其它数据库管理系统不同 xff0c SQLite不是一个客户端 服务器结构的数据库引擎
  • C# winform treeview GDI+流程连线 流程图 树形流程图

    C winform treeview GDI 43 流程连线 流程图 树形流程图 TreeView Paint的方法呈现效果 xff0c 具体如下 1 点击连线按钮开始准备连线 2 点击第一个连线的起始节点 3 再点击第二个连线的结束节点
  • winform-日记

    1 Form的属性TopLevel设置为false xff0c 就相当于usercontrol的功能了 xff0c 可以被包含在容器中 xff0c 只不过需要动态在代码中加载 xff0c usercontrol则可拖拽
  • Winform中提提升重绘效率-背景的设置

    backgrounglayout属性设置为none xff0c 否则会影响重绘效率
  • WinForm 之Control.Invoke 和Control.BeginInvoke 方法的使用 Control 不能在创建它的 Thread 之外被调用。但可以通过 invoke 来保证 C

    WinForm 之Control Invoke 和Control BeginInvoke 方法的使用 Control 不能在创建它的 Thread 之外被调用 但可以通过 invoke 来保证 Control 线程安全 在跨线程更新的时候
  • VS2019使用C++创建winform界面

    用C 43 43 实现winform界面 算是对上一篇文章的补充吧 xff0c 实际上不需要那么繁琐也可以做到 事先准备 打开VS xff0c 新建一个CLR项目 如果在选项中没有发现CLR项目 xff1a 1 找到Visual Studi
  • Winform

    自适应窗口布局 OnLayout 窗口在尺寸变化时 会调用OnLayout方法 所以 在form1 cs文件里重写OnLayout方法即可实现自适应 在OnLayout方法中 我们获取一下窗口的宽度和高度 根据窗口的宽度和高度重新设定控件的
  • C# winform事件执行顺序

    转载地址 https www cnblogs com luoyaoquan archive 2011 06 30 2094255 html 目录 Paint事件Load事件Refresh方法 进入控件时 xff1a 先激发OnEnter后激
  • winform窗体

    一 winform介绍 WinForm xff0c 是 Net开发平台中对Windows Form的一种称谓 WinForm是窗体应用程序 xff0c 由若干个窗体应用组成 xff0c 基于C S架构 二 winform的使用 xff08
  • C# WinForm系列-创建Windows项目

    本系列实例适合初学者 xff0c 老手请直接Pass吧 Visual Studio从2003版本到现在的2022版本 xff0c 我也一版一版的使用 xff0c 体验了微软这个IDE开发工具的强大 唉 xff0c 我想多说点或上网多找点资料
  • Winform的控件学习整理篇

    窗体 窗体是整个WinForm的核心 xff0c 在Windows系统上的每一个界面都可以看作是一个窗体 xff0c 只不过其功能各异而已 新建一个空白的窗体 xff1a 窗体常用属性 xff1a name xff1a 窗体的名称 xff0
  • Winform 集成零散dll进exe的方法

    Winform程序经常需要引用一些第三方控件 xff0c 这些控件大多以DLL的形式提供 另外 xff0c 一般USB桥芯片的官方提供 net操作类库也都是DLL形式提供的 因此一个稍大的项目中往往有一大堆的零散的DLL文件 xff0c 而
  • winform开发框架常见的分层模式

    winform开发框架 基础的分层模式 可以分为UI层 User Interface BLL层 Business Logic Layer 业务逻辑层 DAL层 Data Access Layer 数据访问层 业务逻辑层 Business L
  • winform 中 Devexpress Charts动态添加数据

    参考 Devexpress Charts动态添加数据 https www cnblogs com zhangruisoldier p 4226950 html DevExpress 图表控件 ChartControl 动态绑定数据 http
  • winform 登录跳转页面

    登录成功后跳转 改两个地方就可以解决而 第一个 上面的判断是登录成功与否 跳转需要的就是一句 当前页 改变DialogResult this DialogResult DialogResult OK 第二个 在Program cs里面 st
  • winform 程序的配置文件——App.config

    winform 程序的配置文件 App config Posted on 2005 09 26 17 11 sashow 阅读 668 评论 3 编辑 收藏 引用 网摘 所属分类 c 编程 在做 web 项目的时候 我一直在用 web co
  • C# WINFORM嵌入CHROME浏览器(CEFSHARP)

    在开发过程中经常需要在程序中嵌入浏览器控件用于访问网页 Visual Studio中自带了一个webbrowser控件 但无奈这个控件是调用用户电脑上的IE浏览器来实现的 如果用户装的是低版本IE 比如Win7的IE8 很多新的网页标准就无
  • Winform Application.SetUnhandledExceptionMode Method

    Application SetUnhandledExceptionMode 方法 可以设置程序的一场处理 参数是一个 UnhandledExceptionMode 的枚举 参数值 说明 Automatic 将所有异常路由到 ThreadEx
  • Winform 编写一个读取并解析csv的程序

    众所周知 CSV是一种通用的 相对简单的文件格式 被用户 商业和科学广泛应用 所以在制作游戏时 可能会用到CSV来记录各个物品的数据 就像这样 ID Name Description ItemType 01 无机化学 第四版 风靡于各大高校
  • csharp:百度翻译

    参考 http api fanyi baidu com api trans product index http developer baidu com wiki index php title E5 B8 AE E5 8A A9 E6 9

随机推荐

  • Freertos-小车开发笔记 4 --遥控器开发

    目录 前言 xff1a 一 ADC DMA采集遥感的数据 二 串口3发送数据 三 wifi模块连接阿里云 前言 xff1a 遥控器开发采用的标准库编写 oled用于显示遥感的x y 值 一 ADC DMA采集遥感的数据 由于涉及到多个adc
  • Jmeter性能测试(12)--关联之正则表达式提取器

    如果有这样的情况 xff1a 一个完整的操作流程 xff0c 需要先完成某个操作 xff0c 获得某个值或数据信息 xff0c 然后才能进行下一步的操作 xff08 也就是常说的关联 将上一个请求的响应结果作为下一个请求的参数 xff09
  • qt-5串口与通讯

    文章目录 文章目录 一 串口通讯 二 实现串口通讯 1 在头文件中引入 QtSerialPort 类的两个头文件 xff08 必须引入 xff09 2 在工程文件中添加以下代码 3 在头文件中定义全局的串口对象 4 相关配置 5 通过一个按
  • qt-5数据库使用

    文章目录 目录 前言 一 所需要的头文件 二 数据库操作 1 addDatabase的函数原型如下 2 连接数据库 3 创建数据库表 4 插入数据到表中 5 更新表中的数据 总结 前言 例如 xff1a qt 5 创建数据库 xff0c 创
  • 利用MapReduce算法实现统计分析(单词统计,或者关键词统计)实验报告

    本文相关idea的代码出自 xff1a https blog csdn net weixin 38468167 article details 108658531 实验内容 xff1a 开发MapReduce算法 xff0c 实现统计分析
  • linux chomd 有何作用

    96 chmod 96 是 Linux 用来更改文件或目录权限的命令 它允许你控制文件和目录的访问权限 xff0c 决定文件 目录能否被用户读取 写入 执行的权限 具体说 xff0c chmod 可以更改 owner group 和 oth
  • 缓存同步-Canal

    目录 安装Canal 监听Canal 项目中对于canal的应用 应用场景 项目测试 场景 xff1a 缓存不是设置了有效期吗 xff0c 说明在有效期范围内数据是一直在的 xff0c 那么当数据库中的数据发送改变 xff0c 那么缓存还是
  • 对Redis布隆过滤器的实现

    目录 实现思路 首先最重要的自定义hash 然后就是将key放入bitSet 然后就是判断布隆过滤器bitSet数组中是否含有对应的key 代码 实现思路 39条消息 Redis布隆过滤器 Fairy要carry的博客 CSDN博客 首先最
  • fork()函数详解

    目录 1 基本了解 xff1a 2 fork函数的了解 xff1a 3 僵死进程 xff1a 4 fork和多线程 xff1a 1 多线程中某个线程调用 fork xff0c 子进程会有和父进程相同数量的线程吗 xff1f 2 父进程被加锁
  • 一阶线性自抗扰控制的整定

    摘要 线性自抗扰控制 linear active disturbance rejection control LADRC 是解决系统外部不可测扰动和内部未知不确定性的一种新型控制方法 其精髓是将系统的不确定性转化为一个可观测的状态 利用扩张
  • 单目视觉SLAM综述

    摘要 单目视觉SLAM因单目相机体积小 功耗低 信息获取丰富受到了广泛使用 为了深入分析单目视觉SLAM的优势 首先 简述单目视觉SLAM的基本原理 从特征点检测 相机姿态估计 选取关键帧 创建地图 地图及相机姿态优化 闭环检测等方面总结S
  • idea 修改 JDK 版本

    idea 修改 JDK 版本 第一步 xff1a 修改环境变量 xff08 修改成你需要的 JDK 版本 xff09 第二步 xff1a IDEA中的修改 导入Jdk进IDEA 第三步 xff1a 修改项目的sdk 第四步 xff1a 修改
  • Jmeter性能测试(13)--常见问题及解决方法

    jmeter作为一个开源的纯Java性能测试工具 xff0c 工作中极大的方便了我们进行接口 性能测试 xff0c 但使用过程中也遇到了很多的问题 xff0c 下面就记录一下自己遇到的问题 xff0c 后续会不断更新 1 获取日志 在使用j
  • C++的基础语法知识

    目录 一 认识C 43 43 1 如C语言 C 43 43 C Python等语言 xff0c 为什么会有这么多语言存在 xff1f 2 C 43 43 解决了什么问题 xff1f 3 什么是面向对象 xff1f 4 C 43 43 的特性
  • 基于遗传算法车辆路径问题(VRP)

    一 车辆路径问题简介与求解要求 交通运输是国民经济的动脉 xff0c 各种运输方式在日常运输营运管理工作中都要面对这样一个共同的问题 xff1a 如何为载运工具 汽车 xff0c 列车 xff0c 轮船和飞机 xff0c 统称为车辆 确定行
  • docker 安装(centos7虚拟机)

    Docker xff0c 翻译过来就是码头工人 Docker是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中 xff0c 然后发布到任何流行的Linux机器上 xff0c 也可以实现虚拟化 容器
  • java 死锁产生的四个必要条件

    1 互斥使用 xff0c 即当资源被一个线程使用 占有 时 xff0c 别的线程不能使用 2 不可抢占 xff0c 资源请求者不能强制从资源占有者手中夺取资源 xff0c 资源只能由资源占有者主动释放 3 请求和保持 xff0c 即当资源请
  • JS-数组和函数冒泡排序递归函数

    数组和函数 数组 计算数组中所有元素的和 span class token comment 定义数组 span span class token keyword var span nums span class token operator
  • Redis的Java客户端

    1 快速入门 Jedis使用的基本步骤 xff1a 1 引入依赖 2 创建Jedis对象 xff0c 建立连接 3 使用Jedis xff0c 方法名与Redis命令一致 4 释放资源 lt jedis依赖 gt lt dependency
  • Winform

    自适应窗口布局 OnLayout 窗口在尺寸变化时 会调用OnLayout方法 所以 在form1 cs文件里重写OnLayout方法即可实现自适应 在OnLayout方法中 我们获取一下窗口的宽度和高度 根据窗口的宽度和高度重新设定控件的