[英]Issues dynamically arranging controls in vb.net
我正在尋找在Windows窗體應用程序中使用VB.net或VS2008中的C#在運行時動態安排標簽位置(或與此相關的任何控件)的最佳方法。
我有一個顯示用戶創建的消息的控件。 該控件有一個停靠在頂部的面板,其中包含每個消息的標題信息,稱為pnlHeader
有8個標簽:其中4個顯示靜態描述(例如,“到”,“從”,“創建日期”,“完成日期”),另外4個顯示這些描述的相關數據。 (在運行時從MS SQL 2005 DB傳入)。 靜態標簽的名稱為: lblCreatedDateLbl
,動態標簽的名稱為: lblCreatedDate
該應用程序可在各種大小和分辨率的監視器上運行,因此,我希望所有標簽根據面板的當前寬度在pnlHeader
以相等的間距排列。
最初,我只是在Designer中創建了標簽並使用了Anchors(標簽的一半設置為(頂部,左側),另一半設置為(頂部,右側))。 該解決方案適用於大多數情況,但並不總是提供一致的解決方案,因此我決定改為在代碼中添加控件。
我認為通過為每個對應的對創建一個面板會更容易使用標簽。 因此pnlCreatedDate
將保存lblCreatedDateLbl
和lblCreatedDate
我編寫了2種方法:1定義每個標簽並將其添加到相關面板: Sub AddLabels
,另一種方法確定面板的寬度並設置正確的位置: Sub SetLoc
當前, AddLabels
在InitializeComponent()
之后在構造函數中運行,並且在從數據庫傳遞數據之后調用SetLoc
。
我嘗試對width和size參數進行細微更改和調整,以啟用和禁用AutoSize,但是沒有任何方法返回一致的解決方案,而是所有描述標簽都放錯了位置,或者根本沒有出現,或者完全出現了亂碼。 如果我完全使用了錯誤的方法,請有人建議如何最好地處理此任務?
以下是我使用的方法。 我非常感謝您提供有關如何最有效地執行此操作的幫助。 我是一名新手程序員,但很想學習。 因此,任何幫助都將是很大的,對於這樣的基本問題和詳細說明,我深表歉意。
Private Sub AddLabels()
'Label Created By:'
lblCreatedByLbl.Location = New Point(0, 0)
lblCreatedByLbl.AutoSize = True
lblCreatedByLbl.Anchor = AnchorStyles.None
lblCreatedByLbl.ForeColor = Color.FromKnownColor(KnownColor.ControlDark)
lblCreatedByLbl.Font = New Font(New FontFamily("Microsoft Sans Serif"), 7, FontStyle.Bold, GraphicsUnit.Point)
lblCreatedByLbl.Text = "By:"
lblCreatedBy.Location = New Point((lblCreatedByLbl.Location.X + (lblCreatedByLbl.Width)), 0)
lblCreatedBy.AutoSize = True
lblCreatedBy.Anchor = AnchorStyles.None
lblCreatedBy.Text = "Source"
lblCreatedBy.ForeColor = Color.FromKnownColor(KnownColor.ControlDarkDark)
lblCreatedBy.Font = New Font(New FontFamily("Microsoft Sans Serif"), 7, FontStyle.Bold, GraphicsUnit.Point)
pnlCreatedBy.AutoSize = False
pnlCreatedBy.Controls.Add(lblCreatedByLbl)
pnlCreatedBy.Controls.Add(lblCreatedBy)
pnlCreatedBy.Anchor = AnchorStyles.None
'Label Target'
lblTargetLbl.Location = New Point(0, 0)
'... The same idea as above for each label'
End Sub
Private Sub SetLoc()
pnlCreatedBy.Width = lblCreatedByLbl.Width + lblCreatedBy.Width
pnlTarget.Width = lblTargetLbl.Width + lblTarget.Width
pnlCreateDate.Width = lblCreateDateLbl.Width + lblCreateDate.Width
pnlCompletedDate.Width = lblCompletedDateLbl.Width + lblCompletedDate.Width
Dim loc As Integer = 0
Dim x As Integer = (pnlHeader.Width - pnlCreatedBy.Width - pnlTarget.Width - pnlCreateDate.Width - pnlCompletedDate.Width) / 5
loc += x
pnlCreatedBy.Location = New Point(loc, 0)
loc += pnlCreatedBy.Width + x
pnlTarget.Location = New Point(loc, 0)
loc += pnlTarget.Width + x
pnlCreateDate.Location = New Point(loc, 0)
loc += pnlCreateDate.Width + x
pnlCompletedDate.Location = New Point(loc, 0)
loc += pnlCompletedDate.Width + x
pnlHeader.Controls.Add(pnlCreatedBy)
pnlHeader.Controls.Add(pnlTarget)
pnlHeader.Controls.Add(pnlCreateDate)
pnlHeader.Controls.Add(pnlCompletedDate)
pnlCreatedBy.BringToFront()
pnlTarget.BringToFront()
pnlCreateDate.BringToFront()
pnlCompletedDate.BringToFront()
End Sub
在用戶界面中使用TableLayoutPanel。
然后,您可以將TableLayoutPanel停靠在窗體的中心(從而填充Window)。
一旦有了TableLayoutPanel,就可以將行/列配置為固定大小或占總大小的百分比。
然后,將標簽(和其他UI控件)放入TabelLayoutPanel中的單元格中,並設置適當的“錨點/停靠點”,以設置該控件在單元格中的位置。 現在,當您調整窗口大小時,控件將根據TableLayoutPanel定義自動為您調整大小/移動。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.