문제

VS Studio 2008 Express Edition에서 2 개의 양식을 만들었고 Main Program.cs 파일에서 Public STATIC로 선언했습니다.

나는 단지 showdialog와 닫기로 두 형태를 전환하고 싶지만 두 번째 양식을 닫고 showdialog로 첫 번째 양식을 다시 열 때 양식이 이미 보이면 showdialog를 사용할 수 없다고 말하지만 I는 사실이 아니기 때문에 사실이 아닙니다. 두 번째 양식을 보여주기 전에 닫았습니다.

ShowDialog를 사용하기 전에 형식 보시는 속성을 False로 설정하도록 요청했습니다.

    internal static void CloseSecondForm(FirstForm FirstForm)
    {
        FirstForm .Close();
        SecondForm.Visible = false;
        SecondForm.ShowDialog();
    }

그러나 양식이 이미 대화 모드에 표시되어 있고 닫아야하기 때문에 showdialog를 사용할 수 없다고 말합니다. 그래서 나는 그것이 요청한 것을했습니다

    internal static void CloseSecondForm(FirstForm FirstForm)
    {
        FirstForm .Close();
        SecondForm.Visible = false;
        SecondForm.Close();
        SecondForm.ShowDialog();
    }

그러나 여전히 ShowDialog로 양식이 이미 열린 척합니다!

이것은 내 프로그램이나 Winform의 버그입니까?

업데이트 : 이것은 5 번째 답변에 게시 한 전체 코드입니다 (ShowDialog를 사용하고 있으며 사용자가 액세스하지 않기를 원하지 않는 배경에 3 번째 양식을 가질 수 있기 때문에 표시되지 않기 때문에 표시되지 않습니다).

  [STAThread]
  static void Main()
  {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Form1 = new Form1();
      Form2 = new Form2();
      Form1.ShowDialog();
      Application.Run();

  }

  // called from Form1 BUTTON
  internal static void ShowForm2(Form1 Form1)
  {
      Form1.Hide();
      Form2.ShowDialog();
  }

  // called from Form2 BUTTON
  internal static void ShowForm1(Form2 Form2)
  {
      Form2.Hide();
      Form1.ShowDialog();
  }

제안 된대로 Hide로 시도했지만 작동하지 않습니다. 이것은 전체 프로그램입니다. 제가하고 싶은 것은 매우 간단합니다. 각 양식에 하나의 버튼이있는 두 가지 양식이 자체적으로 닫히고 다른 양식을 개방하기 위해 두 가지 양식이 있습니다. 모든 논리를 프로그램에 넣었습니다.

  using System;
  using System.Windows.Forms;

  namespace twoforms
  {
      static class Program
      {
          /// <summary>
          /// The main entry point for the application.
          /// </summary>
          /// 
          public static Form1 Form1;
          public static Form2 Form2;

          [STAThread]
          static void Main()
          {
              Application.EnableVisualStyles();
              Application.SetCompatibleTextRenderingDefault(false);
              Form1 = new Form1();
              Form2 = new Form2();
              Form1.ShowDialog();
              Application.Run();

          }

          // called from Form1 BUTTON
          internal static void ShowForm2(Form1 Form1)
          {
              Form1.Hide();
              Form2.ShowDialog();
          }

          // called from Form2 BUTTON
          internal static void ShowForm1(Form2 Form2)
          {
              Form2.Hide();
              Form1.ShowDialog();
          }
      }
  }
도움이 되었습니까?

해결책

이것은 MSDN에서 나온 것입니다.

양식이 모달 대화 상자로 표시되면 닫기 버튼 (양식의 오른쪽 상단에 X가있는 버튼)을 클릭하면 양식이 숨겨지고 DialOgresult 속성이 DialOgresult.cancel로 설정됩니다. Modeless Forms와 달리 사용자가 대화 상자의 닫기 양식 버튼을 클릭하거나 DialOgresult 속성의 값을 설정할 때 .NET 프레임 워크에서 클로즈 메소드를 호출하지 않습니다. 대신 양식이 숨겨져 있으며 대화 상자의 새 인스턴스를 만들지 않고도 다시 표시 할 수 있습니다. 대화 상자로 표시된 양식이 닫히지 않으므로 응용 프로그램에서 더 이상 양식이 필요하지 않은 경우 양식의 처분 방법을 호출해야합니다.

