2015-05-11 3 views
-2

это моя проблема: у меня есть основная форма, где у меня есть панель, содержащая несколько кнопок, когда пользователь нажимает кнопку, открывается форма. (У меня есть несколько кнопок и нажатие этих кнопок пользователь может открывать разные формы). Если пользователь снова нажимает ту же кнопку, что и закрывает форму. вот что я делаю:C# Изменить статус кнопки после закрытия формы?

в основной форме У меня есть метод, который вызывается, когда пользователь нажимает одну из этих кнопок, метод проверяет текст, связанный с кнопкой, чтобы решить, какая кнопка щелкнул. Как только я обнаружил, какая кнопка нажата, запускается форма, связанная с кнопкой.

это код

private void tlStBtn_Click(object sender, EventArgs e) 
{ 
     //// loop through all items in the ToolStrip 
     //foreach (Object item in toolStripMain.Items) 
     //{ 
     // // if this item is a ToolStripButton object, check it 
     // if (item is ToolStripButton) 
     // { 
     //  // cast the item to a ToolStripButton object and check it if the sender of the event is the currently looked at button in the loop 
     //  ToolStripButton button = (ToolStripButton)item; 
     //  button.Checked = (button == sender); 
     // } 
     //} 

     foreach (ToolStripItem item in this.VerticalToolBox.Items) 
     { 
      if ((item != sender) && 
       (item is ToolStripButton)) 
      { 
       ((ToolStripButton)item).Checked = false; 
      } 
     } 

     if (sender_old != sender) 
     { 
      sender_old = sender; 
      if ((sender as ToolStripButton).Text == "Protection") 
      { 
       if (!Application.OpenForms.OfType<frm_Protection>().Any()) 
       { 
        frm_Protection Newf = new frm_Protection(ref CurrentProject); 
        Newf.Show(); 

       } 
      } 
      else 
      { 
       if (Application.OpenForms.OfType<frm_Protection>().Any()) 
       { 
        Application.OpenForms.OfType<frm_Protection>().First().Close(); 
        Properties.Settings.Default.Save(); 
       } 
       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
      } 

       if ((sender as ToolStripButton).Text == "Info") 
       { 
        if (!Application.OpenForms.OfType<Frm_ObjectInfo>().Any()) 
        { 
         Frm_ObjectInfo Newform = new Frm_ObjectInfo(); 
         Newform.Show(); 
        } 
       } 
       else 
       { 
        if (Application.OpenForms.OfType<Frm_ObjectInfo>().Any()) 
        { 
         Application.OpenForms.OfType<Frm_ObjectInfo>().First().Close(); 
         Properties.Settings.Default.Save(); 
        } 

        GC.Collect(); 
        GC.WaitForPendingFinalizers(); 
       } 

      if ((sender as ToolStripButton).Text == "Layers") 
      { 
       if (!Application.OpenForms.OfType<Frm_LayersManage>().Any()) 
       { 
        Frm_LayersManage Newform = new Frm_LayersManage(); 
        Newform.Show(); 
        Application.OpenForms.OfType<Frm_LayersManage>().First().UpdateLayers(null, CurrentProject.layers); 
       } 
      } 
      else 
      { 
       if (Application.OpenForms.OfType<Frm_LayersManage>().Any()) 
       { 
        Application.OpenForms.OfType<Frm_LayersManage>().First().Close(); 
        Properties.Settings.Default.Save(); 
        UpdateScreen = true; 
       } 

       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
      } 

      if (Properties.Settings.Default.Grip2Enabled && (sender as ToolStripButton).Text == "Insert Grip") 
      { 
       gbx_SelectGrip.Visible = true; 

      } 
      else 
      { 
       gbx_SelectGrip.Visible = false; 
      } 

      //SelectedPoints.Clear(); 
      //MousePointList.Clear(); 
      //myIDs.Clear(); 
      //IdxPointsEnt.Clear(); 
      //RatiosLines.Clear(); 
      //CadSource.cuts_tmp.Clear(); 
      //IDAddedCutList.Clear(); 
      //ZoomPort.SetValue(0, 0); 
      //ZoomPort.SetValue(0, 1); 
      //ZoomPort.SetValue(0, 2); 
      //ZoomPort.SetValue(0, 3); 

      //// Reset index of scrap selected by moving gripper 
      //idxScrap = -1; 
      //pnl_OpenTK.Refresh(); 

      //// Se ho evidenziato uno SCRAP , annullo l'evidenziazione. 
      //if (IdsScrapDisablePath[0] != -1) 
      //{ 
      // int identifiedScrap = CadSource.IdToIdx_Scrap(IdsScrapDisablePath[0]); 

      // if (CadSource.scraps[identifiedScrap].GripExists()) 
      // { 
      //  CadSource.scraps[identifiedScrap].Enabled = ScrapAbilitation.Enabled;  // Disable clicked scrap 
      // } 
      // else 
      // { 
      //  CadSource.scraps[identifiedScrap].Enabled = ScrapAbilitation.WithoutGrip;  // Disable clicked scrap 
      // } 
      //} 
      //numScrap = 0; 
      //IdsScrapDisablePath = new List<int>() { -1, -1 }; 

     } 
     else 
     { 
      (sender as ToolStripButton).Checked = false; 
      (sender as ToolStripButton).BackColor = Color.Transparent; 

      sender_old = new object() { }; 
      if (Application.OpenForms.OfType<frm_Protection>().Any()) 
      { 

       Application.OpenForms.OfType<frm_Protection>().First().Close(); 
       Properties.Settings.Default.Save(); 

      } 


      if (Application.OpenForms.OfType<Frm_ObjectInfo>().Any()) 
      { 
       Application.OpenForms.OfType<Frm_ObjectInfo>().First().Close(); 
       Properties.Settings.Default.Save(); 
      } 

      if (Application.OpenForms.OfType<Frm_LayersManage>().Any()) 
      { 
       Application.OpenForms.OfType<Frm_LayersManage>().First().Close(); 
       Properties.Settings.Default.Save(); 
      } 

      gbx_SelectGrip.Visible = false; 

      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     } 

     SelectedPoints.Clear(); 
     MousePointList.Clear(); 
     myIDs.Clear(); 
     IdxPointsEnt.Clear(); 
     RatiosLines.Clear(); 
     CurrentProject.cuts_tmp.Clear(); 
     IDAddedCutList.Clear(); 
     ZoomPort.SetValue(0, 0); 
     ZoomPort.SetValue(0, 1); 
     ZoomPort.SetValue(0, 2); 
     ZoomPort.SetValue(0, 3); 

     // Reset index of scrap selected by moving gripper 
     idxScrap = -1; 
     pnl_OpenTK.Refresh(); 

     // Se ho evidenziato uno SCRAP , annullo l'evidenziazione. 
     if (IdsScrapDisablePath[0] != -1) 
     { 
      int identifiedScrap = CurrentProject.IdToIdx_Scrap(IdsScrapDisablePath[0]); 

      if (CurrentProject.scraps[identifiedScrap].GripExists()) 
      { 
       CurrentProject.scraps[identifiedScrap].Enabled = ScrapAbilitation.Enabled;  // Disable clicked scrap 
      } 
      else 
      { 
       CurrentProject.scraps[identifiedScrap].Enabled = ScrapAbilitation.WithoutGrip;  // Disable clicked scrap 
      } 
     } 
     numScrap = 0; 
     IdsScrapDisablePath = new List<int>() { -1, -1 }; 
    } 

