【33】C# WinForm入门到精通 ——表格布局器TableLayoutPanel【属性、方法、事件、实例、源码】

  • WinForm 是 Windows Form 的简称,是基于 .NET Framework 平台的客户端(PC软件)开发技术,是 C# 语言中的一个重要应用。

  • .NET 提供了大量 Windows 风格的控件和事件,可以直接拿来使用。

  • 本专栏内容按照标题序号逐渐深入的,如有不懂的基础问题,可看前面教程

  • 在介绍属性的时候,会展示一些用法、代码、实例、截图这样看起来更清晰,免得直接看最后综合实例会有些懵

文章目录

  • 1 表格布局器TableLayoutPanel——属性
    • 1.1 Name、AllowDrop、AllowDrop
    • 1.2 AutoScroll
    • 1.3 AutoScrollMargin、AutoScrollMinSize
    • 1.4 AutoSize、AutoSizeMode
    • 1.5 GrowAndshrink、AutoSize
    • 1.6 BackColor、Backgroundlmage、BackgroundlmageLayout
    • 1.7 CausesValidation
    • 1.8 CellBorderStyle
    • 1.9 ColumnCount
    • 1.10 ColumnStyles
      • 10.4.1 绝对
      • 10.4.2 百分比
      • 10.4.3 自动调整大小
    • 1.11 ContextMenuStrip、Cursor、Dock、Enabled
    • 1.12 Font
    • 1.13 ForeColor
    • 1.14 GrowStyle
    • 1.15 AddColumns、AddRows
    • 1.16 Fixedsize
    • 1.17 Location、Locked、Margin、MaximumSize、MinimumSize、Modifiers、Padding
    • 1.18 RightToLeft
    • 1.19 RowCount
    • 1.20 RowStyles
    • 1.21 Size、TabIndex、TabStop、Tag、UseWaitCursor、Visible
  • 2 事件
  • 3 自定义TableLayoutPanel

1 表格布局器TableLayoutPanel——属性

我们在开发winform程序的过程中首先要知道在哪种情况下用哪种控件

那么我们什么时候使用TableLayoutPane呢?

当我们需要对父件进行分隔,并且按照指定的行数、列数进行分隔时,这时候优先考虑使用TableLayoutPanel控件

在这里插入图片描述

TableLayoutPanel的属性很多,下面一一介绍
在这里插入图片描述

1.1 Name、AllowDrop、AllowDrop

  • Name 用于获取控件对象
  • AllowDrop 指示用户是否可以拖动数据到Panel_上
  • Anchor 锚定控件对于父控件的位置

1.2 AutoScroll

AutoScrol为true时,指示控件尺寸大于子Pane时是否出现滚动条,该属性在TableLavoutPanel上起作用的前提是调用以下两个方法:

  tableLayoutPanel1.RowStyles.Clear();tableLayoutPanel1.ColumnStyles.Clear();

就像下面一个2*2的TableLayoutPanel,你可以理解成,他来是一个Panel,然后强制分成了4块,变成了2行2列,然后这4个部分(这里称之为子Panel),里面都可以放入控件,并且只能放入一个控件,比如我在每个子Panel中放入一个Buton,如下图:

通过属性BackColor可以更改控件的背景颜色
在这里插入图片描述
然后我在Form6的构造函数中加入以下代码

public Form6()
{InitializeComponent();tableLayoutPanel1.RowStyles.Clear();tableLayoutPanel1.ColumnStyles.Clear();
}

然后我在button1(tableLayoutPanel1左上角第一个Button)注册一个鼠标单击事件,在事件中改变buton1的大小,如下代码:

 private void button1_Click(object sender, EventArgs e){button1.Size = new Size(1000, 1000);}

运行之后,点击button1,会变大
在这里插入图片描述

1.3 AutoScrollMargin、AutoScrollMinSize

  • AutoScrollMargin
    该属性经过测试无效

  • AutoScrollMinSize

    • 假设以水平方向为例,该属性指的就是滚动条产生以后,从左边拉到最右边代表的最小控件宽度
    • 假设以垂直方向为例,该属性指的就是滚动条产生以后,从上边拉到最下边代表的最小控件高度:

该属性生效的前提是,以下代码必须先执行:

AutoScroll=true;
tableLayoutPanel1.RowStyles.Clear();
tableLayoutPanel1.ColumnStyles.Clear();

