2012-07-13 6 views
0

대화 상자가

static LoginDialog loginDialog; 

public static bool ShowLoginDialog() 
     { 
      result = false; // Success 

      loginDialog = new LoginDialog(); 

      loginDialog.ShowDialog(); 
      loginDialog.BringToFront(); 
      loginDialog.TopMost = true; 
      loginDialog.Activate(); 

      return result; 
     } 

내가 내 상호 작용 whitout 다른 폼에서 호출 로그인 사용자 정의 대화 상자를 쓴 초점하지 않습니다, 그것은 불입니다 현재 열린 양식의 맨 위에 초점을 맞추지 않습니다.

이 문제를 어떻게 해결할 수 있습니까? 고맙습니다.

+2

'ShowDialog()'는 메소드 실행을 차단합니다. – adatapost

+0

@AVD :'ShowDialog()'는 메소드의 실행을 차단할 것입니다.하지만 대화 모드에서 LoginDialog를 표시 한 후입니다. 따라서 문제가 발생해서는 안됩니다. – atiyar

답변

0

귀하의 LoginDialog은 다른 양식이라고 가정합니다. 이 시도 -

MainForm에서 :

private void MainForm_Load(object sender, EventArgs e) 
    { 
     timer1.Interval = 3000; // your preferred time-interval 
     timer1.Start(); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     LoginDialog.ShowLoginDialog(timer1); 
    } 

LoginDialog에서 :

private static bool result; 
    private static LoginDialog loginDialog; 

    public static bool ShowLoginDialog(Timer timer) 
    { 
     timer.Stop(); 

     result = false; // Success 

     loginDialog = new LoginDialog(); 
     loginDialog.ShowDialog(); 

     return result; 
    } 

참고 : 내가 무슨 생각이 당신이 사용하고있는 result 변수입니다. 당신이 정적 방법을 사용하는 이유는 loginDialog.ShowDialog();

전에

+0

나는 내 코드에서 그렇게하고있다. 로그인 대화 상자는 MainForm 상단에 초점을 두지 않습니다. – Alvin

+0

아직 응용 프로그램에있을 때 작동하지만, 응용 프로그램이 백그라운드에서 실행 중이고 다른 응용 프로그램을 수행하고 있다면 다시 응용 프로그램으로 돌아옵니다. 로그인 대화 상자는 기본 양식 위에 포커스가 없습니다. – Alvin

+0

@KelvinFixx : 돌아올 때 MainForm을 선택하십시오. 당신은 할 수 없습니다. 왜냐하면이 두 창 사이에서 LoginDialog가 Focus에 있기 때문입니다. 원하는 장면을 구현하려면 MainForm이 mdi 상위 항목이고 LoginDialog가 mdi 하위 항목 인 MDI 앱으로 이동해야합니다. – atiyar

0
//Suppose you have Form1 as your parent Form 
//Add Button on it and on its Click Event 

그냥 간단하게 수행

public bool ShowLoginDialog() 
    { 
     bool result = false; // Success 

     var loginDialog = new LoginDialog(); 
     loginDialog.ShowDialog(); 

     return result; 
    } 

이 ShowDialog()는 항상 당신이 그것을 실행 부모 폼의 상단에있을.

감사

당신이 초점을

[DllImport("user32")] 
public static extern int SetForegroundWindow(IntPtr hwnd); 

및 수신을 원하는 형태로 내부

+0

당신은'var'이 달라질 것이라고 말하고 있습니까? 그렇지 않으면 그는 이미 이것을하고 있기 때문입니다. – Rawling

+0

이전에 시도했지만 작동하지 않았습니다. – Alvin

+0

ShowDialog()는 실행하는 폼의 맨 위에 항상 표시되어야합니다. – BizApps

1

사용 SetForegroundWindow 대화 형 양식 핸들 함수를 호출 표시 될 때;

void OnShown(object sender, EventArgs e) { 
    SetForegroundWindow(this.Handle); 
} 
0

loginDialog.BringToFront(); ShowDialog() 블록 실행으로 호출되지 않습니다. 소유자 양식을 ShowDialog에 전달하십시오.

1

사용 loginDialog.TopMost = true;? 나는 이것이 주된 문제라고 생각한다.

0

ShowLoginDialog()을 다른 양식에서 호출한다고 가정 해보십시오. 서명을 public static bool ShowLoginDialog(Form parentForm) 또는 public static bool ShowLoginDialog(IWin32WindowOwner parentForm)으로 변경할 수 있습니까? 그렇다면 다음을 할 수 있습니다 :

public static bool ShowLoginDialog(IWin32WindowOwner parentForm) 
{ 
    using(LoginDialog loginDialog = new LoginDialog()) //Really should use using statement 
    { 
     loginDialog.ShowDialog(parentForm); //Set the parent form for the dialog 
    } 
} 
관련 문제