2014-01-22 2 views
0

Я работаю над компонентом Grasshopper, который представляет собой плагин Rhino 3D, который выполняет графическое программирование. У меня есть фрагмент кода WinForms, например, так:Winform OK кнопка никогда не называется

public void ShowForm() 
    { 
     hmf.ShowDialog(); 

     if (hmf.ShowDialog() == DialogResult.OK) { 

      MessageBox.Show("DialogResultOK was hit."); 
      // store winforms values into global vars 

      try 
      { 
       MessageBox.Show(Params.Input[0].ToString()); 
       Grasshopper.Kernel.Parameters.Param_String param = (Grasshopper.Kernel.Parameters.Param_String)Params.Input[0]; 
       param.PersistentData.Clear(); 
       for (int i = 0; i <= x.Count - 1; i++) 
       { 
        param.PersistentData.Append(new GH_String(x[i])); 
       } 
       param.ExpireSolution(true); 
      } 
      catch (Exception ex) 
      { 
       // error message 
      } 
     } 
     else if (hmf.ShowDialog() == DialogResult.Cancel) 
     { 
      MessageBox.Show("DialogResultCancel was hit."); 
      this.ExpireSolution(false); 
     } 
    } 

Он предлагает два условия, в DialogResult.OK и DialogResult.Cancel. Теоретически, когда вызывается OK, он сохраняет значения winforms в мои глобальные переменные, иначе он переходит в DialogResult.Cancel.

По какой-то причине, когда я использую MessageBox.Show("..."), это показывает, что OK никогда не вызывается.

Вот forms код:

private void button1_Click(object sender, EventArgs e) // ok 
    { 
    } 

    public Button button1Object{ get { return this.button1; } } 

    private void button2_Click(object sender, EventArgs e) // cancel 
    { 

    } 

    public Button button2Object { get { return this.button2; } } 

Это как мой form выглядит.

enter image description here

ответ

4

Вы вызываете ShowDialog() функция в три раза! Вызовите его один раз и поместите его результат в переменную. Каждый раз, когда вы его вызываете, возникает другой ответ. Ваш подход заставляет ваш оператор «if» блокировать блоки кода, которые недоступны.

public void ShowForm() 
{ 
    var a = hmf.ShowDialog(); 

    if (a == DialogResult.OK) { 

     MessageBox.Show("DialogResultOK was hit."); 
     // store winforms values into global vars 

     try 
     { 
      MessageBox.Show(Params.Input[0].ToString()); 
      Grasshopper.Kernel.Parameters.Param_String param = (Grasshopper.Kernel.Parameters.Param_String)Params.Input[0]; 
      param.PersistentData.Clear(); 
      for (int i = 0; i <= x.Count - 1; i++) 
      { 
       param.PersistentData.Append(new GH_String(x[i])); 
      } 
      param.ExpireSolution(true); 
     } 
     catch (Exception ex) 
     { 
      // error message 
     } 
    } 
    else if (a == DialogResult.Cancel) 
    { 
     MessageBox.Show("DialogResultCancel was hit."); 
     this.ExpireSolution(false); 
    } 
} 
+0

Wow. Я также заметил, что потребовалось три раза, чтобы закрыть мой диалог, как только я его скомпилировал. Вы правы в том, что его называли три раза. Позвольте мне исправить это и вернуться к вам. – theGreenCabbage

+0

Эй код. Кажется, что исправил мою предыдущую проблему, однако нажатие «ОК» по-прежнему не сохраняет мои результаты. Например, нажатие кнопки «ОК» ничего не делает. Щелчок по красной кнопке закрывает подсказку, чтобы я нажал кнопку «DialogResultCancel», но если я снова открою диалоговое окно, результаты будут сохранены. OO – theGreenCabbage

+0

Итак, теперь, когда это исправлено, проверьте свойства кнопки на форме hmf и убедитесь, что она возвращается DialogResult.OK (другой плакат помещает это, но, кажется, удалил его) –

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