使用美化方法设计嵌入的子窗体(三)

使用美化方法设计嵌入的子窗体

分析效果图的实现

效果图:
在这里插入图片描述

新建 Windows 窗体

  • 新窗体命名:FrmAddProduct.cs
  • 修改窗体的 Text 属性:新增商品
  • 修改窗体的位置:StartPosition:CenterScreen
  • 窗体的无边框设计:FormBorderStyle:none
  • 修改窗体的大小:Size:1047*640(尽量先设置无边框再设置大小,因为去边框会影响窗体大小)
  • 修改窗体的背景颜色:BackColor:#EEFEFF

处理上半部分

  • 拖拽一个 Label,设置 Text 属性:当前位置:新增商品;Font 属性:微软雅黑;
  • 拖拽一个 Label,删除 Text 属性;AutoSize 属性:false;添加边框 BorderStyle 属性:Fixed3D;设置大小 Size:1047*1
  • 保存到数据库按钮
  • 关闭窗口按钮

基本信息

其他常见控件的使用自行设计,这里直接跳过了。

下拉列表框有两种实现方式:ListView 和 Combobox

请从分类列表中选择:ListView

  • 复制一个上面制作好的按钮,修改 Text:请从分类列表中选择;修改背景颜色 BackColor:#0099DC;
  • 点击按钮出现下拉列表:拖拽一个 Panel 调整大小放到按钮的下面
  • 再拖拽一个 ListView(其实一个它也行,但有时候想再放些其他内容,所以上面拖拽了个容器 Panel)放到 Panel 上;调整 Dock 属性:fill;

ps:Panel 如果有一部分超出 GroupBox 被裁剪切割掉的话怎么处理:
单独把 Panel(包含 ListView)放到 GroupBox 外面,不让它成为 GroupBox 的子控件;然后把 GroupBox 先移到其它地方。这个时候,把 Panel(包含 ListView) 放到刚才想放到的地方,再把 GroupBox 移回去。这个时候会发现,Panel(包含 ListView) 被 GroupBox 盖住了,右键选择 GroupBox:置为底层 就可以了。

下拉列表框:Combobox

  • 拖拽一个 ComboBox 控件,修改 DropDownStyle 属性:DropDownList(这个只能选择不能输入,DropDown 既能输入又能下拉选择);FlatStyle:Flat;设置背景色 BackColor:#00AEC2(如果设置完之后可能只显示一圈的背景色,像边框一样,没关系,运行的时候就好了。或者切换下 DropDownStyle 属性 也能正常显示背景色了);

其他窗口布局自行实现。

ListView 具体实现

先选中 ListView 的 Panel 控件,修改 Visible 属性:False;先隐藏 Panel,通过点击按钮控制显示和隐藏。

添加标题:

  • 点击右上角的箭头,点击编辑列
    在这里插入图片描述

    在这里插入图片描述

  • 此时 ListView 中还是一片空白,不能显示这些标题,在视图这里选择 Details
    在这里插入图片描述

  • 显示网格;此时,表格只是一片空白,可以在属性面板中设置,显示网格,如下图
    在这里插入图片描述

  • 点击右上角的箭头,点击编辑项
    在这里插入图片描述

    在这里插入图片描述

  • 或者代码添加数据到表格中(项)

    private void Button_Test_Click(object sender, EventArgs e)
    {
        //数据更新,UI暂时挂起,直到EndUpdate绘制控件,可以有效避免闪烁并大大提高加载速度
        listView1.BeginUpdate();
        //添加5行数据
        for (int i = 0; i < 5; i++)   
        {
            ListViewItem lvitem = new ListViewItem();
            lvitem.SubItems[0].Text = i.ToString();
            lvitem.SubItems.Add("姓名"+i.ToString());
            lvitem.SubItems.Add("年龄" + i.ToString());
            lvitem.SubItems.Add("地址" + i.ToString());
            lvitem.SubItems.Add("生日-" + i.ToString());
            listView1.Items.Add(lvitem);
        }
        //结束数据处理,UI界面一次性绘制。
        listView1.EndUpdate(); 
    }
    

