2010-06-21 99 views
0

我正在尋找在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將舉行lblCreatedDateLbllblCreatedDate

我寫了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 

回答

1

在UI中使用TableLayoutPanel。

然後,您可以將TableLayoutPanel停靠到窗體的中心(從而填充窗口)。

一旦你有了TableLayoutPanel,你可以配置行/列爲固定大小或總數的百分比。

然後,您將標籤(和其他UI控件)放置到TabelLayoutPanel中的單元格中,並將適當的Anchors/Docks設置爲控件在單元格中的位置。現在,當您調整窗口大小時,您的控件將根據您的TableLayoutPanel定義自動調整大小/移動。

+0

非常感謝你,這看起來好像是任務的邏輯控制。 一般來說,你會說嘗試在代碼中操縱UI的視覺方面是個壞主意嗎? (而不是在可能的情況下在設計師處理它。) – ObjectiveCat 2010-06-21 17:16:15

+1

@AndalusianCat - 兩者都不是完美的。設計師很好,但它可能會產生一些難看的代碼。我的建議是使用Designer來關閉事情,然後轉到代碼中,並使用鼓勵更好調整大小/流動的東西刪除醜陋的硬編碼值。 – 2010-06-21 17:18:58