c # एक नया फ़ॉर्म खोलें तो वर्तमान फ़ॉर्म बंद करें?


89

उदाहरण के लिए, मान लें कि मैं फार्म 1 में हूं तो मैं चाहता हूं:

  1. फॉर्म 2 खोलें (फॉर्म 1 में एक बटन से)
  2. फार्म 1 बंद करें
  3. फॉर्म 2 पर ध्यान दें

18
भयानक प्रयोज्यता। यदि आप WinForms का उपयोग कर रहे हैं, तो बस एक कंटेनर विंडो बनाएं, और इसके बजाय पैनल बदलें। आपके उपयोगकर्ता आपको इसके लिए प्यार करेंगे (और इसे न करने के लिए आपसे नफरत करते हैं)
क्लॉस जोर्जेंसन

1
क्लॉस सुनो! आप जो हासिल करने की कोशिश कर रहे हैं, वह संभवत: ए है। विजार्ड्स जैसे कार्यान्वयन विज़ार्ड-सीक्वेंशियल सीरीज ऑफ स्टेप्स या बी) "डेटा एंट्री / सबमिट" फॉर्म के बाद "परिणाम" -फॉर्म दिखाने का प्रयास। भले ही यह a) या b) UI व्यवहार जिसे आप लागू करने का प्रयास कर रहे हैं, एक उप-अपनाने वाला समाधान है।
सिमेन एस

धन्यवाद क्लॉज और सिमेन एस बहुत बहुत। आपकी टिप्पणियाँ मेरी तरह एक शुरुआत के लिए बहुत उपयोगी हैं। मैं GUI और प्रयोज्य के बारे में अधिक ट्यूटोरियल पढ़ूंगा। क्या आप मुझे कुछ उपयोगी सुझा सकते हैं?
tnhan07


यह भी जाँच करें [यहाँ उत्तर] ( stackoverflow.com/questions/4759334/… ), अगर आपका असली इरादा सिर्फ लॉगिन (या एक जैसे) रूप में था।
इलियास इलियादिस

जवाबों:


194

स्टीव का समाधान काम नहीं करता है। जब यह कॉल किया जाता है। क्लोज (), फॉर्म 2 के साथ वर्तमान फॉर्म का निपटान किया जाता है। इसलिए आपको इसे छिपाने की जरूरत है और इस कॉल करने के लिए form2.Closed इवेंट सेट करें। Close ()।

private void OnButton1Click(object sender, EventArgs e)
{
    this.Hide();
    var form2 = new Form2();
    form2.Closed += (s, args) => this.Close(); 
    form2.Show();
}

2
डॉट नेट में विंडोज़ के रूपों में कोई बंद घटना नहीं है। क्या आप बता सकते हैं कि यह घटना है
अंजलि

2
क्या पहला रूप अभी भी याद नहीं है? हम उस संसाधन को कैसे जारी कर सकते हैं?
user2635088

5
form2.Closed += (s, args) => this.Close();क्या मुझे पता है कि यह कथन कैसे काम करता है? वास्तव (s,args)में क्या है?
यश सरैया

1
(s, args) => this.Close();एक लंबोदर अभिव्यक्ति है। यह एक फ़ंक्शन "जगह" बनाता है जिसे form2.Closedघटना को निकाल दिया जाता है। (s, args)लैम्बडा के मापदंडों के लिए सिर्फ नाम हैं। जो एक घटना हैंडलर के लिए आमतौर पर कुछ पसंद कर रहे हैं (object sender, EventArgs e)। क्योंकि Closedईवेंट प्रतिनिधि हस्ताक्षर उनके प्रकारों का वर्णन करते हैं, इसलिए प्रकार नहीं दिए गए हैं (किसी ने यदि जरूरत हो तो मेरे शब्दों को सही करें)। // कुल मिलाकर इसका सिर्फ एक पेचीदा तरीका है कि इस Form2.Closedघटना को संभालने वाले वर्तमान के बाहर पूरे फ़ंक्शन (ईवेंट हैंडलर) की घोषणा न की जाए ।
केडेकर

1
इसका सिर्फ पहला रूप छिपाना और नया रूप खोलना लेकिन पहला रूप बंद नहीं करना
उदयन सेमवाल

25

ऐसा करने की कोशिश करो ...

{
    this.Hide();
    Form1 sistema = new Form1();
    sistema.ShowDialog();
    this.Close();
}

ये रही बात। मेरा एक मेन फॉर्म है। लेकिन मैं एक लॉगिन के लिए एक छोटे से फार्म का उपयोग करता हूं। यह फ़ॉर्म इस विधि के साथ मुख्य फॉर्म को कॉल करता है। ठीक है हम यहाँ अच्छे हैं। समस्या तब थी जब मेन फॉर्म एक बच्चे के फॉर्म को दिखाता है, और बच्चे के फॉर्म को बंद करने पर ... यह मेन फॉर्म को भी बंद कर देता है। इसलिए चूंकि मैं निहिक द्वारा प्रकाशित विधि का उपयोग कर रहा हूं। कोड बहुत अच्छा काम कर रहा है! ...
मोंटेडेस्का

यह कोड मेरे लिए काम कर रहा है। मैं वी.एस. 2015 का उपयोग कर रहा हूं। धन्यवाद
आईटी 10log18

22

कई अलग-अलग तरीकों को पहले से ही अन्य उत्तरों द्वारा वर्णित किया गया है। हालांकि, उनमें से कई ShowDialog()या तो शामिल थे या form1खुले रहते हैं लेकिन छिपे रहते हैं। मेरी राय में सबसे अच्छा और सबसे सहज तरीका बस बंद करना है form1और फिर form2एक बाहरी स्थान (यानी उन दोनों रूपों में से नहीं) से बनाना है। मामले में जहां form1बनाया गया था Main, form2बस पहले की Application.Runतरह उपयोग करके बनाया जा सकता है form1। यहाँ एक उदाहरण परिदृश्य है:

मुझे उपयोगकर्ता की आवश्यकता है कि वे किसी तरह प्रमाणित करने के लिए मेरे लिए अपनी साख दर्ज करें। बाद में, यदि प्रमाणीकरण सफल रहा, तो मैं उपयोगकर्ता को मुख्य एप्लिकेशन दिखाना चाहता हूं। इसे पूरा करने के लिए, मैं दो रूपों का उपयोग कर रहा हूं: LogingFormऔर MainFormLoginFormएक झंडा निर्धारित करता है कि चाहे प्रमाणीकरण सफल था या नहीं है। इस ध्वज का उपयोग तब यह तय करने के लिए किया जाता है कि क्या MainFormउदाहरण तैयार करना है या नहीं। इन रूपों में से किसी को भी दूसरे के बारे में जानने की जरूरत नहीं है और दोनों रूपों को इनायत से खोला और बंद किया जा सकता है। यहाँ इस के लिए कोड है:

class LoginForm : Form
{
    public bool UserSuccessfullyAuthenticated { get; private set; }

    void LoginButton_Click(object s, EventArgs e)
    {
        if(AuthenticateUser(/* ... */))
        {
            UserSuccessfullyAuthenticated = true;
            Close();
        }
    }
}

static class Program
{
    [STAThread]
    static void Main()
    {
        LoginForm loginForm = new LoginForm();
        Application.Run(loginForm);

        if(loginForm.UserSuccessfullyAuthenticated)
        {
            // MainForm is defined elsewhere
            Application.Run(new MainForm());
        }
    }
}

यह रूपों को छिपाने की तुलना में एक अच्छी चाल है। जब हमारे पास आवेदन से बाहर निकलने के लिए छिपे हुए रूप हैं तो यह वर्तमान फॉर्म को बंद करके पर्याप्त नहीं है। हमें Application.Exit (0) इत्यादि का उपयोग करना होगा
Peck_ बालकनीसन

यह अच्छा है, लेकिन मुझे लगता है कि यह केवल 2 रूपों के लिए उपयुक्त है। उनके बीच स्विच करने वाले कई रूपों के बारे में क्या ??
डॉ। एमएएफ

यह अनुक्रम में चलने वाले रूपों तक ही सीमित है, न कि समानांतर या एक दूसरे के शीर्ष पर, जैसा कि ओपी ने पूछा है। मुझे यकीन नहीं है कि यह केवल 2 रूपों तक ही सीमित होगा, हालांकि। बाहर का कोड वांछित के रूप में अनुक्रम में कई रूपों के लिए स्वतंत्र है। उनके बीच टॉगलिंग बाहरी कोड द्वारा भी की जा सकती है। यह मुख्य रूप (जैसे loginForm.UserSuccessfullyAuthenticatedपहले) या शायद वैश्विक स्थिति पर कुछ राज्य की जाँच कर सकता है कि लॉगिन फॉर्म को फिर से चलाने के लिए, या किसी अन्य रूप को चलाने के लिए, या शायद प्रक्रिया को समाप्त करें।
मनुजोर

11

समस्या है कि लाइन के साथ जीव:

Application.Run(new Form1()); जो शायद आपके program.cs फ़ाइल में पाया जा सकता है।

यह पंक्ति इंगित करती है कि फॉर्म 1 संदेश लूप को संभालना है - दूसरे शब्दों में फॉर्म 1 आपके आवेदन को निष्पादित करने के लिए जिम्मेदार है - फॉर्म 1 बंद होने पर आवेदन बंद हो जाएगा।

इसे संभालने के कई तरीके हैं, लेकिन सभी एक तरह से या किसी अन्य को बंद नहीं करेंगे form1।
(जब तक कि हम प्रोजेक्ट के प्रकार को विंडोज़ फॉर्म एप्लीकेशन के अलावा किसी अन्य चीज़ में न बदल दें)

मुझे लगता है कि आपकी स्थिति के लिए सबसे आसान है 3 रूपों को बनाना:

  • form1 - अदृश्य रहेगा और एक प्रबंधक के रूप में कार्य करेगा, यदि आप चाहें तो ट्रे आइकन को संभालने के लिए आप इसे असाइन कर सकते हैं।

  • form2 - बटन होगा, जिस पर क्लिक करने पर form2 बंद हो जाएगा और फॉर्म 3 खुल जाएगा

  • form3 - को खोलने के लिए आवश्यक अन्य फ़ॉर्म की भूमिका होगी।

और यहाँ एक नमूना कोड है जिसे पूरा करने के लिए:
(मैंने तीसरे फॉर्म से ऐप को बंद करने के लिए एक उदाहरण भी जोड़ा)

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1()); //set the only message pump to form1.
    }
}


public partial class Form1 : Form
{
    public static Form1 Form1Instance;

    public Form1()
    {
        //Everyone eveywhere in the app should know me as Form1.Form1Instance
        Form1Instance = this;

        //Make sure I am kept hidden
        WindowState = FormWindowState.Minimized;
        ShowInTaskbar = false;
        Visible = false;

        InitializeComponent();

        //Open a managed form - the one the user sees..
        var form2 = new Form2();
        form2.Show();
    }

}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var form3 = new Form3(); //create an instance of form 3
        Hide();             //hide me (form2)
        form3.Show();       //show form3
        Close();            //close me (form2), since form1 is the message loop - no problem.
    }
}

public partial class Form3 : Form
{
    public Form3()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form1.Form1Instance.Close(); //the user want to exit the app - let's close form1.
    }
}


ध्यान दें: पैनल के साथ काम करना या उपयोगकर्ता-नियंत्रण को गतिशील रूप से लोड करना अधिक उद्योग के उत्पादन मानकों के रूप में अकादमिक और बेहतर है - लेकिन यह मुझे लगता है कि आप सिर्फ इस बात की कोशिश कर रहे हैं कि चीजें कैसे काम करती हैं - इस उद्देश्य के लिए यह उदाहरण बेहतर है।

