2015-03-31 40 views
-1

我正在開發一個C#窗體窗體應用程序。在我的申請中,我有3種形式(主表單有一個列表框和兩個按鈕(入住和退房),入住表格和結帳表格)。在主窗體上,列表框包含用戶名,如果用戶第一次選擇他們的名字,則必須啓用登記按鈕以供用戶登記...但是,如果用戶登記並關閉應用程序,當他們重新打開它時,應該啓用按鈕檢出並禁用檢入。如何在Windows窗體應用程序上實現狀態

我被告知使用應用程序/用戶狀態,但由於我是編程新手,我不知道如何實現Windows窗體狀態。

我該怎麼辦?

謝謝

+0

你的意思是應用程序/用戶設置? https://msdn.microsoft.com/en-us/library/bb397750%28v=vs.110%29.aspx – TAMTAM 2015-03-31 15:07:58

+0

應用程序狀態通常定義爲反映應用程序當前模式的枚舉。如果您處於「新用戶」狀態,某些按鈕可能被禁用/啓用,而不是「正常」狀態。您可以將它作爲一個可用於所有表單的類來實現。這可以是一個在應用程序啓動時被初始化的靜態類 – 2015-03-31 15:08:03

回答

2

沒有「Windows窗體狀態」這樣的事情。您有幾種選擇來實現財產以後這樣的,其中有:

  1. 使用數據庫(這是有道理的,如果你有一個不同的用戶數量和可用的數據庫服務器)
  2. 使用用戶設置(這是.NET框架的內建機制,但可能不適合大量用戶)
  3. 使用簡單的XML文件來存儲所有用戶的狀態。

所有這三種解決方案都要求您對「進入東西」進行排序。寫更多關於你有什麼可用(數據庫服務器等),或者你是否想要固定數量的用戶,我可以擴展這個答案來幫助你入門。

我去排隊了怎麼辦2號:

創建的狀態分配給一個用戶名的小幫手類:

public class UserState 
{ 
    public string UserName { get; set; } 
    public bool CheckedIn { get; set; } 
    public override string ToString() { return String.Format("{0}={1}", UserName, CheckedIn); } 
} 

該類允許你存儲用戶名稱和檢入狀態,並通過呼叫ToString()以「user = false」的形式獲取值。

然後,創建一個名爲UserStates的用戶範圍應用程序設置(轉至項目設置的settings-tab並添加一個新的設置類型System.Collections.Specialized.StringCollection)。您可以從代碼訪問此設置,如Properties.Settings.Default.UserStates。它基本上是一個字符串列表。

要添加並堅持一個新的條目,你可以這樣做:

UserState state = new UserState() { UserName = "Test", CheckedIn = false }; 
Properties.Settings.Default.UserStates.Add(state.ToString()); 
Properties.Settings.Default.Save(); 

用戶狀態「測試」(和以前存在的條目)現在存儲整個程序重新啓動。

現在的想法是在啓動程序時建立用戶及其狀態列表,並在退出時存儲該列表。

聲明此作爲類的成員變量:

private List<UserState> userStates = new List<UserState>(); 

執行下列形式的OnLoad事件:

if (Properties.Settings.Default.UserStates == null || Properties.Settings.Default.UserStates.Count == 0) 
{ 
    // Add your users to the collection initially. This is the first 
    // run of the application 
    userStates.Add(new UserState() { ... }); 
    ... 
} 
else 
{ 
    // Each line in the setting represents one user in the form name=state. 
    // We split each line into the parts and add them to the internal list. 
    for (int i = 0; i < Properties.Settings.Default.UserStates.Count; i++) 
    { 
     string stateLine = Properties.Settings.Default.UserStates[i]; 
     string[] parts = stateLine.Split('='); 
     userStates.Add(new UserState() { UserName = parts[0].Trim(), CheckedIn = Boolean.Parse(parts[1].Trim()) }); 
    } 
} 

這將在各自的用戶內部列表中的新條目存儲在收集設置中的行。

單擊按鈕時,更改列表中對應的UserState對象的狀態。

不要在窗體的OnClose事件如下:

// Create the collection from scratch 
Properties.Settings.Default.UserStates = new System.Collections.Specialized.StringCollection(); 

// Add all the users and states from our internal list 
foreach (UserState state in userStates) 
{ 
    Properties.Settings.Default.UserStates.Add(state.ToString()); 
} 

// Save the settings for next start 
Properties.Settings.Default.Save(); 

這仍然存在用戶狀態來設置當前列表。

請注意:我已經在Visual Studio中測試過了,現在它可以正常工作。我留下了如何將列表框條目映射到內部列表中的UserState對象作爲新問題的主題的問題:-D

此方法的缺點:它不太靈活 - 添加更多每個用戶的狀態涉及一些編碼。

閱讀關於類型化數據集以及如何從XML存儲/讀取它們可能會更好。這給了你一些「數據庫感覺」,而不必實際使用數據庫。

相關問題