1.4 AutoSize、AutoSizeMode

  • AutoSize
    当子Panel中的控件尺寸大小改变时,TableLayoutPanel的大小是否也跟着改变

  • AutoSizeMode
    AutoSizeMode有效的前提是: AutoSize属性为true

1.5 GrowAndshrink、AutoSize

  • GrowAndshrink
    控件根据它的内容增大或缩小,也就是可大可小。
  • GrowOnly
    控件可以根据其内容任意增大,但不会缩小至小于它的 Size 属性值。只能增大,不能变小

1.6 BackColor、Backgroundlmage、BackgroundlmageLayout

  • BackColor
    改变背景色,可直接在属性窗口的箭头所指下拉框选择你想设置的颜色
    在这里插入图片描述

  • Backgroundlmage
    该属性用于设置TableLayoutPanel的背景图像

  • BackgroundlmageLayout
    属性用于设置TableLavoutPanel的背景图像的布局方式

1.7 CausesValidation

指示是否引发验证事件,一般情况下使用不到

1.8 CellBorderStyle

指示单元格边框样式,一共有7中样式

  • None 无边框。
  • Single 1 单行边框
  • Inset 单线凹陷边框
  • InsetDouble 双线凹陷边框
  • Outset 单线凸起边框。
  • OutsetDouble 双线凸起边框.
  • OutsetPartial 包含凸起部分的单线边框

七种样式的效果如下:
在这里插入图片描述

1.9 ColumnCount

设置TableLayoutPanel总共有多少列,下图中左图是2列,右图是3列
在这里插入图片描述

1.10 ColumnStyles

用于编辑所有列的属性,点击箭头所指的“三个点”就弹出一个编辑框,注意实际上在代码中不是Columns属性,而是ColumnStyles属性,如下图:
在这里插入图片描述
在这里插入图片描述
这上面弹出的窗体中我们做以下事情

  • 1 点击“添加”按钮来添加列

  • 2 点击“删除”按钮删除列
    鼠标左键选中列,就能点击“删除”按钮
    在这里插入图片描述

  • 3 点击“插入”按钮插入列

  • 4 设置该列的大小类型;列的大小类型有三种,分别如下:

10.4.1 绝对

绝对代表的是列的宽度是固定的,不论TableLavoutPane的宽度如何变化,该列的宽度也不改变,单位是像素从工具箱中拖四个Button到TableLayoutPanel中,并且将四Button的Dock唐性设置为Fill,如下图:
在这里插入图片描述
在这里插入图片描述
然后将Column1,也就是从左往右数第1列的类的大小类型设置为绝对,并且赋值为20像素;然后Clumn2也设置成绝对20。
在这里插入图片描述

运行软件以后,效果如下:

在这里插入图片描述
我们会发现第一列的宽度变成了绝对20,但是第二列不是绝对20,这是为啥呢?

这是因为TableLayoutPanel的总宽度是不变的,假设是100,TableLayoutPanel总共有两列,第一列已经设置为20了,虽然第二列也设置成20,但是这不符合实际情况,第二列宽度实际应该为总宽度100减去第一列的20=80,所以就相当于第二列设置的宽度实际上已经失效了所以对于列来说,

假设一共有5列,前四列的宽度已经设置好了大小,那么最后一列的宽度实际上是不需要设置的,系统会自动用总宽度减去其余列的宽度

10.4.2 百分比

