从子窗体获取复选框值

本文关键字:复选框 获取 窗体 | 更新日期: 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;
    }
  }
}      

我只检索第一个假值,因为它在开头的值是假的,当我更改检查或取消选中时,我不会检索其值。

有什么帮助吗?

从子窗体获取复选框值

对代码进行以下更改:

  1. 在窗体级别声明一个变量,该变量将保存对子窗体的引用。

  2. 现在在定时器函数中将变量 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 窗体的引用,因此现在我们将窗体存储在属性中使用的同一对象中。

您应该在此处查看一些内容:

  1. 如上面的答案所述,您在属性代码中引用了局部变量。 仅当您在该变量的创建范围内访问该属性时,这才有效,这极大地限制了您要实现的使用。 我不会说你永远不应该这样做,但我无法想出一个有效的用例。
  2. 对 Show(( 的调用会创建一个无模式表单并立即返回,因此除非 onload 代码修改复选框的状态,否则它几乎永远不会与您已经知道的创建时的状态有任何不同。
  3. 最后,也是
  4. 最重要的,就您的最终目标而言,使用计时器可能是处理复选框更改的低效方法。 如果希望应用在单击子窗体中的复选框时在父窗体中做出反应,则需要使用事件。 当子窗体检测到用户更改了复选框的状态时,它应触发事件。 主窗体可以侦听此事件并做出适当的响应,而不是等待下一个计时器周期。 您应该阅读事件委托以实现这一点。 关于SO有许多问题可以解决这些技术。