2012-05-17 3 views
0

У меня есть форма mainform и владельца cameraViewVS (child). У меня есть CheckBox во второй форме, и я хочу, когда я проверить или снимите флажок я получить его значение в первой форме, я использовал ИмениСвойство как это в MainFormПолучить значение CheckBox из дочерней формы

public bool propertyZoomCam 
{ 
    get { return f1.checkBoxZoomCam.Checked; } 
} 

Я называю это свойство в f1, когда я показывать экземпляр только f2.

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

я получить только первое ложное значение, так как его значение в начале неверно, и когда я изменяю чек или снимите я не извлечь его значение.

Любая помощь?

+0

Если флажок установлен в f2, то почему свойство читает 'f1.checkBoxZoomCam.Checked'? Есть ли у f1 флажок с тем же именем? CameraVireVS * выглядит * как дочерняя форма, но вы вызываете ее f1. – LarsTech

+0

нет, «f1» в коде является только экземпляром второй формы Formes.CameraViewVS, и флажок находится в этой форме, чтобы получить его значение в основной форме. – Ostorlabi

+0

Похоже, что CameraViewVS должен поднять событие, в котором был установлен флажок, и прослушать его основную форму и установить значение «Zoom».Ваш опубликованный код никогда не достигает 'If (propertyZoomCam)', если форма найдена в коллекции. – LarsTech

ответ

0

Внести следующие изменения в коде:

  1. Объявите переменную на уровне формы, которая будет содержать ссылку на форму ребенка.

  2. Теперь замените переменные 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; 
    } 
    } 
}  

Вы были losting ссылки формы камеры, когда таймер событие вызывается снова, так что теперь мы сохраняем форму в одном объекте, который используется в собственности.

+0

Спасибо, Ромиль. – Ostorlabi

+0

Как? Я пытался проголосовать, но у меня недостаточно репутации. – Ostorlabi

0

Есть пара ОИС вещей, которые вы должны смотреть здесь:

  1. Как отмечалось в ответе выше, вы ссылаетесь на локальную переменную в коде свойства. Это будет работать только при доступе к свойству в области создания этой переменной, что значительно ограничивает использование, которое вы хотите реализовать. Я не скажу, что вы никогда не должны этого делать, но я не могу найти подходящий вариант использования.
  2. Вызов Show() создает немодальную форму и немедленно возвращается, поэтому, если код onload не изменяет статус флажка, он почти никогда не будет отличаться от статуса при создании, о котором вы уже знаете.
  3. И, наконец, самое главное в отношении вашей конечной цели, используя таймер, вероятно, является неэффективным способом обработки изменений флажков. Если вы хотите, чтобы ваше приложение реагировало в родительской форме, когда установлен флажок в дочерней форме, вам необходимо использовать события. Когда дочерняя форма определяет, что пользователь изменил статус флажка, он должен инициировать событие. Основная форма может прослушивать это событие и отвечать соответствующим образом, а не ждать следующего цикла таймера. Вы должны прочитать на событиях и делегатов для реализации этого. На SO есть много вопросов, которые затрагивают эти методы.
Смежные вопросы