-
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屬性改變時觸發 -
BackColorChanged
BackColor屬性改變時觸發 -
BackgroundlmageChanged
Backgroundlmage改變時觸發 -
CausesValidationChanged
CausesValidation屬性改變時觸發 -
ChangeUlCues
在顯示或者隱藏聚焦框時或者鍵盤提示下劃線觸發 -
Click
鼠標單擊時觸發 -
ClientSizeChanged
ClientSize屬性改變時觸發 -
ContextMenuStripChanged
ContextMenuStrip改變時觸發 -
ControlAdded
為Panel添加控件時觸發 -
ControlRemoved
將Panel中控件移除時觸發 -
CursorChanged
Cursor屬性改變時觸發 -
CellPaint
在重繪單元格時發生,這里的單元格就是我之前說的子Pane -
DockChanged
Dock屬性改變時觸發 -
DoubleClick
鼠標雙擊時觸發 -
EnabledChanged
Enable屬性改變時觸發 -
Enter
用鼠標、Tab鍵等控制焦點有關 -
FontChanged
Font屬性改變時觸發 -
ImeModeChanged
ImeMode屬性值改變時觸發 -
.
Layout
改變控件布局時發生,比如改變控件Size屬性,使子控件顯示、隱藏、添加、刪除子控件,改變子控件的大小、位置時觸發 -
Leave
和用鼠標、Tab鍵等控制焦點有關 -
LocationChanged
Location屬性改變時觸發 -
MarginChanged
Margin屬性改變觸發 -
MouseClick
鼠標單擊后觸發 -
MouseDoubleClick
鼠標雙擊后觸發 -
MouseDown
鼠標按下后觸發 -
MouseEnter
鼠標移動到控件的可見區域時觸發 -
MouseHover
鼠標在控件上方停留一段時間時觸發 -
MouseLeave
鼠標離開控件時觸發 -
MouseMove
鼠標在控件上移動時觸發 -
MouseUp
鼠標按鈕按下以后,釋放后觸發 -
Move
移動控件時觸發,起始就是Location屬性改變時觸發 -
PaddingChanged
Padding屬性更改時觸發 -
ParentChanged
父控件更改時觸發 -
PreviewKeyDown
鍵盤按下之前觸發 -
RegionChanged
Region屬性改變時觸發 -
Resize
Size屬性改變時觸發 -
RightToLeftChanged
RightToLeft屬性改變時觸發 -
Scroll
當TableLayoutPanel出現了滾動框時,用戶移動拖動滾動框時觸發,并且在Scrol事件中可以捕獲到一些參數 -
SizeChanged
Size屬性改變時觸發 -
StyleChanged
貌似沒什么用,也沒有Style屬性來更改 -
SystemColorsChanged
不知道怎么觸發該事件 -
TablndexChangedTablIndex
改變時觸發 -
TabStopChangedTabStop
屬性改變時觸發 -
Validating
當使用tab鍵、shift+tab鍵等控制焦點時,焦點觸發的順序是- Enter
- GotFocus
- Leave
- Validating
- Validated
- LostFocus
當使用鼠標控制焦點或者通過focus方法控制焦點時,焦點觸發順序如下
- Enter
- GotFocus
- LostFocus
- Leave
- Validating
- Validated
-
VisibleChanged
Visible屬性改變時觸發
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);};}}