从子表单获取CheckBox值

时间:2012-05-17 14:54:35

标签: c# winforms

我有一个mainForm和所有者表单cameraViewVS(child)。我有一个第二种形式的复选框,我希望当我检查或取消选中我在第一种形式中检索它的值时,我在mainForm中使用了这样的propertyName

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;
    }
  }
}      

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

任何帮助?

2 个答案:

答案 0 :(得分:0)

在代码中进行以下更改:

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

  2. 现在用Timer函数中的frmCamera替换变量f1和frm,不要在计时器函数中声明变量f1和frm。

  3. 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 :(得分:0)

您应该在这里查看几件事情:

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