代码实现选择内容赋值到 TextBox 上:

// 关闭窗口
private void btnClose_Click(object sender, EventArgs e)
{
    this.Close();   
}

// 请从分类列表中选择
private void BtnSelectKind_Click(object sender, EventArgs e)
{
    if (this.panelSelectKind.Visible)
    {
        this.panelSelectKind.Hide();
    }
    else
    {
        this.panelSelectKind.Show();
    }
}

// ListView 选择的索引发生改变
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    // 在此处设断点,发现点击不同的Item后,此事件居然执行了2次 
    // 第一次是取消当前Item选中状态,导致整个ListView的SelectedIndices变为0
    // 第二次才将新选中的Item设置为选中状态,SelectedIndices变为1
    // 如果不加listview.SelectedIndices.Count>0判断,将导致获取listview.Items[]索引超界的异常
    if (this.listView1.SelectedIndices != null && this.listView1.SelectedIndices.Count > 0)
    {
        // 获取第一列的内容
        this.tbKind.Text = this.listView1.Items[this.listView1.SelectedIndices[0]].Text;
        // 获取第一列子项的内容
        // this.tbKind.Text = this.listView1.Items[this.listView1.SelectedIndices[0]].SubItems[2].Text;
        this.panelSelectKind.Hide();
    }
}
// ListView 点击了列
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
    // 点击列标题是可以获取列号
    Console.WriteLine(e.Column);
}

comboBox 具体实现

  • MaxDropDownltems:在下拉列表中显示的最多项数(超出的将滚动显示)。默认设置无效,还是拉长了 comboxBox 的高度,全部显示了。是因为 IntegralHeight 属性(指示组合框是否应调整大小以避免显示部分项)的默认值是 true,改为 False 即可。
  • 通过 Items 属性来给 comboBox 设置下拉内容

嵌入子窗体的实现

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

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

    #region 关闭已有窗体,嵌入新的窗体
    // 关闭已有窗体
    private void CloseForm()
    {
        // 首先判断当前容器中是否已经存在窗体
        foreach (Control item in this.splitContainer1.Panel2.Controls)
        {
            if (item is Form)
            {
                Form form = (Form)item;
                form.Close();
            }
        }
    }

    // 添加新的窗体
    private void addNewForm(Form form)
    {
        // 将子窗体设置成非顶级窗体
        form.TopLevel = false;
        // 让子窗体最大化显示
        form.WindowState = FormWindowState.Maximized;
        // 或者设置填充模式(跟上面功能一样)
        // form.Dock = DockStyle.Fill
        // 设置窗体的边框为:None(去掉窗体的边框)
        form.FormBorderStyle = FormBorderStyle.None;
        // 设置窗体的父容器(指定子窗体显示的容器)
        form.Parent = this.splitContainer1.Panel2;
        form.Show(); // add.Close();
    }
    #endregion
    // 打开新增商品子窗体
    private void btnAddproduct_Click(object sender, EventArgs e)
    {
        CloseForm();
        addNewForm(new FrmAddProduct());
    }
    // 打开商品信息子窗体
    private void button2_Click(object sender, EventArgs e)
    {
        CloseForm();
        addNewForm(new FrmProductInfo());
    }
}

在子窗体中打开其他子窗体

比如:需要在商品信息子窗体中打开新增商品子窗体,那么就需要用到使用委托和事件

在 FrmProductInfo.cs 写代码:

// 定义一个委托
public delegate void addNewProduce(object sender, EventArgs e);

public partial class FrmProductInfo : Form
{
    // 定义一个委托事件
    public event addNewProduce anp;

    public FrmProductInfo()
    {
        InitializeComponent();
    }

    private void btnAddPro_Click(object sender, EventArgs e)
    {
        anp(sender, e);
    }
}

