簡體   English   中英

在vb.net中動態安排控件的問題

[英]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將保存lblCreatedDateLbllblCreatedDate

我編寫了2種方法:1定義每個標簽並將其添加到相關面板: Sub AddLabels ,另一種方法確定面板的寬度並設置正確的位置: Sub SetLoc

當前, AddLabelsInitializeComponent()之后在構造函數中運行,並且在從數據庫傳遞數據之后調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM