我正在尋找在VS2008中使用VB.net或C#在Windows窗體應用程序中運行時動態安排標籤位置(或任何控件)的最佳方式。在vb.net中動態安排控件的問題
我有一個顯示用戶創建的消息的控件。 這種控制有停靠在其保持針對每個消息中的報頭信息的頂部的面板,稱爲pnlHeader
有8個標籤:其中 4顯示靜態描述(例如「到」,「從」,「創建日期「,」完成日期「) 另外4個顯示這些描述的相關數據。 (在運行時從MS SQL 2005 DB傳入)。 靜態標籤被命名爲:lblCreatedDateLbl
和動態的:lblCreatedDate
應用程序運行於不同尺寸和分辨率的顯示器,爲此我想對所有的標籤將自己與pnlHeader
等間距根據當前寬度安排,的面板。起初,我只是在Designer中創建了標籤,並使用了Anchors(一半標籤設置爲(Top,Left),另一半設置爲(Top,Right))。該解決方案適用於大多數場景,但並不總是提供一致的解決方案,因此我決定將代碼添加到代碼中。
我認爲通過爲每個相應的對創建面板來處理標籤會更容易。所以pnlCreatedDate
將舉行lblCreatedDateLbl
和lblCreatedDate
我寫了2種方法: 1定義每個標籤,並將其添加到相關面板:Sub AddLabels
,另一個確定面板的寬度,並設置正確的位置:Sub SetLoc
目前,AddLabels
在數據從數據庫傳入後調用InitializeComponent()
和SetLoc
後在構造函數中運行。
我試過對寬度和大小參數進行微小的更改和調整,啓用和禁用AutoSize,但沒有返回一致的解決方案,而是要麼所有的描述標籤都放錯了位置,要麼完全不顯示或完全不顯示地點出現。如果我完全使用錯誤的方法,是否有人可以建議如何最好地處理此任務?
以下是我使用的方法。我非常感謝任何幫助如何最有效地執行此操作。我是一位newb編碼員,但很想學習。所以任何幫助都會很棒,我爲這樣一個基本的問題和長時間的描述事先道歉。
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
非常感謝你,這看起來好像是任務的邏輯控制。 一般來說,你會說嘗試在代碼中操縱UI的視覺方面是個壞主意嗎? (而不是在可能的情況下在設計師處理它。) – ObjectiveCat 2010-06-21 17:16:15
@AndalusianCat - 兩者都不是完美的。設計師很好,但它可能會產生一些難看的代碼。我的建議是使用Designer來關閉事情,然後轉到代碼中,並使用鼓勵更好調整大小/流動的東西刪除醜陋的硬編碼值。 – 2010-06-21 17:18:58