修改 FrmMain.cs 中的代码:

// 打开商品信息子窗体
private void button2_Click(object sender, EventArgs e)
{
    CloseForm();
    FrmProductInfo frmPI = new FrmProductInfo();
    frmPI.anp += this.btnAddproduct_Click;
    addNewForm(frmPI);
}

工程示例

BeautyWinForm

作业

实现 商品信息 窗口的布局
在这里插入图片描述

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

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

相关文章

拼多多容器文件修改自动上传

拼多多开放平台php环境是官方的linux容器&#xff0c;不能自己搭建ftp上传文件&#xff0c;每每有文件更新都挺麻烦。 有些功能测试不想每次都打包全部代码上去重新发布一次程序生成新的容器&#xff0c;那样太过麻烦和效率低。 一开始搞了一个php的文件管理工具上去&#xf…

电压比较器LM339介绍和仿真

电压比较器LM339介绍和仿真 &#x1f4d1;LM339相关特性 工作电源电压范围宽&#xff0c;单电源、双电源均可工作&#xff0c;单电源&#xff1a; 2&#xff5e;36V&#xff0c;双电源&#xff1a;1&#xff5e;18V&#xff1b;消耗电流小&#xff0c; Icc1.3mA&#xff1b;输…

《Kubernets证书篇:基于Kylin V10+ARM架构CPU修改K8S 1.26.15版本证书时间限制》

一、背景 Kubernetes 默认的证书有效期只有1年&#xff0c;因此需要每年手动更新一次节点上面的证书&#xff0c;特别麻烦而且更新过程中可能会出现问题&#xff0c;因此我们要对 Kubernetes 的 SSL 证书有效期进行修改&#xff0c;这里将证书的时间限制修改为100年。 环境信息…

【日常记录】【JS】styled-components库的原理,模板字符串调用函数

文章目录 1、引言2、模板字符串调用函数3、实现 1、引言 在react 中&#xff0c;styled-components 是最流行的 css in js 模式的库 2、模板字符串调用函数 let stu {name: 呆呆狗,age: 30,address: 中国}let str fn你好${stu.name}今年${stu.age}岁,来自${stu.address}这样会…

MySql 安装,小白也可以学会成功安装的保姆级教程

MySql 安装 文章目录 MySql 安装1.Mysql下载1.1 访问下载链接1.2 选择合适版本1.3 下载安装包 2.MySql安装3.安装成功检测验证3.1 mysql自带控制台验证3.2 win系统控制台进入验证 4. mysql 配置path5. navicat 连接 mysql 1.Mysql下载 1.1 访问下载链接 MySQL Downloads 这里…

计算机网络----第十六天

OSPF基础 RIP的缺陷&#xff1a; 最大16跳不可达&#xff1b; 收敛速度慢&#xff1b; 协议会产生路由自环 每发一次路由更新&#xff0c;就将自己的全部路由信息发送出去&#xff1b; OSPF&#xff1a; 含义&#xff1a;ospf&#xff08;最短路径优先&#xff09;&…

【Github】一个用于Active Directory的自助密码更改工具

在众多企业的日常运营中&#xff0c;Active Directory&#xff08;AD&#xff09;扮演着核心角色&#xff0c;负责管理和维护员工账户。然而&#xff0c;密码重置作为IT支持团队的常规工作之一&#xff0c;往往既耗时又繁琐。虽然一些商业解决方案和通过Windows服务器上RDS服务…

航芯通用MCU技术常见问题 | F4专题

日常工作中&#xff0c;我们的销售或技术工程师经常会收到来自用户的问题&#xff0c;其中一些问题是比较常见的&#xff0c;所以为满足日常用户对航芯产品使用及服务的了解&#xff0c;航芯特此推出“通用MCU技术常见问题”专题&#xff0c;分为F0专题及F4专题&#xff0c;欢迎…

内网穿透是什么意思?快解析如何实现内网穿透

