jim*_*utt 2 .net c# parameter-passing winforms
我有两个表格.一个用于执行所有主要代码的地方.使用此方法单击菜单项时,将显示另一种形式:
Form2 videoSettings = new Form2();
private void videoToolStripMenuItem_Click(object sender, EventArgs e)
{
videoSettings.Show();
}
Run Code Online (Sandbox Code Playgroud)
然后打开的表单包含用户可以为应用程序设置一些设置的字段.
然后单击"保存"按钮时我想要这个变量:public int deviceIndex;
从原始表单中获取.
所以我想知道我是否可以在Form1中添加任何事件或什么东西来检测在videoSettings(Form2)中点击保存按钮的时间?
我会以不同的方式做到这一点.我将UI处理和业务逻辑层之间的代码分开.所以你的场景会以这样的方式运行:
这样就不会出现问题了.
示例:(我不是winforms专家,请注意最佳winforms实践的POV可能完全错误.)
第1部分(第一表格):
class ProcessingActivatedEventArgs : EventArgs
{
public ProcessingActivatedEventArgs(int data) { MoreData = data; }
public int MoreData { get; protected set; }
}
class Form1 : Form
{
private int currentData;
public event EventHandler<ProcessingActivatedEventArgs> ProcessingActivated;
void OnButtonClick(object sender, EventArgs args)
{
// ...
if (ProcessingActivated != null)
ProcessingActivated(new ProcessingActivatedEventArgs(currentData));
}
}
Run Code Online (Sandbox Code Playgroud)
第2部分:(业务逻辑)
class Controller
{
Form1 f1;
Form2 f2;
void StartFirstForm()
{
f1 = new Form1();
f1.ProcessingActivated += OnProcessingActivated;
f1.Show();
}
void OnProcessingActivated(object sender, ProcessingActivatedEventArgs args)
{
int data = args.MoreData;
f1.DisableProcessingRequests();
model.ProcessingFinished += OnProcessingFinished;
model.StartProcessing(data);
if (data > 0)
f2.DisplayDataProcessing(0, data);
else if (data < 0)
f2.DisplayDataProcessing(data, 0);
else
throw new SomeCoolException("impossible data");
}
}
Run Code Online (Sandbox Code Playgroud)
第3部分:(第二种形式)
class Form2 : Form
{
public void DisplayDataProcessing(int lower, int upper)
{
// ... update the UI
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,此实现将Controller表单与形式紧密联系起来.在WPF中,通过使用适当的DataContext(但我不知道如何在WinForms中正确地执行)来实现解耦.
| 归档时间: |
|
| 查看次数: |
5315 次 |
| 最近记录: |