সি # একটি নতুন ফর্ম খুলুন তাহলে বর্তমান ফর্মটি বন্ধ করুন?


89

উদাহরণস্বরূপ, ধরে নিন যে আমি ফর্ম 1 এ আছি তবে আমি চাই:

  1. ফর্ম 2 খুলুন (1 ফর্মের একটি বোতাম থেকে)
  2. বন্ধ ফর্ম 1
  3. ফর্ম 2 উপর ফোকাস করুন

18
ভয়াবহ ব্যবহারযোগ্যতা। আপনি যদি উইনফর্মগুলি ব্যবহার করছেন তবে কেবল একটি ধারক উইন্ডো তৈরি করুন এবং তার পরিবর্তে প্যানেলগুলি প্রতিস্থাপন করুন। আপনার ব্যবহারকারীরা এটির জন্য আপনাকে ভালবাসবে (এবং এটি না করার জন্য আপনাকে ঘৃণা করবে)
ক্লজ জর্জেনসেন

4
ক্লজ শুনুন! আপনি যা অর্জন করার চেষ্টা করছেন তা সম্ভবত ক) একটি উইজার্ডের মতো ক্রমক্রমিক ধারাবাহিক পদক্ষেপের উইনফর্মস বাস্তবায়ন বা খ) "তথ্য প্রবেশ / জমা দিন" ফর্মের পরে "ফলাফল" -রূপ প্রদর্শন করার প্রচেষ্টা। এটি ক) বা খ) নির্বিশেষে আপনি যে ইউআই আচরণটি বাস্তবায়নের চেষ্টা করছেন তা হ'ল একটি সাবঅপটিমাল সমাধান।
সাইমন এস

ধন্যবাদ ক্লজ এবং সিমেন এসকে অনেক ধন্যবাদ। আপনার মতামত আমার মত একটি শিক্ষানবিশ জন্য খুব সহায়ক। আমি জিইউআই এবং ব্যবহারযোগ্যতা সম্পর্কে আরও টিউটোরিয়াল পড়ব। আপনি কি আমাকে কিছু দরকারী প্রস্তাব করতে পারেন?
tnhan07


এছাড়াও চেক করুন [উত্তর এখানে] ( stackoverflow.com/questions/4759334/... ), চান, তাহলে আপনার আসল মাত্র একটি লগইন (অথবা একইভাবে) ফর্ম আছে ছিল।
ইলিয়াস ইলিয়াডিস

উত্তর:


194

স্টিভের সমাধান কাজ করে না। এটি কল করার সময় (ক্লোজ) () বন্ধ করুন, বর্তমান ফর্মটি ফর্ম 2 দিয়ে একসাথে নিষ্পত্তি করা হবে। সুতরাং আপনাকে এটি লুকিয়ে রাখতে হবে এবং ফর্ম 2 সেট করতে হবে thisএটি কল করার জন্য বন্ধ ইভেন্টটি বন্ধ করুন)

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

4
ডট নেটে উইন্ডোজ ফর্মগুলিতে কোনও বন্ধ ইভেন্ট নেই। আপনি কি আমাকে বলতে পারেন এটি ফর্মক্লোড ইভেন্ট
অঞ্জলি

4
প্রথম ফর্মটি লুকিয়ে রাখলে কি এখনও এটিকে স্মৃতিতে রাখা যায় না? কীভাবে আমরা সেই সংস্থানটি মুক্তি দিতে পারি?
user2635088

4
form2.Closed += (s, args) => this.Close();আমি জানতে পারি কীভাবে এই বিবৃতিটি কাজ করে? আসলে কি (s,args)?
যশ সরাইয়া

4
(s, args) => this.Close();একটি ল্যাম্বডা এক্সপ্রেশন। এটি "স্থানে" একটি ফাংশন তৈরি করে যা form2.Closedইভেন্টটি সরিয়ে ফেলা হলে তাকে ডাকা হয়। (s, args)ল্যাম্বডায় পরামিতিগুলির জন্য কেবল নাম। যা ইভেন্ট হ্যান্ডলারটির জন্য সাধারণত এমন কিছু (object sender, EventArgs e)Closedইভেন্ট প্রতিনিধি স্বাক্ষর তাদের প্রকারের বর্ণনা দেয় কারণ , প্রকারগুলি দেওয়া হয় না (কেউ যদি প্রয়োজন হয় তবে আমার শব্দের সংশোধন করুন)। // সামগ্রিকভাবে ঘটনাটি পরিচালনা করে এমন বর্তমানের বাইরে একটি সম্পূর্ণ ফাংশন (ইভেন্ট হ্যান্ডলার) ঘোষণা করার দরকার নেই এটির একটি কৌশলগত উপায় Form2.Closed
কেডেকার

4
এটি কেবল প্রথম ফর্মটি আড়াল করে নতুন ফর্ম খুলছে তবে প্রথম ফর্মটি বন্ধ করে
দিচ্ছে

25

এটি করার চেষ্টা করুন ...

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

এখানে জিনিস। আমার একটি প্রধান ফর্ম আছে। তবে আমি লগইনের জন্য একটি সামান্য ফর্ম ব্যবহার করি। এই ফর্মটি এই পদ্ধতির সাথে মেইন ফর্মটিকে কল করে। ঠিক আছে আমরা এখানে ভাল। সমস্যাটি ছিল যখন প্রধান ফর্মটি একটি শিশু ফর্ম দেখায় এবং শিশু ফর্মটি বন্ধ করার সময় ... এটি মূল ফর্মটিও বন্ধ করে দেয়। তাই যেহেতু আমি নিহিকের দ্বারা প্রকাশিত পদ্ধতিটি ব্যবহার করছি। কোডটি এত সুন্দরভাবে কাজ করছে! ...
মন্টডেস্কা

এই কোডটি আমার জন্য কাজ করছে। আমি ভিএস 2015 ব্যবহার করছি Thanks ধন্যবাদ
IT Vlogs

22

অন্যান্য উত্তরগুলি দ্বারা ইতিমধ্যে অনেকগুলি বিভিন্ন পদ্ধতি বর্ণনা করা হয়েছে। যাইহোক, তাদের মধ্যে অনেকেই জড়িত হয় ShowDialog()বা তা form1খোলা থাকে তবে লুকানো থাকে। আমার মতে সবচেয়ে ভাল এবং স্বজ্ঞাত উপায় হ'ল কেবল বন্ধ করা form1এবং তারপরে form2বাইরের কোনও অবস্থান থেকে তৈরি করা (যেমন those ফর্মগুলির মধ্যে কোনওটি নয়)। যেখানে form1তৈরি করা হয়েছিল Main, form2কেবল আগের Application.Runমতোই তৈরি করা যেতে পারে form1। এখানে একটি উদাহরণের চিত্র:

আমি তাদের কোনওভাবে প্রমাণীকরণ করার জন্য তাদের শংসাপত্রগুলি প্রবেশ করানোর জন্য আমার প্রয়োজন need এরপরে, যদি প্রমাণীকরণ সফল হয় তবে আমি ব্যবহারকারীর কাছে প্রধান অ্যাপ্লিকেশনটি দেখাতে চাই। এটি সম্পাদন করতে, আমি দুটি ফর্ম ব্যবহার করছি: LogingFormএবং MainForm। এর LoginFormপতাকা রয়েছে যা প্রমাণীকরণ সফল হয়েছিল কিনা তা নির্ধারণ করে whether এই পতাকাটি তখন 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());
        }
    }
}

ফর্মগুলি লুকানোর চেয়ে এটি দুর্দান্ত কৌশল। অ্যাপ্লিকেশনটি থেকে বেরিয়ে আসার জন্য যখন আমাদের কাছে লুকানো ফর্ম রয়েছে তখন এটি কেবলমাত্র বর্তমান ফর্মটি বন্ধ করে রাখাই যথেষ্ট নয়। আমাদের অ্যাপ্লিকেশন.এক্সিট (0) ইত্যাদি ব্যবহার করতে হবে
পেক_কোনিয়ন

এটি দুর্দান্ত, তবে আমি মনে করি এটি কেবল 2 টি ফর্মের জন্য উপযুক্ত। তাদের মধ্যে একাধিক ফর্ম স্যুইচিং সম্পর্কে কি ??
ডাঃ এমএএফ

এটি ক্রমানুসারে চলমান ফর্মগুলিতে সীমাবদ্ধ, সমান্তরাল বা একে অপরের শীর্ষে নয়, যেমন ওপি বলেছে। আমি নিশ্চিত না কেন কেন এটি কেবল ২ টি ফর্মের মধ্যে সীমাবদ্ধ থাকবে। বাইরের কোডটি যথাযথভাবে যথাক্রমে যতগুলি ফর্ম ছড়িয়ে দিতে পারে তা বিনামূল্যে। তাদের মধ্যে টগলিং বাইরের কোড দ্বারাও করা যেতে পারে। এটি loginForm.UserSuccessfullyAuthenticatedলগইন ফর্মটি আবার চালাবেন, বা অন্য ফর্মটি চালাবেন, বা প্রক্রিয়াটি শেষ করে দেবেন কিনা তা নির্ধারণ করতে মূল ফর্মের ( আগের মত ) কিছু রাষ্ট্র বা সম্ভবত বৈশ্বিক অবস্থা পরীক্ষা করতে পারে।
মনুজুর

11

সমস্যাটি সেই লাইনের সাথে:

Application.Run(new Form1()); যা সম্ভবত আপনার program.cs ফাইলটিতে পাওয়া যাবে।

এই লাইনটি ইঙ্গিত করে যে ফর্ম 1 হ'ল বার্তাগুলির লুপটি পরিচালনা করতে হবে - অন্য কথায় ফর্ম 1 আপনার অ্যাপ্লিকেশনটি চালিয়ে যাওয়া দায়বদ্ধ - ফর্ম 1 বন্ধ হয়ে গেলে অ্যাপ্লিকেশনটি বন্ধ হয়ে যাবে।

এটি পরিচালনা করার বিভিন্ন উপায় রয়েছে তবে সেগুলি সমস্ত একরকম বা অন্য কোনওভাবে ফর্ম 1 টি বন্ধ হবে না।
(যদি না আমরা উইন্ডোজ ফর্ম অ্যাপ্লিকেশন ব্যতীত অন্য কোনও প্রকল্পের প্রকার পরিবর্তন না করি)

আপনার পরিস্থিতি সবচেয়ে সহজ বলে মনে করি তা হ'ল 3 টি ফর্ম তৈরি করা:

  • form1 - অদৃশ্য থেকে যাবে এবং পরিচালক হিসাবে কাজ করবে, আপনি এটি চাইলে ট্রে আইকনটি হ্যান্ডেল করতে পারেন।

  • form2 - এ বোতামটি থাকবে যা ক্লিক করলে ফর্ম 2 বন্ধ হবে এবং ফর্ম 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

আপনি সুনির্দিষ্ট ছিলেন না, তবে দেখে মনে হচ্ছে আপনি আমার উইন ফর্ম অ্যাপ্লিকেশনগুলিতে যা করছেন তা করার চেষ্টা করছিলেন: একটি লগইন ফর্ম দিয়ে শুরু করুন, তারপরে সফল লগইন করার পরে, ফর্মটি বন্ধ করুন এবং একটি প্রধান ফর্মটিতে ফোকাস দিন। আমি এটি কীভাবে করব তা এখানে:

  1. স্টার্টআপ ফর্মটি তৈরি করুন; এটি আমার প্রোগ্রাম.সি-এর মতো দেখাচ্ছে:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmMain());
    }
    
  2. আমার ফ্রমলগিনে, এমন একটি সর্বজনীন সম্পত্তি তৈরি করুন যা মিথ্যা থেকে শুরু হয়ে যায় এবং সফল লগইন হলেই সত্যতে সেট করা থাকে:

    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 following নীচের কোডটি 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

আমি সাধারণত ফর্মগুলির মধ্যে পিছনে পিছনে স্যুইচ করতে এটি করি।

প্রথমত, প্রোগ্রাম ফাইলটিতে আমি অ্যাপ্লিকেশন কনটেক্সট রাখি এবং একটি সহায়ক সুইচমেনফর্ম পদ্ধতি যুক্ত করি।

        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();
    }


}

তারপরে কোডের যে কোনও জায়গায় এখন নতুন ফর্মটিতে সহজেই স্যুইচ করতে আমি সুইচমেনফর্ম পদ্ধতিটি কল করি ।

// 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
                     this.Visible = false;
                        //or                         // will make LOgin Form invisivble
                        //this.Enabled = false;
                         //  or
                       // this.Hide(); 



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

                        this.Dispose();

4
এই উত্তরটি কী এই আলোচনায় যুক্ত করে? অন্যান্য 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 এ প্রবেশ করতে হবে code নীচের মত কোড লিখুন:

ফর্ম 1 এ আমার বোতাম 1 নামক একটি বোতাম রয়েছে এবং তার ক্লিক অপশনে কোডের নীচে লিখুন:

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()। কোনও ফর্মকে তা নিষ্পত্তি করা, ফর্মটির দৃশ্যমানতা নির্ধারণ করা একে আড়াল করার সমান এবং ফর্মটি লুকানো অর্থহীন, যখন এটি পরবর্তী রঙিন ইভেন্টের আগে উপস্থিত হবে না।
পরিবেশন করুন

-3

আমি এটি করে সমাধান করব:

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

4
this.Visible = falseএবং তারপর this.Hide? দু'বার একই কাজ করছেন কেন?
নিওলিস্ক

8
এছাড়াও, আপনি কেন একটি নতুন তৈরি Form1করছেন এবং এটি দিয়ে কিছুই করছেন না?
পরিবেশন করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.