在家里或者公司&#xff0c;我们常常会使用路由器来连接网络&#xff0c;以便我们能够上网学习和工作&#xff0c;但有时候使用起来真的不方便。有的时候我们在外面&#xff0c;想访问家里或者公司内部的设备&#xff0c;就会碰到一个问题&#xff1a;我们无法直接通过公网IP访…

【LeetCode: 3117. 划分数组得到最小的值之和 + 动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【C语言】<结构体>C中的自定义类型之struct

&#xff1c;结构体&#xff1e; 1. 结构体类型的声明1.1 结构体回顾1.1.1 结构体的声明1.1.2 结构体变量的创建和初始化 1.2 结构体的特殊声明1.3 结构体的自引用 2. 结构体内存对齐2.1 对齐规则2.2 为什么存在内存对齐&#xff1f;2.3 修改默认对齐数 3. 结构体传参4. 结构体…

SD-WAN提升企业网络体验

在现代企业中&#xff0c;网络体验已成为提升工作效率与业务质量的关键因素。SD-WAN技术的出现&#xff0c;以其独特的优势&#xff0c;为企业提供了优化网络连接、加速数据传输、提升服务质量和应用访问体验&#xff0c;以及增强网络稳定性的解决方案。接下来&#xff0c;我们…

Vue3(四):Pinia

一、Pinia介绍 Pinia是一个专门为Vue.js设计的状态管理库&#xff0c;它提供了一种简单和直观的方式来管理应用程序的状态。在使用Pinia时&#xff0c;可以轻松地创建定义状态的存储&#xff0c;然后将其与Vue组件绑定&#xff0c;使它们能够使用该状态。和上一个博客提到的Vu…

外网如何访问内网数据库?

在当今信息时代&#xff0c;随着互联网的快速发展&#xff0c;很多企业和个人都面临着外网访问内网数据库的需求。外网访问内网数据库可以实现远程操作&#xff0c;方便用户在任何地点使用移动设备进行数据管理和查询。本文将介绍一种名为【天联】的组网产品&#xff0c;它是一…

Sublime Text下载,安装,安装插件管理器,下载汉化插件

SublimeTest官网 © Sublime Text中文网 下载安装 一路点击安装即可 安装插件管理器 管理器官网安装 - 包控制 (packagecontrol.io) 手动安装将3 位置点击网址下载 再打开SublimeTest 点击 选择第一个Browse Packages..... 将会跳转到文件夹中 进入上一个文件夹 在进入…

使用剧本批量部署rsync服务端实战

目录 1、实战部署 编写剧本 执行剧本测试&#xff01;&#xff01;&#xff01; 2、部署方式对比 1、实战部署 编写剧本 执行剧本测试&#xff01;&#xff01;&#xff01; 2、部署方式对比 ansible模块实战-部署rsync服务端-CSDN博客 ansible临时命令和playbook区别 …

UE5 C++ TimeLine 时间轴练习

一. Actor引入头文件 #include "Components/TimelineComponent.h" 声明CurveFloat 和 TimelineComponent UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyCurve")UCurveFloat* MyCurveFloat;UPROPERTY(EditAnywhere, BlueprintReadWrite, Cate…

北漂程序员整理:2024年阿里云服务器租用优惠价格表

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

逻辑卷和磁盘配额

文章目录 一、逻辑卷二、磁盘配额 一、逻辑卷 为什么会出现技术&#xff1f; 分区的缺点&#xff1a; 没有备份功能无法扩容性能取决于硬盘本身 相关概念 LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。…

【深度学习】深度学习md笔记总结第5篇:神经网络与tf.keras,学习目标【附代码文档】

深度学习笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;深度学习课程&#xff0c;深度学习介绍要求,目标,学习目标,1.1.1 区别,学习目标,学习目标。TensorFlow介绍&#xff0c;2.4 张量学习目标,2.4.1 张量(Tensor),2.4.2 创建张量的指令,2.4.3 张量…