2015-06-25 88 views
1

我試圖建立一個使用Winform的應用程序UI,其中將有多個頁面。說軟件將啓動時要求登錄憑據,然後登陸儀表板。然後用戶將可以選擇不同的頁面,如:Page1 - Page2 - Page3。Winform爲一個表單下的不同頁面Winform多個Usercontrols

現在我打算做一個表單,所有這些頁面將分開UserControls。根據要求,我將改變這些UserControls的可見性。

現在要做到這一點,我把下面的代碼裏面Form1.cs的

ControlLogin ucLogin = new ControlLogin(); 
    ucLogin.Location = new System.Drawing.Point(12, 67); 
    this.Controls.Add(ucLogin); 

這工作得很好。但是,當從這個ControlLogin.cs打開任何UserControl時,我將如何將新的UserControl(比如說Page1Control)添加到Form1的列表中?

+0

RAD方式是使用[TabControl without tabs](http://stackoverflow.com/a/2798241/17 034)。 –

+0

您只需要在用戶控件中對錶單進行引用。以一種簡單的,通用的方式,你已經做了'button_loadStuff_Click(..){Form myParent = this.Parent; NextPage nextPage = new NextPage(); myParent.Controls.Add(nextPage);}'對於更多pwerful引用,您需要將其聲明爲類型實際,默認情況下稱爲「Form1」。有了這個,你也可以訪問表格中的所有(公共)字段.. – TaW

回答

1

您需要爲您的頁面開發一些事務邏輯。我建議您在主窗體上使用面板作爲容器。在此容器中,您將放置當前用戶控件,即用戶選擇的控件。

例如:

internal void ReplaceUserPage(Control container, UserControl userRequest) 
{ 
    if (container.Controls.Count == 1) 
    { 
     container.Controls.RemoveAt(0); 
    } 
    container.Controls.Add(userRequest); 
    userRequest.Dock = DockStyle.Fill; 
} 

如果沒有動態頁面,你可以讓所有的人單身。這樣,每個實例將按需創建並存儲在內存中,隨時可以重用。所以,當用戶點擊菜單或按鈕打開頁面上,你可以做

UserControl requested = Page1Control.GetInstance(); 
ReplaceUserPage(container, requested); 

隨着單身,你甚至都不需要保持你的控制列表。我並不是說這是最好的或者完美的或者一勞永逸的方式。有很多控制交易方法。這取決於系統的複雜性和其他因素。

+0

我明白你的單身概念,我最初的計劃也是這樣做的。讓我今晚進入這個項目。之後會回覆評論。感謝分享。 – hypheni

1

您選擇的基本佈局對我來說看起來很好。

您的實際問題似乎是:如何從這些UCs引用表單?

這與以下問題密切相關:如何從其他表單中引用表單或部分表單?這已被要求在這裏經常..

這裏是我建議你應該做的:

  1. 打開每個UCS openLoginopenPageOne的創建一個公共職能..的
  2. 變化建設者每個UC包括Form1作爲參數(假設您的表單具有默認名稱),並按如下方式調用它:ControlLogin ucLogin = new ControlLogin(this);
  3. 在UCs構造函數中,您希望將傳入的表單存儲在類變量中。

在表單中這樣寫:

public void openLogin(Form1 f) 
{ 
    ControlLogin ucLogin = new ControlLogin(this); 
    ucLogin.Location = new System.Drawing.Point(12, 67); 
    this.Controls.Add(ucLogin); 
} 


public void openPageOne(Form1 f) 
{ 
    .. 
} 

而在UC(S):

public ControlLogin(Form1 form1) 
{ 
    InitializeComponent(); 
    mainForm = form1; 
} 

Form1 mainForm = null; 

現在,您可以參考表格中的所有公共字段和方法,也許這樣的

if (logingIsOK) mainForm.openPageOne(); 
+0

感謝分享。這是我正在尋找的。現在,在這之上你可以指導我更多..也就是說,我打算實施一些分組機制,這將是這樣的..每個組可以有多個頁面(UCs)。一旦有人看到所有其他羣體都應該隱形。這樣我可以在PageOne,PageTwo下實現內部頁面。我可以將這些控件添加到多個數組(組)的列表中並通過它們循環以更改可見性? – hypheni

+0

是的,是的。把它們放在List中可能是一個好主意。然後你可以在顯示新的之前隱藏所有openXXX函數。然而,你需要做出這樣的決定:你想把它們全部放在一起嗎?如果這麼好,如果沒有,你將不得不處置它們。這真的取決於它們包含的內容。也許數據庫連接你想要免費或保持開放?你決定!人們甚至可能希望事先創建所有的東西 - 但它又取決於:最初是否會減慢速度,或稍後會感覺速度更快。 - 另請問:您是否想在頁面之間前後移動??... – TaW

+0

..但是'列表 myPages'肯定是一個好主意,也是一個'ucBaseClass currentPage'變量.. – TaW