따라서 showdialog를 사용하여 양식을 표시하고 이제 닫으려면 Dialogresult를 반환하십시오 .Cancel이 첫 번째 형태를 숨기십시오 (여전히 메모리에있을 것입니다). 이제 두 번째 양식에서 showdialog에 전화 할 수 있습니다. 다시 한 번, 첫 번째 양식으로 전환하려면 두 번째 양식을 Refort Dialogresult.cancel로 보내고 이제 첫 번째 양식에서 showdialog를 호출하십시오.

다른 팁

이것은 프로그램의 버그입니다. 양식의 두 가지 인스턴스가 있으면 (A와 B 호출) ShowDialog를 사용하여 다른 하나를 계속 표시 할 수 없습니다. 이 작업을 수행 할 수 있다면 A가 모드로 표시되고 B가 모드를 보여주고 A와 A가 B 모드를 보여줍니다. 이것은 두 개의 벽돌로 집을 짓는 것과 같습니다. 다른 것 위에 놓습니다.

최상의 솔루션은 이러한 양식을 정적으로 만들지 않고 필요한대로 각 양식의 새로운 인스턴스를 만드는 것입니다. 두 번째로 좋은 해결책은 showdialog 대신 쇼를 사용하는 것입니다. 어쨌든 한 번 에이 양식 중 하나만 표시되면 ShowDialog에는 목적이 없습니다.

정적 형태는 거의 항상 나쁜 생각입니다 (그리고 나는 "거의"에 대해 공손합니다). 양식을 작성하는 데 오랜 시간이 걸리면 전체 양식을 정적으로 캐시하는 대신로드하고 정적 객체로 캐시하는 데 시간이 오래 걸리는 리소스를 식별해야합니다.

close () 대신 hide ()를 사용해보십시오. 나는 과거에 비슷한 문제가 있었고 Hide ()가 나를 위해 일했습니다.

메소드 호출과 같은 모달 대화 상자를 실제로 취급하고 다음에 수행 할 작업을 결정하기 위해 호출 결과를 showdialog로 사용해야한다고 생각하십니까? 대화 상자간에 전환 해야하는 요구 사항이있는 경우, 한 종류의 결과 (단순히 Dialogresult 내 예를 참조 할 수 있음) 또는 대화 상자의 공개 속성을 사용하여 다른 대화 상자를 표시 해야하는지 결정하고, 하나의 모달 대화 상자를 호출 해야하는지 결정해야합니다. 다른 하나는 그것을 형태의 스택처럼 생각해야합니다. 효과적으로 (다른 사람을 부르기 전에 보이지 않더라도)는 다른 하나를 놓습니다. 이 양식의 스택을 최소화하고 싶습니다.

이것은 약간의 예제이지만 여기에 각 양식에는 Dialogresult가 OK로 설정된 단일 버튼이 있습니다.

[STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        bool exit = false;
        while (true)
        {
            if (exit) break;
            using (Form1 frm = new Form1())
            {
                switch(frm.ShowDialog())
                {
                    case DialogResult.OK:
                        break;
                    default:
                        exit = true;
                        break;
                }   
            }
            if(exit) break;
            using (Form2 frm = new Form2())
            {
                switch(frm.ShowDialog())
                {
                    case DialogResult.OK:
                        break;
                    default:
                        exit = true;
                        break;
                } 
            }

        }

    }

종료하려면 빨간색 닫기 (x) 버튼을 클릭하십시오.

차이점을 확인하십시오 Close 그리고 Hide. 그리고 그 사이의 차이 Show 그리고 ShowDialog.

당신이 달성하고 싶은 것이 무엇인지는 확실하지 않습니다. 당신은 코드에서 한 일과 당신이 가진 문제의 증상 만 (부분적으로) 설명합니다. 당신이 무엇을하려고하는지 설명해 주시겠습니까?

목표가 두 가지 중 하나만 표시 될 수있는 두 개의 대화 상자가 동시에 보일 수있는 두 개의 대화 상자가있는 경우 두 개의 정적 (= 글로벌) 공개를 사용하는 것보다 더 나은 솔루션이있을 수 있습니다. Form 사용하는 인스턴스 ShowDialog.

하나의 대화 상자를 사용한다고 생각 했습니까? Form 이를 위해 상황에 따라 모양이 변경됩니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top