формы, которые opned нажав на кнопки формы, где я поставил ControlBox на ложь, потому что я не хочу, что пользователь может закрыть формы без нажатия снова нажата кнопка, чтобы открыть ее, но я нашел проблему, потому что, если пользователь закрывает форму таким образом (см. рисунок ниже), статус кнопки остается включенным, но форма была закрыта вручную

this is how the user can close the from manually

Чтобы решить эту проблему, я думал, чтобы добавить этот метод, связанный с закрытием событий моих форм это код

private void frm_Protection_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     ////// if user closes manually the window without using the button I have to change the state of the button 

     Frm_Main f = new Frm_Main(); 
     f = Application.OpenForms.OfType<Frm_Main>().Last(); 
     f.tlsBut_Protection.Checked = false; 

    } 

с этим кодом, если я закрываю вручную форме статус кнопки оно становится ложным снова в основной форме , но я обнаружил, что это вызывает некоторые проблемы для моей программы, одна из этих проблем заключается в том, что после закрытия формы, если я снова нажимаю кнопку, кажется, что метод, связанный с событием нажатия, не вызывается, а форма не открывается. Я должен дважды щелкнуть его, прежде чем он снова заработает.

Знаете ли вы, почему я делаю неправильно?

спасибо за вашу помощь

ответ

3

Чтобы предотвратить форму от закрытия, вы можете подписаться на FormClosing событие, которое выстреливает перед тем закрывает форму, и перехватывать (и отменить) действия пользователя.

private void frm_Protection_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.UserClosing) 
     e.Cancel = true; 
} 

К сожалению, нажав кнопку «X» (в окне предварительного просмотра на панели задач или в самой программе) и вызова this.Close() оба рассматриваются как «UserClosing» рядом причин, так что мы должны изменить его немного.

Добавить объект в frm_Protection, и использовать, чтобы определить, является ли форма может быть закрыта:

public bool CanClose { private get; set; } 

private void frm_Protection_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    e.Cancel = !CanClose; 
} 

И только тогда установите свойство true, если вы хотите, чтобы позволить форму быть закрыты:

var frmP = Application.OpenForms.OfType<frm_Protection>().FirstOrDefault(); 

if (frmP != null) 
{ 
    frmP.CanClose = true; 
    frmP.Close(); 
} 
+0

Привет благодарен за ответ, но он не работает, потому что таким образом я не могу закрыть это, даже если хочу –

+0

Я вижу, что вы говорите. Обновлен ответ. –

Смежные вопросы