百分比的意思是,该列的宽度占TableLayoutPanel总宽度的比重,总宽度是100%,如果设置成50%,就说明该列宽度等于总宽度的半,如下:
设置第一列的宽度为25%,第二列为绝对20,运行软件后,效果如下:
在这里插入图片描述
在这里插入图片描述

  • 我们会惊奇的发现,明明我设置了第一列为25%,按理说第一列应该为总宽度的1/4才对呀,这是为啥呢?

    这是因为我们设置的每个列的大小总的加起来要等于总列宽,比如假设总宽度为100,但是**第一列为25%(也就是25),第二列为绝对20,那么这两列宽度加起来等25+20=45,**这是不等于总宽度100的,所以这是无效的组合

    如果第二列为20,第一列我认为25%是无效的,实际上第一列是80,那么这两列的宽度加起来就等于100,

    这里就要注意系统的原则,系统认为绝对宽度优先级大于百分比宽度,比如刚才为什么不让第一列25%有效,第二列绝对20失效呢?而是让第二列绝对20有效,第一列25%失效了。这就是系统认为的优先让绝对宽度有效。

  • 那么我们如何让25%真的有效呢?
    那就需要我们自己组合每一列的宽度,比如第一列设置成25%,第二列我设置成75%,这样第一列和第二列加起来就等于100%(就是等这样的组合就是有效的,而不是依靠系统来自动决定哪些列宽度有效。效果如下:
    在这里插入图片描述
    在这里插入图片描述
    这样我们就发现第一列等于总宽度的25%,第二列等于总宽度的75%。

10.4.3 自动调整大小

我们可以将列的宽度设置成自动调整大小,这样系统就会根据子Panel中控件的实际大小来调整列的宽度,效果如下
在这里插入图片描述
在这里插入图片描述

1.11 ContextMenuStrip、Cursor、Dock、Enabled

  • ContextMenuStrip 鼠标右击时弹出的关联的上下文菜单
  • Cursor 鼠标移动到控件上显示的光标
  • Dock 停靠在父控件的位置
  • Enabled 是否启用该控件,false时事件都不能触发

1.12 Font

用于设置TableLayoutPanel中的子控件的Font属性,效果如下改变Font属性以后,会发现TableLayoutPanel中的四个Button的Font属性都改变了
在这里插入图片描述

1.13 ForeColor

前景色,也就是TableLayoutPanel中所有子控件的字体颜色,如下图:ForeColor为Red时,会发现TableLayoutPanel中的四个Button的Fore属性都改变了
在这里插入图片描述

1.14 GrowStyle

GrowStyle的作用是当你往TableLayoutPanel中添加控件时,当控件的数量超出TableLayoutPanel所能包合的子控件时,共有三种情况:

  • TableLayoutPanel是增加行数让让多余的控件包含到TableLayoutPanel、
  • 还是增加列数来让多余的控件包含到TableLayoutPanel、
  • 还是不允许添加多余的控件,

1.15 AddColumns、AddRows

  • AddColumns TableLayoutPanel 在已满之后自动增加列
    在这里插入图片描述
    假设这个TableLayoutPanel 为2行2列,然后如果我想使用"ctr +v"与贴一个button1到TableLavoutPanel中,则会多出一行
    在这里插入图片描述

  • AddRows TableLayoutPanel 在已满之后自动增加行
    在这里插入图片描述

    假设这个TableLayoutPanel 为2行2列,然后如果我想使用"ctr +v"与贴一个button1到TableLavoutPanel中,则会多出一行
    在这里插入图片描述

1.16 Fixedsize

TableLayoutPanel 在已满之后不允许获取其他行或列,并且抛出异常,如下图:假设这TableLayoutPanel 为2行2列,然后如果我想使用“ctr +V粘贴一个buton1到TableLayoutPanel 中,会弹出下面的窗体:
在这里插入图片描述
在这里插入图片描述

1.17 Location、Locked、Margin、MaximumSize、MinimumSize、Modifiers、Padding

  • Location 左上角的坐标相对于父控件左上角坐标的相对位置
  • Locked 是否锁住控件,从而控件不能移动也不能调整大小
  • Margin 相对于父控件一般是flowlayoutpanel、tablelayoutpanel的大小
  • MaximumSize 控制Panel最大尺寸
  • MinimumSize 控制Panel的最小尺寸
  • Modifiers 控件访问级别
  • Padding 控制TableLayoutPanel中子控件的字体和控件边框的间距,,一般都是0,可以控制和上下左右边缘的距离

1.18 RightToLeft

是否从右往左排列,效果如下图:
能看到button的排列顺序改成从右往左了
在这里插入图片描述

1.19 RowCount

设置行的数量,下图中的左图是2行,右图是3行
在这里插入图片描述

1.20 RowStyles

用于编辑所有行的属性,主要用于设置每一行占总高度的比例,其拥有的特性比如,绝对高度优先于百分比高度和列是相同的,参考ColumnStyles属性,并且对于添加子控件除了在设计器中添加外,同样也可以使用代码添加,例子如下:

	tableLayoutPanel1.BackColor = Color.Blue;//设置tableLayoutPanel1的背景颜色为蓝色Button[] buttons = new Button[] { new Button(), new Button(), new Button() };//声明一个buttons的集合,集合中有三个buttonbuttons.ToList().ForEach((item) => { item.Dock = DockStyle.Fill; item.BackColor = Color.LimeGreen; });//将所有button的Dock属性设置为DockStyle.Fill,将button的背景色设置为绿色tableLayoutPanel1.RowCount = 3;//设置tableLayoutPanel1一共有三行tableLayoutPanel1.RowStyles.Clear();//清除以前RowStyles的属性tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 33.3f));//添加第一行,行类型为百分比,大小为33.3%tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 33.3f));//添加第二行,行类型为百分比,大小为33.3%tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 33.4f));//添加第三行,行类型为百分比,大小为33.4%tableLayoutPanel1.Controls.Add(buttons[0], 0, 0);//将buttons集合中的的第一个button1添加到第0行0列的位置tableLayoutPanel1.Controls.Add(buttons[1], 0, 1);//将buttons集合中的的第一个button1添加到第1行0列的位置tableLayoutPanel1.Controls.Add(buttons[2], 0, 2);//将buttons集合中的的第一个button1添加到第2行0列的位置Button button1 = (Button)tableLayoutPanel1.GetControlFromPosition(0, 0);//获取第0行0列的控件button1.Text = "1";//设置Text属性为“1”button1 = (Button)tableLayoutPanel1.GetControlFromPosition(0, 1);//获取第1行0列的控件button1.Text = "2";//设置Text属性为“2”button1 = (Button)tableLayoutPanel1.GetControlFromPosition(0, 2);//获取第2行0列的控件button1.Text = "3";//设置Text属性为“3”

在这里插入图片描述

1.21 Size、TabIndex、TabStop、Tag、UseWaitCursor、Visible

  • Size 改变控件尺寸
  • TabIndex 控件在父控件上的索引
  • TabStop 对Panel貌似没什么作用,但是对于Button有作用
  • Tag 绑定数据使用
  • UseWaitCursor 控制控件及其子控件是否使用等待光标
  • Visible 是否显示控件

2 事件

  • AutoSizeChanged AutoSize属性改变时触发

  • BackColorChangedBackColor属性改变时触发

  • BackgroundlmageChangedBackgroundlmage改变时触发

  • CausesValidationChangedCausesValidation属性改变时触发

  • ChangeUlCues在显示或者隐藏聚焦框时或者键盘提示下划线触发

  • Click鼠标单击时触发

  • ClientSizeChangedClientSize属性改变时触发

  • ContextMenuStripChangedContextMenuStrip改变时触发

  • ControlAdded为Panel添加控件时触发

  • ControlRemoved将Panel中控件移除时触发

  • CursorChangedCursor属性改变时触发

  • CellPaint在重绘单元格时发生,这里的单元格就是我之前说的子Pane

  • DockChangedDock属性改变时触发

  • DoubleClick鼠标双击时触发

  • EnabledChangedEnable属性改变时触发

  • Enter用鼠标、Tab键等控制焦点有关

  • FontChangedFont属性改变时触发

  • ImeModeChangedImeMode属性值改变时触发

  • .Layout改变控件布局时发生,比如改变控件Size属性,使子控件显示、隐藏、添加、删除子控件,改变子控件的大小、位置时触发

  • Leave和用鼠标、Tab键等控制焦点有关

  • LocationChangedLocation属性改变时触发

  • MarginChangedMargin属性改变触发

  • MouseClick鼠标单击后触发

  • MouseDoubleClick鼠标双击后触发

  • MouseDown鼠标按下后触发

  • MouseEnter鼠标移动到控件的可见区域时触发

  • MouseHover鼠标在控件上方停留一段时间时触发

  • MouseLeave鼠标离开控件时触发

  • MouseMove鼠标在控件上移动时触发

  • MouseUp鼠标按钮按下以后,释放后触发

  • Move移动控件时触发,起始就是Location属性改变时触发

  • PaddingChangedPadding属性更改时触发

  • ParentChanged父控件更改时触发

  • PreviewKeyDown键盘按下之前触发

  • RegionChangedRegion属性改变时触发

  • ResizeSize属性改变时触发

  • RightToLeftChangedRightToLeft属性改变时触发

  • Scroll当TableLayoutPanel出现了滚动框时,用户移动拖动滚动框时触发,并且在Scrol事件中可以捕获到一些参数

  • SizeChangedSize属性改变时触发

  • StyleChanged貌似没什么用,也没有Style属性来更改

  • SystemColorsChanged不知道怎么触发该事件

  • TablndexChangedTablIndex改变时触发

  • TabStopChangedTabStop属性改变时触发

  • Validating
    当使用tab键、shift+tab键等控制焦点时,焦点触发的顺序是

    • Enter
    • GotFocus
    • Leave
    • Validating
    • Validated
    • LostFocus

    当使用鼠标控制焦点或者通过focus方法控制焦点时,焦点触发顺序如下

    • Enter
    • GotFocus
    • LostFocus
    • Leave
    • Validating
    • Validated
  • VisibleChangedVisible属性改变时触发

3 自定义TableLayoutPanel

 class MyTableLayoutPanel:TableLayoutPanel{protected override void OnCellPaint(TableLayoutCellPaintEventArgs e){base.OnCellPaint(e);Control c = this.GetControlFromPosition(e.Column, e.Row);if (c != null){Graphics g = e.Graphics;g.DrawRectangle(Pens.Red,e.CellBounds.Location.X + 1,e.CellBounds.Location.Y + 1,e.CellBounds.Width - 2, e.CellBounds.Height - 2);g.FillRectangle(Brushes.Blue,e.CellBounds.Location.X + 1,e.CellBounds.Location.Y + 1,e.CellBounds.Width - 2,e.CellBounds.Height - 2);};}}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uv使用教程

以下是使用 Python 包管理工具 uv 的常见命令指南。uv 是由 Astral(Ruff 的开发者)开发的高性能 Python 包安装器和解析器,旨在替代 pip 和 pip-tools: 1. 安装 uv uv官网仓库 # Linux/macOS curl -Ls https://astral.sh/uv/in…

SpringBoot3.x入门到精通系列:1.1 简介与新特性

SpringBoot 3.x 简介与新特性 📖 什么是SpringBoot SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。SpringBoot集成了大量常用的第三方库配置,SpringBoot应用中这些第三方库几乎可以零配…

二、搭建springCloudAlibaba2021.1版本分布式微服务-Nacos搭建及服务注册和配置中心

nacos介绍 1、Nacos简介 Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、…

浅谈物联网嵌入式程序开发源码技术方案

在物联网蓬勃发展的时代,嵌入式程序作为连接硬件与软件的桥梁,发挥着至关重要的作用。以“边缘智能 云协同”为核心,为工业、医疗、家居、农业、智慧城市五大场景提供稳定、低功耗、可扩展的物联网终端与平台一体化解决方案。以下董技叔软件…

【笔记】重学单片机(51)

为学习嵌入式做准备,重新拿起51单片机学习。此贴为学习笔记,仅记录易忘点,实用理论基础,并不是0基础。 资料参考:清翔零基础教你学51单片机 51单片机学习笔记1. C语言中的易忘点1.1 数据类型1.2 位运算符1.3 常用控制语…

C++现代Redis客户端库redis-plus-plus详解

🚀 C现代Redis客户端库redis-plus-plus详解:告别繁琐的hiredis,拥抱现代C的Redis操作 📅 更新时间:2025年07月28日 🏷️ 标签:C | Redis | redis-plus-plus | 现代C | 后端开发 文章目录&#x…

Redis存储原理与数据模型(上)

一、Redis数据模型 1.1、查看Redis数据定义: typedef struct redisDb {kvstore *keys; /* The keyspace for this DB 指向键值存储的指针,用于快速访问和修改数据库中的键值对*/kvstore *expires; /* Timeout of keys with a t…

视频生成模型蒸馏的方法

1.fastvideo https://github.com/hao-ai-lab/FastVideohttps://github.com/hao-ai-lab/FastVideo Distillation support Recipes for video DiT, based on PCM. Support distilling/finetuning/inferencing state-of-the-art open video DiTs: 1. Mochi 2. Hunyuan. 2.l

【mysql】—— mysql中的timestamp 和 datetime(6) 有什么区别,为什么有的地方不建议使用timestamp

在 MySQL 中,TIMESTAMP 和 DATETIME(6) 都是用于存储日期和时间的数据类型,但它们在存储范围、时区处理、存储方式等方面有显著区别。 1. 核心区别对比 特性 TIMESTAMP DATETIME(6) 存储范围 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC(受限于 32 位时间戳) 1000…

前端下载文件相关

1、下载 ‘Content-Type‘: ‘application/octet-stream‘ 的文件 当后端返回的响应头中 Content-Type 为 application/octet-stream 时,表示这是一个二进制流文件,浏览器无法直接展示,需要前端处理后下载到本地。 通过请求获取二进制数据…

代码随想录算法训练营第五十六天|动态规划part6

108.冗余连接 题目链接&#xff1a;108. 冗余的边 文章讲解&#xff1a;代码随想录 思路&#xff1a; 题意隐含 只有一个冗余边 #include <iostream> #include <vector> using namespace std; int n1001; vector<int>father(n,0);void init(){for(int i0;…

智能体通信协议

智能体通信协议A2AACPANPAgoraagents.jsonLMOSAITPA2A A2A官方文档&#xff1a;https://www.a2aprotocol.net/docs/introduction 开源代码和详细规范&#xff1a;https://github.com/google/A2A ACP ACP官方文档&#xff1a;https://acp.agentunion.cn ANP ANP官方文档&am…

QT交叉编译环境配置

QT交叉编译环境配置1 配置交叉编译工具链1.1 解压 放到/opt中1.2 使用环境变量1.2.1 设置成永久的环境变量1.2.2 临时环境变量1.3 安装编译需要的软件2 编译tslib库&#xff08;如果不需要触摸屏直接跳过&#xff09;3. 编译qt3.1 编译源码3.2 设置QCreator4 说明4.1 关于编译器…

【Android】【Java】一款简单的文本/图像加解密APP

写在前面 之前写过一篇博客,名为《【Java编程】【计算机视觉】一种简单的图片加/解密算法》,介绍了用Java在电脑上对图片进行简单的加密和解密操作,见链接: 文章链接 但是,文中所描述的算法在实际操作当中,存在严重的噪音(图像失真)的问题(且原因不明),本次经笔者研…

技术笔记 | Ubuntu 系统 OTA 升级全流程详解

前言&#xff1a;在嵌入式系统设备管理中&#xff0c;OTA&#xff08;Over-The-Air&#xff09;升级是实现设备远程维护、功能迭代的核心能力。本文基于 Ubuntu 系统环境&#xff0c;详细拆解 updateEngine 工具的 OTA 升级方案&#xff0c;从配置开启、命令使用到实战案例与问…

重复请求问题

重复请求问题 使用Promise和AbortController来实现思路是&#xff1a;通过在会话缓存中存储和比较请求信息&#xff0c;来防止用户在短时间内重复提交相同的请求。 具体思路如下&#xff1a; 存储请求信息&#xff1a;每次请求时&#xff0c;将请求的相关信息&#xff08;如URL…

CentOS7 Docker安装RocketMQ完整教程

目录 前言 环境准备 系统要求 检查Docker状态 创建网络和目录 创建Docker网络 创建数据目录 安装NameServer 启动NameServer容器 参数说明 验证NameServer启动 安装Broker 创建Broker配置文件 启动Broker容器 参数说明 验证Broker启动 安装管理控制台 启动控制…

main函数,常量指针与指针常量,野指针等,void与void的区别

指针&#xff08;续&#xff09; main函数原型 定义 main函数有多种定义格式&#xff0c;main函数也是函数&#xff0c;函数相关的结论对main函数也有效。 main函数的完整写法&#xff1a;int main(int argc, char *argv[]){..}int main(int argc, char **argv){..}扩展写法&am…

Mac m系列芯片安装node14版本使用nvm + Rosetta 2

由于苹果 M 系列芯片&#xff08;包括 M4&#xff09;使用的是 ARM 架构&#xff0c;而 Node.js 14 是在英特尔 x86 架构时代发布的&#xff0c;因此在 M 系列 Mac 上安装 Node.js 14 可能会遇到兼容性问题 解决方法&#xff1a;使用 nvm Rosetta 2右键点击「终端」→「显示简…

前端基础之《Vue(26)—Vue3两种语法范式》

一、选项式1、HTML写法<!-- 跟 Vue 说 Hello World&#xff01; --><script type"module"> import { createApp } from vuecreateApp({data() {return {message: Hello World!}} }).mount(#app) </script><div id"app"><h1>…