如何在Windows窗体应用程序上实现状态

时间:2015-03-31 15:01:07

标签: c#

我正在开发一个c#windows窗体应用程序。在我的应用程序中,我有3个表单(主表单有一个列表框和两个按钮(签入和签出),签入表单和签出表单)。在主窗体上,列表框包含用户名,如果用户第一次选择其名称,则必须启用签入按钮以供用户签入...但是如果用户签入然后关闭应用程序,当他们重新打开时,应该启用按钮检出并禁用登记。

我被告知使用应用程序/用户状态,但由于我是编程新手,我不知道如何实现Windows窗体状态。

我该怎么办?

谢谢

1 个答案:

答案 0 :(得分:2)

没有“Windows Forms状态”这样的东西。你有几个选项来实现这样的事情,其中​​包括:

  1. 使用数据库(如果您拥有不同数量的用户和数据库服务器,这是有意义的)
  2. 使用用户设置(这是.NET框架的内置机制,但可能不适合许多用户)。
  3. 使用简单的XML文件存储所有用户的状态。
  4. 所有这三种解决方案都要求您进行“融入事物”。详细了解您的可用内容(数据库服务器等)或是否需要固定数量的用户,我可以扩展此答案以帮助您入门。

    我将列出如何做第二名:

    创建一个小助手类,为用户名分配状态:

    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”形式的值。

    然后,创建一个用户范围的应用程序设置(转到项目设置的设置选项卡并添加名为System.Collections.Specialized.StringCollection的{​​{1}}类型的新设置)。您可以从代码UserStates访问此设置。它基本上是一个字符串列表。

    要添加并保留新条目,您可以执行以下操作:

    Properties.Settings.Default.UserStates

    用户“Test”(以及之前存在的条目)的状态现在存储在程序重启之间。

    现在的想法是在启动程序时构建用户及其状态列表,并在退出时存储此列表。

    将此声明为类中的成员变量:

    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

    这会将当前的用户状态列表保留为该设置。

    请注意:我现在已经在Visual Studio中对此进行了测试,但它确实有效。我留下了如何将列表框条目映射到内部列表中的// 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(); 对象的问题/作为新问题的主题:-D

    这种方法的缺点:它不是很灵活 - 每个用户添加更多状态涉及一些编码。

    您可以更好地阅读有关类型化数据集以及如何从XML存储/读取它们。这为您提供了某种“数据库感觉”而无需使用数据库。