2015-03-31 82 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存储/读取它们可能会更好。这给了你一些“数据库感觉”,而不必实际使用数据库。

相关问题