从子窗体获取复选框值
本文关键字:复选框 获取 窗体 | 更新日期: 2023-09-27 18:34:40
我有一个mainForm和所有者窗体cameraViewVS(child(。我在第二个表单中有一个复选框,我希望当我选中或取消选中时,我在第一个表单中检索其值,我在 mainForm 中使用了这样的属性名称
public bool propertyZoomCam
{
get { return f1.checkBoxZoomCam.Checked; }
}
当我只显示一次 f2 的实例时,我在 f1 中调用此属性。
public void timer()
{
for (int l = 0; l < 2; l++)
{
cameraInstance[l].Start();
if (cameraInstance[l].MoveDetection == true)
{
foreach (Form S in Application.OpenForms)
{
var frm = S as Formes.CameraViewVS;
if (frm != null && frm.Addresse == cameraInstance[l].adresse) {
// Match, activate it
cameraInstance[l].MoveDetection = false;
frm.WindowState = FormWindowState.Normal;
frm.Activate();
return;
}
}
// No match found, create a new one
var f1 = new Formes.CameraViewVS(cameraInstance[l], adresseIPArray[l]);
f1.Show(this);
if(propertyZoomCam)
zoom = 15;
}
}
}
我只检索第一个假值,因为它在开头的值是假的,当我更改检查或取消选中时,我不会检索其值。
有什么帮助吗?
对代码进行以下更改:
-
在窗体级别声明一个变量,该变量将保存对子窗体的引用。
-
现在在定时器函数中将变量 f1 和 frm 替换为 frmCamera,并且不要在定时器函数中声明变量 f1 和 frm。
3.现在更新属性代码。
Formes.CameraViewVS frmCamera;
public bool propertyZoomCam
{
get
{
if (frmCamera!=null)
return frmCamera.checkBoxZoomCam.Checked;
else
return false;
}
}
public void timer()
{
for (int l = 0; l < 2; l++)
{
cameraInstance[l].Start();
if (cameraInstance[l].MoveDetection == true)
{
foreach (Form S in Application.OpenForms)
{
frmCamera = S as Formes.CameraViewVS;
if (frmCamera != null && frmCamera.Addresse == cameraInstance[l].adresse) {
// Match, activate it
cameraInstance[l].MoveDetection = false;
frmCamera.WindowState = FormWindowState.Normal;
frmCamera.Activate();
return;
}
}
// No match found, create a new one
frmCamera = new Formes.CameraViewVS(cameraInstance[l], adresseIPArray[l]);
frmCamera.Show(this);
if(propertyZoomCam)
zoom = 15;
}
}
}
再次触发计时器事件时,您丢失了 Camera 窗体的引用,因此现在我们将窗体存储在属性中使用的同一对象中。
您应该在此处查看一些内容:
- 如上面的答案所述,您在属性代码中引用了局部变量。 仅当您在该变量的创建范围内访问该属性时,这才有效,这极大地限制了您要实现的使用。 我不会说你永远不应该这样做,但我无法想出一个有效的用例。
- 对 Show(( 的调用会创建一个无模式表单并立即返回,因此除非 onload 代码修改复选框的状态,否则它几乎永远不会与您已经知道的创建时的状态有任何不同。 最后,也是
- 最重要的,就您的最终目标而言,使用计时器可能是处理复选框更改的低效方法。 如果希望应用在单击子窗体中的复选框时在父窗体中做出反应,则需要使用事件。 当子窗体检测到用户更改了复选框的状态时,它应触发事件。 主窗体可以侦听此事件并做出适当的响应,而不是等待下一个计时器周期。 您应该阅读事件和委托以实现这一点。 关于SO有许多问题可以解决这些技术。