0

我有一个 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;
    }
  }
}      

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

有什么帮助吗?

4

2 回答 2

0

在代码中进行以下更改:

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

  2. 现在将 Timer 函数中的变量 f1 和 frm 替换为 frmCamera,并且不要在 timer 函数中声明变量 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;
    }
  }
}      

当再次触发计时器事件时,您丢失了相机表单的引用,所以现在我们将表单存储在属性中使用的同一对象中。

于 2012-05-17T17:48:25.340 回答
0

您应该在此处查看一些 oif 事项:

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