और अब जब सिद्धांतों को समझा जाता है तो आइए इसे केवल दो रूपों के साथ आज़माएं:

  • पहला रूप पिछले उदाहरण की तरह प्रबंधक की भूमिका लेगा, लेकिन पहली स्क्रीन भी प्रस्तुत करेगा - इसलिए इसे केवल छिपे हुए बंद नहीं किया जाएगा।

  • दूसरा फॉर्म अगली स्क्रीन दिखाने की भूमिका लेगा और एक बटन पर क्लिक करके एप्लिकेशन को बंद कर देगा।


    public partial class Form1 : Form
    {
        public static Form1 Form1Instance;

        public Form1()
        {
            //Everyone eveywhere in the app show know me as Form1.Form1Instance
            Form1Instance = this;
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Make sure I am kept hidden
            WindowState = FormWindowState.Minimized;
            ShowInTaskbar = false;
            Visible = false;

            //Open another form 
            var form2 = new Form2
            {
                //since we open it from a minimezed window - it will not be focused unless we put it as TopMost.
                TopMost = true
            };
            form2.Show();
            //now that that it is topmost and shown - we want to set its behavior to be normal window again.
            form2.TopMost = false; 
        }
    }

    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form1.Form1Instance.Close();
        }
    }

यदि आप पिछले उदाहरण को बदलते हैं - प्रोजेक्ट से फ़ॉर्म 3 को हटा दें।

शुभ लाभ।


6

आप विशिष्ट नहीं थे, लेकिन ऐसा लगता है कि आप ऐसा करने की कोशिश कर रहे थे कि मैं अपने Win Forms ऐप्स में क्या करूं: एक लॉगिन फॉर्म के साथ शुरू करें, फिर सफल लॉगिन के बाद, उस फॉर्म को बंद करें और मुख्य फॉर्म पर ध्यान केंद्रित करें। यहाँ है कि मैं यह कैसे करते हैं:

  1. स्टार्टअप फॉर्म तैयार करें; यह मेरा Program.cs जैसा दिखता है:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmMain());
    }
    
  2. मेरे frmLogin में, एक सार्वजनिक संपत्ति बनाएं जो कि झूठी हो जाती है और केवल तभी सफल होती है जब कोई सफल लॉगिन होता है:

    public bool IsLoggedIn { get; set; }
    
  3. मेरा frmMain इस तरह दिखता है:

    private void frmMain_Load(object sender, EventArgs e)
    {
        frmLogin frm = new frmLogin();
        frm.IsLoggedIn = false;
        frm.ShowDialog();
    
        if (!frm.IsLoggedIn)
        {
            this.Close();
            Application.Exit();
            return;
        }
    

कोई सफल लॉगिन नहीं? आवेदन से बाहर निकलें। अन्यथा, frmMain के साथ आगे बढ़ें। चूंकि यह स्टार्टअप फॉर्म है, जब यह बंद हो जाता है, तो एप्लिकेशन समाप्त हो जाता है।


3

अपने कोड 1 में इस कोड स्निपेट का उपयोग करें।

public static void ThreadProc()
{
Application.Run(new Form());
}

private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));
t.Start();
this.Close();
}

मुझे यह यहाँ से मिला


ध्यान दें कि लिंक-केवल उत्तर हतोत्साहित किए जाते हैं, एसओ उत्तर एक समाधान के लिए खोज का अंतिम बिंदु होना चाहिए (बनाम संदर्भों का एक और ठहराव, जो समय के साथ बासी हो जाते हैं)। लिंक को संदर्भ के रूप में रखते हुए कृपया यहां एक स्टैंड-अलोन सिनोप्सिस जोड़ने पर विचार करें।
क्लेओपेट्रा

2

यदि आपके पास दो रूप हैं: frm_form1 और frm_form2। निम्न कोड का उपयोग frm_form2 खोलने और बंद करने के लिए किया जाता है frm_form1। (विंडोज़ फ़ॉर्म अनुप्रयोग के लिए)

        this.Hide();//Hide the 'current' form, i.e frm_form1 
        //show another form ( frm_form2 )   
        frm_form2 frm = new frm_form2();
        frm.ShowDialog();
        //Close the form.(frm_form1)
        this.Close();

1

मैं आमतौर पर रूपों के बीच आगे और पीछे स्विच करने के लिए ऐसा करता हूं।

सबसे पहले, प्रोग्राम फ़ाइल में मैं ApplicationContext रखता हूं और एक सहायक स्विचमैनफ़ॉर्म विधि जोड़ता हूं ।

        static class Program
{
    public static ApplicationContext AppContext { get;  set; }


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

        //Save app context
        Program.AppContext = new ApplicationContext(new LoginForm());
        Application.Run(AppContext);
    }

    //helper method to switch forms
      public static void SwitchMainForm(Form newForm)
    {
        var oldMainForm = AppContext.MainForm;
        AppContext.MainForm = newForm;
        oldMainForm?.Close();
        newForm.Show();
    }


}

फिर कोड में कहीं भी अब मैं नए फॉर्म में आसानी से स्विच करने के लिए SwitchMainForm विधि को कॉल करता हूं ।

// switch to some other form
var otherForm = new MyForm();
Program.SwitchMainForm(otherForm);

0
private void buttonNextForm(object sender, EventArgs e)
{
    NextForm nf = new NextForm();//Object of the form that you want to open
    this.hide();//Hide cirrent form.
    nf.ShowModel();//Display the next form window
    this.Close();//While closing the NextForm, control will come again and will close this form as well
}

यह काम नहीं करेगा। अगला रूप दिखाने से पहले छिपाने का कोई अर्थ नहीं है। यह कार्यविधि निष्पादित करेगा और कार्यक्रम को समाप्त कर दिया जाएगा।
अहमत करबुलुत

0
//if Form1 is old form and Form2 is the current form which we want to open, then
{
Form2 f2 = new Form1();

this.Hide();// To hide old form i.e Form1
f2.Show();
}


0
                     this.Visible = false;
                        //or                         // will make LOgin Form invisivble
                        //this.Enabled = false;
                         //  or
                       // this.Hide(); 



                        Form1 form1 = new Form1();
                        form1.ShowDialog();

                        this.Dispose();

1
इस उत्तर के बारे में इस चर्चा में क्या है? यह 9 अन्य जवाबों में मौजूद किसी भी स्पष्टीकरण जानकारी को जोड़ने के बिना आराम कर रहा है।
एडवर्ड

0

मुझे लगता है कि यह बहुत आसान है :)

    private void btnLogin_Click(object sender, EventArgs e)
    {
        //this.Hide();
        //var mm = new MainMenu();
        //mm.FormClosed += (s, args) => this.Close();
        //mm.Show();

        this.Hide();
        MainMenu mm = new MainMenu();
        mm.Show();

    }

यह समाधान इस प्रश्न का संबंधित उत्तर नहीं है। आपका समाधान वर्तमान फ़ॉर्म को बंद नहीं करेगा, इसका मतलब वर्तमान फ़ॉर्म अभी भी प्रक्रिया में है।
अहमत करबुलुत

-1

मान लें कि आपके पास दो फॉर्म हैं, पहला फॉर्म नाम फॉर्म 1 है और दूसरा फॉर्म नाम फॉर्म 2 है। आपको यहां फॉर्म 1 से फॉर्म 2 दर्ज करने के लिए कूदना होगा। निम्नलिखित की तरह कोड लिखें:

Form1 पर मेरे पास Button1 नाम का एक बटन है, और इसके नीचे दिए गए विकल्प पर कोड के नीचे लिखें:

protected void Button1_Click(Object sender,EventArgs e)
{
    Form frm=new Form2();// I have created object of Form2
    frm.Show();
    this.Visible=false;
    this.Hide();
    this.Close();
    this.Dispose();
}

आशा है कि यह कोड आपकी मदद करेगा


ये चार विधियां हैं: this.Visible=false; this.Hide(); this.Close(); this.Dispose();निरर्थक। आपको इससे ज्यादा कुछ नहीं चाहिए Close()। किसी प्रपत्र का समापन करना, उसका रूप बदलना दृश्यता को छिपाने के समान है, और प्रपत्र को छुपाना तब व्यर्थ है जब यह अगले पेंट इवेंट से पहले मौजूद नहीं होगा।
Servy

-3

मैं इसे हल करके करूंगा:

private void button1_Click(object sender, EventArgs e)
{
    Form2 m = new Form2();
    m.Show();
    Form1 f = new Form1();
    this.Visible = false;
    this.Hide();
}

3
this.Visible = falseऔर फिर this.Hide? एक ही काम दो बार क्यों?
नेवलिस्क

8
इसके अलावा, आप एक नया क्यों बना रहे हैं Form1और इसके साथ कुछ नहीं कर रहे हैं?
१।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.