在Windows应用程序中是否有类似于SESSION的东西?

5

Windows应用程序中是否有类似SESSION的东西?我想要存储一些值在不同的窗体之间保持持久化。

例如:第一个窗体有一些复选框,第三个窗体需要根据这些复选框进行处理。因此,我需要将选中的复选框存储在某个地方。


如果您能提供一个您想要实现的例子,那将会很有帮助。您是否想在“会话”中存储每个用户的值,并且这些数据应该在进程的生命周期内保留下来? - Dirk Vollmar
6个回答

5

如果您需要在同一个应用程序中使用不同的表单,则只需在一个类上创建一些静态成员,它将在可执行文件的生命周期内保留。


我认为他希望在不同的实例之间共享值。这个解决方案只涉及一个可执行文件。 - Maurizio Reginelli

3

您只能通过放置复选框的窗体上的属性来公开复选框的选中状态,并从第三个或进程窗体访问这些属性。

public partial class MainForm : Form {
    // We assume we have let's say three CheckBoxes named chkFirst, chkSecond and chkThird
    public bool IsFirstChecked { get { return chkFirst.Checked; } }
    public bool IsSecondChecked { get { return chkSecond.Checked; } }
    public bool IsThirdChecked { get { return chkThird.Checked; } }

    // Calling this form from where these checked states will be processed...
    // Let's suppose we have to click a button to launch the process, for instance...
    private void btnLaunchProcess(object sender, EventArgs e) {
        ProcessForm f = new ProcessForm();
        f.Parent = this;
        if (DialogResult.OK == f.ShowDialog()) {
            // Process accordingly if desired, otherwise let it blank...
        }
    }       
}

public partial class ProcessForm : Form {
    // Accessing the checked state of CheckBoxes
    private void Process() {
        if ((this.Parent as MainForm).FirstChecked)
            // Process according to first CheckBox.Checked state.
        else if ((this.Parent as MainForm).SecondChecked)
            // Process according to second CheckBox.Checked state.
        else if ((this.Parent as MainForm).ThirdChecked)
            // Process according to third CheckBox.Checked state.
    }
}

请注意,这段代码是我随意写的,可能无法编译通过。不过,我希望这能够给您传递在表单中传递值的思路。
Web和WinForm编程最大的区别在于Web是无状态的。SESSION和VIEWSTATE是解决方案,可以使得我们保留数值。
WinForms是有状态的,因此您不需要使用SESSION和VIEWSTATE这样的变量。只要对象存在,数值就会被保留下来。

2
如果您使用Visual Studio,可以使用app.config(或项目属性中的Settings部分),或者只需序列化您的值并将它们存储在某个文件中。

1
如果这只是一个普通的单用户Windows应用程序,请创建一个类来模拟您想要传递的状态,并在您的表单构造函数中要求它:
internal class ApplicationState 
{
    // Store the selected checkbox values here, for example
    public List<int> SelectedProductIds { get; }
    // ... additional state ...
}

internal class EditOrderForm: Form
{
    private ApplicationState applicationState;
    public EditCustomerForm(ApplicationState applicationState) {
        this.applicationState = applicationState;
    }
    // Rest of the code
}

你可以使用静态变量而不是实例 - 但这只是一些全局变量,会使你的代码更难以阅读和维护。


+1,你的解决方案是我想到的第二个。谢谢你的支持。=) - Will Marcouiller

1
如果您想在同一应用程序的独立执行之间保留数据(例如在HTTP服务器中处理并发请求),那么只需编写一些XML或使用运行时/平台的编组/序列化系统(不知道C#的是什么)。
然后再次导入它。只需注意并发控制即可。

0

如果您想在执行会话之间以每个用户为基础存储数据,您应该考虑使用隔离存储(Isolated Storage)。

  • 不会使安装目录混乱
  • 不会与反病毒软件发生冲突
  • 隶属于操作系统,包括 .Net 对象,无需安装其他任何内容
  • 已经与 Windows 安全模型配合良好
  • 存在于每个用户的基础上,因此保存的设置是针对每个用户分开的
  • 可以直接将对象进行序列化/反序列化

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接