【发布时间】:2011-12-06 18:19:32
【问题描述】:
Windows 应用程序中有类似 SESSION 的东西吗?我想在表单之间存储一些值。
例如:第一个表单有一些复选框,第三个表单相应地处理它们。所以我需要将选中的复选框存储在某处。
【问题讨论】:
-
如果您能举例说明您要达到的目标,那将会有所帮助。您想在“会话”中存储每个用户的值吗?数据是否应该在进程的生命周期中保留下来?
Windows 应用程序中有类似 SESSION 的东西吗?我想在表单之间存储一些值。
例如:第一个表单有一些复选框,第三个表单相应地处理它们。所以我需要将选中的复选框存储在某处。
【问题讨论】:
如果您在同一个应用程序中讨论不同的表单,那么只需在一个类上创建一些静态成员,它将在可执行文件的整个生命周期内保持不变。
【讨论】:
您只能通过放置 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 的变量。只要对象存在,就会保留一个值。
【讨论】:
如果您使用 Visual Studio,您可以使用 app.config(或项目属性中的设置部分),或者只是序列化您的值并将它们存储在某个文件中。
【讨论】:
如果您想在同一应用程序的独立执行之间保留数据(如在 HTTP 场中提供并发请求),那么只需写出一些 XML 或在您的运行时/平台中使用编组/序列化系统(不知道它会用于 C#)。
然后再次导入。请注意您的并发控制。
【讨论】:
如果这只是一个普通的单用户 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
}
您可以使用静态变量而不是实例 - 但这些只是全局变量,会使您的代码更难阅读和维护。
【讨论】:
如果您希望在执行会话之间按用户存储数据,则应考虑隔离存储。
【讨论】: