কোনও ফর্ম লোড হওয়ার পরে আমি কোডটি কীভাবে সম্পাদন করব?


126

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

কেউ কি সমাধানের পরামর্শ দিতে পারেন?


: এটা এই কহতব্য হতে পারে যদিও এই প্রশ্নের খুব ভাল উত্তর আছে docs.microsoft.com/en-us/dotnet/framework/winforms/...
Rishav

উত্তর:


192

আপনি "প্রদর্শিত" ইভেন্টটি ব্যবহার করতে পারেন: এমএসডিএন - ফর্ম.শাউন

"দেখানো ইভেন্টটি কেবলমাত্র প্রথমবার কোনও ফর্ম প্রদর্শিত হওয়ার পরে উত্থাপিত হয়; পরবর্তীকালে হ্রাস, সর্বাধিকীকরণ, পুনরুদ্ধার, লুকিয়ে রাখা, প্রদর্শন করা বা অবৈধকরণ এবং পুনরায় রঙ করা এই ইভেন্টটিকে বাড়িয়ে তুলবে না।"


10
আমার কাছে মনে হচ্ছে দেখানো হ্যান্ডলারটি কার্যকর হয়েছে যখন ফর্মটি লোড হচ্ছে ... আমি কি ভুল করছি?
ckonig

3
পুরানো তবে সোনার ... হ্যাঁ, আপনি ভুল বলেছেন। জিইউআই সমান্তরাল কাজগুলি চালাতে পারে না, অন্য কিছু কার্যকর করার পরে কিছু করার জন্য কী গুরুত্বপূর্ণ।
ডেনিস জিলোকভস্কি

2
যদি লোড ইভেন্ট হ্যান্ডলারে এমন একটি কোড থাকে যা অ্যাপ্লিকেশনকে কল করে .ডাউনভেন্টস (), লোড ইভেন্ট হ্যান্ডলারের কার্য সম্পাদন শেষ হওয়ার আগে শো ইভেন্টটি প্রজ্বলিত হয়। এটি হ'ল কারণ দেখানো ইভেন্টটি ফর্ম.বেগিনআইভোভাক (শোভেনভেন্ট) এবং ডু ইভেন্টস () লোড শেষ হওয়ার আগেই গুলি চালাতে বাধ্য করে using
আর্টেমিক্স

1
সি # তে আমার পক্ষে কাজ করা যথেষ্ট ছিল না। আমাকে অন্য থ্রেডেShown += Form1_Shown; প্রস্তাবিত হিসাবে যুক্ত করতে হয়েছিল

11
আপনার এটি যুক্ত করা উচিত ef রিফ্রেশ (); আপনার লজিকের আগে প্রথমে দেখানো ইভেন্টটির অভ্যন্তরে এবং এটি আপনার যুক্তিটি চলমান শুরু হওয়ার আগে ফর্মটি পুরোপুরি লোড করার জন্য পুনরায় রিফ্রেশ করবে
আইলিয়ান ক্র্যাস্প

49

আমি মাঝে মাঝে ব্যবহার করি (লোডে)

this.BeginInvoke((MethodInvoker) delegate {
  // some code
});

অথবা

this.BeginInvoke((MethodInvoker) this.SomeMethod);

(যদি আপনি "এটি" ব্যতীত অন্য কোনও ইভেন্টে ইভেন্টটি পরিচালনা করছেন তবে আপনার ফর্ম ভেরিয়েবলটিতে "এটি" পরিবর্তন করুন)।

এটি উইন্ডোজ-ফর্ম লুপের উপর অনুরোধটি পুশ করে, সুতরাং যখন ফর্মটি বার্তা সারিটি প্রক্রিয়াকরণ করছে তখন এটি প্রক্রিয়াজাত হয়।

[অনুরোধে আপডেট করা]

কন্ট্রোল.ইনভোক / কন্ট্রোল.বেগইনভোক পদ্ধতিগুলি থ্রেডিংয়ের সাথে ব্যবহারের উদ্দেশ্যে এবং এটি ইউআই থ্রেডের উপর কাজ ঠেলে দেওয়ার একটি প্রক্রিয়া। সাধারণত এটি কর্মী থ্রেড ইত্যাদি দ্বারা ব্যবহৃত হয়। কন্ট্রোল.আনভোক একটি সিঙ্ক্রোনাস কল করেন, যেখানে-কন্ট্রোল .BeginInvoke একটি অ্যাসিঙ্ক্রোনাস কল করে।

সাধারণত, এগুলি হিসাবে ব্যবহৃত হবে:

SomeCodeOrEventHandlerOnAWorkerThread()
{
  // this code running on a worker thread...
  string newText = ExpensiveMethod(); // perhaps a DB/web call

  // now ask the UI thread to update itself
  this.Invoke((MethodInvoker) delegate {
      // this code runs on the UI thread!
      this.Text = newText;
  });
}

এটি উইন্ডোজ বার্তার কাতারে একটি বার্তা চাপ দিয়ে এটি করে; ইউআই থ্রেড (কোনও এক পর্যায়ে) বার্তাটি ডি-কাতারে ফেলেছে, প্রতিনিধিটিকে প্রসেস করে এবং কর্মীটিকে এটি সম্পন্ন করার ইঙ্গিত দেয় ... এতদূর ভাল ;-p

ঠিক আছে; সুতরাং যদি আমরা কন্ট্রোলটি ব্যবহার করি তবে কি হবে? আমন্ত্রণ / নিয়ন্ত্রণ করুন e এটি কপি করে ... যদি আপনি কন্ট্রোলকে কল করেন nআলোক করুন, এটি জানার জন্য যথেষ্ট বোধগম্য যে বার্তা সারিটি ব্লক করা তাত্ক্ষণিক অচলাবস্থার কারণ হতে পারে - সুতরাং আপনি যদি ইতিমধ্যে ইউআই থ্রেডে থাকেন তবে এটি কেবল অবিলম্বে কোড চালায় ... যাতে আমাদের সাহায্য করে না ...

তবে কন্ট্রোল.বেগিনআইভোক আলাদাভাবে কাজ করে: এটি সর্বদা কাতারে কাজ ঠেলে দেয়, এমনকি এটি আমরা ইতিমধ্যে ইউআই থ্রেডে রয়েছি। এটি "এক মুহুর্তে" বলার সত্যিই সহজ উপায় তৈরি করে, তবে টাইমার ইত্যাদির অসুবিধা ছাড়াই (যা এখনও এখনও একই জিনিসটি করতে হবে!)।


1
এটি পুরোপুরি বুঝতে পারিনি। আপনি কি আরও কিছু ব্যাখ্যা করতে পারেন?
Torbjørn

হাই মার্ক, প্রক্রিয়াটি সম্পূর্ণ হওয়ার সময় কি ফর্মকে প্রতিক্রিয়াশীল করা সম্ভব যা বিগিনিভোকে বলা হয় ??
huMpty duMpty

এটি ডাব্লুপিএফ সমতুল্য কি?
মিড

6

এটি প্রথমবারের পরে "আফটারলোডিং" শুরু
করবে না, এটি পরবর্তী লোড শুরু করার জন্য এটি নিবন্ধভুক্ত করবে।

private void Main_Load(object sender, System.EventArgs e)
{
    //Register it to Start in Load 
    //Starting from the Next time.
    this.Activated += AfterLoading;
}

private void AfterLoading(object sender, EventArgs e)
{
    this.Activated -= AfterLoading;
    //Write your code here.
}

5

আমার একই সমস্যা ছিল, এবং এটি নীচে সমাধান করা হয়েছে:

আসলে আমি বার্তাটি দেখতে চাই এবং এটি 2 সেকেন্ডের পরে স্বয়ংক্রিয়ভাবে বন্ধ করতে চাই। তার জন্য আমাকে সাধারণ ডায়াল (ডায়নামিকভাবে) তৈরি করতে হয়েছিল এবং একটি লেবেল বার্তা দেখাচ্ছে, 1500 এমএসের জন্য বার্তা থামিয়ে দিতে হবে যাতে ব্যবহারকারী এটি পড়তে পারেন। এবং গতিশীলভাবে তৈরি ফর্মটি বন্ধ করুন। লোড ইভেন্টের পরে ইভেন্ট দেখানো হয়। সুতরাং কোড হয়

Form MessageForm = new Form();
MessageForm.Shown += (s, e1) => { 
    Thread t = new Thread(() => Thread.Sleep(1500)); 
    t.Start(); 
    t.Join(); 
    MessageForm.Close(); 
};

2

আপনি নিজের কোডটি ফর্মটির অ্যাক্টিভেটেড ইভেন্টে রাখার চেষ্টা করতে পারেন, আপনি যদি ফর্মটি সক্রিয় করা হয় কেবল তখনই ঘটে থাকে। আপনাকে প্রথমে অ্যাক্টিভেশনটিতে চালিত হওয়ার কথা থাকলেও আপনাকে "বোলিয়ান" কার্যকর করা হয়েছে কিনা তা পরীক্ষা করতে হবে।


1

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

এই ধরণের প্রশ্নের সর্বাধিক সাধারণ কারণ হ'ল যখন কোনও ধারক বা কাস্টম কন্ট্রোল টাইপ কোনও কাস্টম শ্রেণীর বাইরে প্রারম্ভিক বৈশিষ্ট্যগুলিতে অ্যাক্সেস করার চেষ্টা করে যেখানে সেই বৈশিষ্ট্যগুলি এখনও আরম্ভ হয় নি এইভাবে নাল মানগুলি তৈরি হতে পারে এবং এমনকি কোনও নাল রেফারেন্স ব্যতিক্রমও ঘটায় can বস্তুর ধরণে। এর অর্থ হল আপনার ক্লাসটি সম্পূর্ণরূপে আরম্ভ করার আগেই চলমান - আপনি নিজের সম্পত্তি নির্ধারণের কাজ শেষ করার আগে ইত্যাদি this

ফর্ম লোড ইভেন্টের পরে কোডটি কখন কার্যকর করা শুরু হবে সে সম্পর্কে সর্বোত্তম প্রশ্নের উত্তর দেওয়ার জন্য হ'ল ডাব্লুএমপেইন্ট বার্তা নিরীক্ষণ করা বা পেইন্ট ইভেন্টে সরাসরি হুক করা। কেন? পেইন্ট ইভেন্টটি তখনই জ্বলিত হয় যখন সমস্ত মডিউল আপনার ফর্ম লোড ইভেন্টের সাথে পুরোপুরি লোড হয়ে গেছে। দ্রষ্টব্য: এটি.ভিজিবল == সত্য এটি সত্য হিসাবে সেট করা থাকলে সর্বদা সত্য হয় না তাই কোনও ফর্ম আড়াল করা ব্যতীত এটি এ উদ্দেশ্যে ব্যবহার করা হয় না।

ফর্ম লোড ইভেন্টের পরে আপনার কোডটি কার্যকর করতে কীভাবে শুরু করবেন তার সম্পূর্ণ উদাহরণ নীচে। এটি সুপারিশ করা হয় যে আপনি অযথা পেন্ট মেসেজ লুপটি বেঁধে রাখবেন না তাই আমরা এমন একটি ইভেন্ট তৈরি করব যা সেই লুপের বাইরে আপনার কোডটি কার্যকর করতে শুরু করবে।

using System.Windows.Forms;

নেমস্পেস মাইপ্রোগ্রাম স্টার্টিংপ্লেস উদাহরণ {

/// <summary>
/// Main UI form object
/// </summary>
public class Form1 : Form
{

    /// <summary>
    /// Main form load event handler
    /// </summary>
    public Form1()
    {
        // Initialize ONLY. Setup your controls and form parameters here. Custom controls should wait for "FormReady" before starting up too.
        this.Text = "My Program title before form loaded";
        // Size need to see text. lol
        this.Width = 420;

        // Setup the sub or fucntion that will handle your "start up" routine
        this.StartUpEvent += StartUPRoutine;

        // Optional: Custom control simulation startup sequence:
        // Define your class or control in variable. ie. var MyControlClass new CustomControl;
        // Setup your parameters only. ie. CustomControl.size = new size(420, 966); Do not validate during initialization wait until "FormReady" is set to avoid possible null values etc. 
        // Inside your control or class have a property and assign it as bool FormReady - do not validate anything until it is true and you'll be good! 
    }

    /// <summary>
    /// The main entry point for the application which sets security permissions when set.
    /// </summary>
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }


    #region "WM_Paint event hooking with StartUpEvent"            
    //
    // Create a delegate for our "StartUpEvent"
    public delegate void StartUpHandler();
    //
    // Create our event handle "StartUpEvent"
    public event StartUpHandler StartUpEvent;
    //
    // Our FormReady will only be set once just he way we intendded
    // Since it is a global variable we can poll it else where as well to determine if we should begin code execution !!
    bool FormReady;
    //
    // The WM_Paint message handler: Used mostly to paint nice things to controls and screen
    protected override void OnPaint(PaintEventArgs e)
    {
        // Check if Form is ready for our code ?
        if (FormReady == false) // Place a break point here to see the initialized version of the title on the form window
        {
            // We only want this to occur once for our purpose here.
            FormReady = true;
            //
            // Fire the start up event which then will call our "StartUPRoutine" below.
            StartUpEvent();
        }
        //
        // Always call base methods unless overriding the entire fucntion
        base.OnPaint(e);
    }
    #endregion


    #region "Your StartUp event Entry point"
    //
    // Begin executuing your code here to validate properties etc. and to run your program. Enjoy!
    // Entry point is just following the very first WM_Paint message - an ideal starting place following form load
    void StartUPRoutine()
    {
        // Replace the initialized text with the following
        this.Text = "Your Code has executed after the form's load event";
        //
        // Anyway this is the momment when the form is fully loaded and ready to go - you can also use these methods for your classes to synchronize excecution using easy modifications yet here is a good starting point. 
        // Option: Set FormReady to your controls manulaly ie. CustomControl.FormReady = true; or subscribe to the StartUpEvent event inside your class and use that as your entry point for validating and unleashing its code.
        //
        // Many options: The rest is up to you!
    }
    #endregion

}

}


এটি অবিশ্বাস্যরূপে দীর্ঘ-বায়ুযুক্ত বলে মনে হচ্ছে এবং কেবল এটি দেখানো ইভেন্টটি ধরায় কোনও সুবিধা আছে কি?
স্টিভ স্মিথ

0

আমি জানি এটি একটি পুরানো পোস্ট। তবে আমি এখানে এটি কীভাবে করেছি:

    public Form1(string myFile)
    {
        InitializeComponent();
        this.Show();
        if (myFile != null)
        {
            OpenFile(myFile);
        }
    }

    private void OpenFile(string myFile = null)
    {
            MessageBox.Show(myFile);
    }

-9

কিছু সম্পাদনের পরে আপনি আপনার ফর্মটি বন্ধ করতে পারেন ..

//YourForm.ActiveForm.Close ();

    LoadingForm.ActiveForm.Close();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.