【问题标题】:Is there something like SESSION in Windows application?Windows应用程序中有类似SESSION的东西吗?
【发布时间】:2011-12-06 18:19:32
【问题描述】:

Windows 应用程序中有类似 SESSION 的东西吗?我想在表单之间存储一些值。

例如:第一个表单有一些复选框,第三个表单相应地处理它们。所以我需要将选中的复选框存储在某处。

【问题讨论】:

  • 如果您能举例说明您要达到的目标,那将会有所帮助。您想在“会话”中存储每个用户的值吗?数据是否应该在进程的生命周期中保留下来?

标签: c# windows


【解决方案1】:

如果您在同一个应用程序中讨论不同的表单,那么只需在一个类上创建一些静态成员,它将在可执行文件的整个生命周期内保持不变。

【讨论】:

  • 我认为他希望在不同实例之间共享值。此解决方案仅涉及一个可执行文件。
【解决方案2】:

您只能通过放置 CheckBox 的此表单的属性公开您的 CheckBoxes Checked 状态,并从您的第三个表单或 Process 表单访问这些属性。

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 的变量。只要对象存在,就会保留一个值。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果您想在同一应用程序的独立执行之间保留数据(如在 HTTP 场中提供并发请求),那么只需写出一些 XML 或在您的运行时/平台中使用编组/序列化系统(不知道它会用于 C#)。

      然后再次导入。请注意您的并发控制。

      【讨论】:

        【解决方案5】:

        如果这只是一个普通的单用户 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 您的解决方案是我想到的第二个。感谢您的支持。 =)
        【解决方案6】:

        如果您希望在执行会话之间按用户存储数据,则应考虑隔离存储。

        • 不会弄乱安装目录
        • 不会导致 AnitVirus 软件出现问题
        • 部分操作系统包括 .Net 对象,不需要安装其他任何东西
        • 已经使用 Windows 安全模型
        • 存在于每个用户的基础上,因此为每个用户单独保存的设置
        • 可以将对象直接序列化/反序列化到其中

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-10
          • 1970-01-01
          • 2021-08-04
          相关资源
          最近更新 更多