2010-08-09 3 views
6

В настоящее время я работаю над небольшим проектом и хотел бы помочь.Close form without exit application

У меня есть 2 формы, первое окно входа в систему, а второе будет основной программой. Проблема в том, что когда я закрываю form1 с this.Close(), она выходит из всей программы.

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

Спасибо.

+2

ли это winforms или wpf? И это не проблема потоковой передачи, а скорее проблема того, что «это» находится в области, которую вы используете, скорее всего. Код поможет. –

+0

Возможный дубликат [Закрытие формы, а затем вызов другой.] (Http://stackoverflow.com/questions/2751076/closing-a-form-and-then-call-another-one) –

+0

Я еще не сделал много с winforms, но только для проверки, вы создаете свой экран входа в главное окно, поскольку оно родительское, нет? –

ответ

6

Вы можете скрыть первую форму вместо того, чтобы закрыть его:

this.Hide(); 
Form2 form2 = new Form2(); 
form2.Show(); 
+1

Тогда у меня есть другая проблема, когда я закрываю Form2, я хотел бы закрыть скрытый Form1, как мне это сделать? –

+0

@ Victor: То же самое, но вам нужно предложить способ действительно закрыть обе формы и закрыть приложение. –

+0

@Victor: Application.Exit() должен сделать трюк – 2010-08-09 18:37:33

2

Если вы используете WPF, вы можете установить Application.MainWindow на свое второе «главное» окно, до закрытия формы входа.

+0

Еще один способ WPF более гибкий ... –

+0

На самом деле в vb.net вы можете указать режим выключения приложения. C# не позволяет вам легко сказать. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/61b817f8-d7d3-44de-9095-91a6e3f2150c – ioWint

3

Невозможно изменить программу program.cs так, чтобы она запускала основную форму, и при запуске основной формы она создает и показывает форму входа в систему, а затем прячется (ожидая, что логин появится, чтобы показать себя)?

+1

Точно, что я собирался сказать: Убедитесь, что вы не используете первую форму для загрузки приложения, подобного этому ... Application.Run (новый Form1()); – MilkyWayJoe

1

Program.cs где ваша основная функция. Если вы создали проект в качестве приложения Windows с Visual Studio, тогда в нем будет функция, которая запускает форму, которая открывается при запуске программы. Просто введите информацию для входа из формы входа в систему, а затем вызовите второе окно. Вот пример:

[STAThread] 
private static void Main(string[] args) 
{ 
    //there's some other code here that initializes the program 

    //Starts the first form (login form) 
    Application.Run(new form1()); 

    //Get the login info here somehow. Maybe save in public members of form1 or 
    // in a global utilities or global user class of some kind 

    //Run the main program 
    Application.Run(new mainProgramForm()); 
} 

EDIT: ЗАБЫЛ ЧТО-ТО

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

private static void Main(string[] args) 
{ 
    //there's some other code here that initializes the program 

    //Instead of running a new form here, first create it and then run it 
    Form1 form1 = new Form1(); //Creates the form 
    Application.Run(form1);  //Runs the form. Program.cs will continue after the form closes 

    //Get the login info 
    string username = form1.Username; 
    string password = form1.Password; 

    //Get rid of form1 if you choose 
    form1.Dispose(); 

    //Validate the user info 

    //Run the main program 
    Application.Run(new mainProgramForm()); 
} 
0

Открытой программа. cs - вы можете сделать довольно много до вызова приложения, включая показ вашей информации для входа. Вот пример из одного из моих проектов. Он пытается найти соединение с базой данных. Если он не может, он открывает мастер и либо подключается к доступу, либо mssql. Если open хорошо, он показывает экран spalsh и, наконец, запускает приложение, иначе он закрывается.

Application.EnableVisualStyles(); 
Application.SetCompatibleTextRenderingDefault(false); 
DialogResult LclResult; 

EESDatabasePersistentData LclPersist; 
LclPersist = new EESDatabasePersistentData(); 
string LclDataType; 
string LclDatabase; 
string LclServer; 
string Password; 
string UserID; 
if (!LclPersist.GetConnection(out LclServer, out LclDatabase, out LclDataType, out UserID, out Password)) 
{ 
     // Run the connection wizard 
     GetConnection(out LclServer, out LclDatabase, out LclDataType, out UserID, out Password); 
} 


if (LclDataType == "ACCESS") 
     InitDataAccess(LclDatabase); 
else if (LclDataType == "SQLSERVER") 
     InitDataSQL(LclServer, LclDatabase, UserID, Password); 
if (OpenGood) 
{ 
     if (!System.Diagnostics.Debugger.IsAttached) 
     { 
       FormSplash.Instance.SetupVersion(); 
       /////////////////////////////////// 
       // If we don't call do events 
       // splash delays loading. 
       Application.DoEvents(); 
       FormSplash.Instance.Show(); 
     } 
     Application.DoEvents(); 

     Application.Run(new FormMentorMain()); 
} 
else 
     Application.Exit(); 
0

, Что ваше мнение, чтобы создать что-то подобное

tray Icon

его называют Tray Icon

так что пользователь может close all forms и app still running ,, и user can go back to app any time

позволяет начать кодирование (обратите внимание, что это приложение WPF)

private NotifyIcon m_notifyIcon; 
private ContextMenuStrip m_contextMenu; 
private bool _ForceClose; 

public MainWindow() 
{ 
    InitializeComponent(); 
    CreateNotifyIcon(); 

} 

private void CreateNotifyIcon() 
{ 
    m_contextMenu = new ContextMenuStrip(); 

    ToolStripMenuItem mI1 = new ToolStripMenuItem { Text = "Open" }; 
    mI1.Click += (sender, args) => Maximize(); 
    ToolStripMenuItem mI2 = new ToolStripMenuItem { Text = "Exit" }; 
    mI2.Click += (sender, args) => EndApplication(); 
    m_contextMenu.Items.Add(mI1); 
    m_contextMenu.Items.Add(mI2); 
    //Initalize Notify Icon 
    m_notifyIcon = new NotifyIcon 
    { 
     Text = "Application Title", 
     Icon = new Icon("Icon.ico"), 
     //Associate the contextmenustrip with notify icon 
     ContextMenuStrip = m_contextMenu, 
     Visible = true 
    }; 
} 

и у нас есть эти функции

protected void Minimize() 
{ 
    Hide(); 
} 

protected void Maximize() 
{ 
    Show(); 
    this.WindowState =WindowState.Normal; 
} 

protected void EndApplication() 
{ 
    Minimize(); 
    Thread.Sleep(1000); 
    _ForceClose = true; 
    WindowState = WindowState.Normal; 
    this.Close(); 
    Environment.Exit(0); 
} 

и Window Closing слушателя событий (не забудьте добавить его)

private void Window_Closing(object sender, CancelEventArgs e) 
{ 
    if (_ForceClose == false) 
    { 
     e.Cancel = true; 
     Minimize(); 
    } 
} 

вот и все, надеюсь, что это поможет вам