【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
英文地址,請注明出處:http://en.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>…