সি # তে উইন্ডোজ ফর্ম ফর্ম বন্ধ করতে এস্কেপ বাটন


94

আমি নিম্নলিখিত চেষ্টা করেছি:

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if ((Keys) e.KeyValue == Keys.Escape)
        this.Close();
}

কিন্তু এটি কাজ করে না।

তারপরে আমি এটি চেষ্টা করেছি:

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    if (e.KeyCode == Keys.Escape)
        this.Close();
}

এবং এখনও কিছুই কাজ করছে না।

আমার উইন্ডোজ ফর্মগুলির বৈশিষ্ট্যগুলির কীপ্রিভিউ সত্য হিসাবে সেট করা আছে ... আমি কী ভুল করছি?


4
আপনি কি এই পদ্ধতিগুলিতে ব্রেকপয়েন্ট স্থাপন করার চেষ্টা করেছেন? ইভেন্ট হ্যান্ডলার এমনকি গুলি চালানো হয়?
স্টিভ ড্যানার

4
ফর্ম সম্পত্তি 'বাতিল করা বাটন' এর মতো আপনার বাতিল বোতামটির নাম রাখবেন না। অন্যথায় মনে হচ্ছে আপনি বাতিল করা বাটন সেট করতে পারবেন না।
জোনাস মিডেনডরফ

@ স্টিভড্যানার, ইভেন্টটি ট্রিগার হবে না। সম্ভবত প্রাথমিক সূচনা () এর ঘোষণার বিষয়টি অনুপস্থিত।
ইনফ্যান্টপ্রো'আরবিন্দ

আমি মনে করি যে এটি কাজ না করার কারণটি ফর্মের অভ্যন্তরে অন্যান্য নিয়ন্ত্রণগুলি ফোকাস পেয়েছে ...
Itsho

উত্তর:


200

এই সবসময় কাজ করবে সঠিক ইভেন্ট হ্যান্ডলার নিয়োগ নির্বিশেষে, KeyPreview, CancelButton, ইত্যাদি:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if (keyData == Keys.Escape) {
        this.Close();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

10
-1, ফর্মের বাতিল করা বাটন সম্পত্তি ব্যবহার করা সঠিক উপায়।
এবিসিডি

14
উঘ, 1980 এর দশকে বলা হয়েছিল, তারা তাদের ডায়লগ বাক্সটি ফিরে চায়।
হান্স প্যাস্যান্ট

4
কীটি হ্যান্ডল করা trueহয়েছে ProcessCmdKeyএমন সিগন্যাল থেকে আপনি ফিরে আসতে পারেন , তাই "ডিং" শব্দটি রোধ করে।
স্পোকি

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

4
এই বিকল্পটি ভাল। বাতিলবাটন ফর্মের অতিরিক্ত দৃশ্যমান 'বাতিল' বোতামের প্রয়োজন । এটি
রিডান্ট্যান্ট

64

আপনি কেবল CancelButtonআপনার বাতিল বোতামে ফর্মটির সম্পত্তি সেট করতে সক্ষম হবেন এবং তারপরে আপনার কোনও কোডের প্রয়োজন হবে না।


4
আমি তা করেছিলাম কিন্তু এসকি চাপলে তা বরখাস্ত করা হয় না, কেন?
মিহাই ব্রাটুলেসকু

এটি আমার জন্য কাজ করে মহান। ছোট ফর্মগুলির জন্য অনেক ভাল।
knut

15

ধরে নিই যে আপনার কাছে একটি "বাতিল করুন" বাটন রয়েছে, ফর্মটির CancelButtonসম্পত্তি সেট করে (হয় ডিজাইনার বা কোডে) স্বয়ংক্রিয়ভাবে এটির যত্ন নেওয়া উচিত। Clickবোতামটির ইভেন্টে কোডটি বন্ধ করার জন্য রাখুন ।


9

গৃহীত উত্তরটি সত্যই সঠিক, এবং আমি এই পদ্ধতিটি বেশ কয়েকবার ব্যবহার করেছি। হঠাৎ, এটি আর কাজ করবে না, তাই আমি এটি অদ্ভুত বলে মনে করি। বেশিরভাগ কারণে যে আমার ব্রেকপয়েন্টটি ESCকীটির জন্য হিট হবে না , তবে এটি অন্য কীগুলির জন্য হিট হবে।

ডিবাগিংয়ের পরে আমি জানতে পারি যে আমার ফর্ম থেকে একটি নিয়ন্ত্রণ ProcessCmdKeyএই কোড সহ ওভাররাইড পদ্ধতি ছিল :

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // ...
    if (keyData == (Keys.Escape))
    {
        Close();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

... এবং এটি আমার ফর্মটি ESCকীটি পেতে বাধা দিচ্ছিল (লক্ষ্য করুন return true)। সুতরাং নিশ্চিত করুন যে কোনও শিশু নিয়ন্ত্রণ আপনার ইনপুট গ্রহণ করছে না।


আমার মাথার উপরে, অফ নিশ্চিত না যদি আপনি সত্যতে সেট ফর্ম KeyPreview করতে হবে - msdn.microsoft.com/en-us/library/...
Andez

আমার উইনফর্মের তালিকাগুলি নিয়ন্ত্রণের সাথে আমি এই সমস্যার মুখোমুখি হচ্ছি। আমি ভাবছি যদি এটি তালিকাভিউ হয় তবে আপনিও সমস্যাটি দেখেছেন?
রেডদেবাস

2

আপনি আপনার ফর্ম বিকল্পগুলিতে কীপ্রিভিউটিকে সত্য হিসাবে সেট করেছেন এবং তারপরে আপনি এতে কীপ্রেস ইভেন্টটি যুক্ত করেন। আপনার কীপ্রেস ইভেন্টে আপনি নিম্নলিখিত টাইপ করুন:

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 27)
    {
        Close();
    }
}

key.Char == 27 ASCII কোডে পলায়নের মান।


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

0

এস্কেপ বোতামের সাহায্যে আপনি কী পালাতে চান? আপনার কোড বিচার করে আমি মনে করি আপনি কি চান। আপনি অ্যাপ্লিকেশনও চেষ্টা করতে পারেন x এক্সিট (), কিন্তু ক্লোজ কাজ করা উচিত। আপনার কি কোনও শ্রমিকের সুতো আছে? যদি কোনও ব্যাকগ্রাউন্ড থ্রেড চলমান থাকে তবে এটি অ্যাপ্লিকেশনটি উন্মুক্ত রাখতে পারে।


0

আপনার এটিকে ইভেন্ট "কীআপ" এ যুক্ত করতে হবে।

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if(e.KeyCode == Keys.Escape)
        {
            this.Close();
        }
    }

0

আপনি অন্য কিছু ফর্ম ট্রিগার করতে পারেন।

উদাহরণস্বরূপ, যদি আপনি ফর্ম বাতিলবাটন সম্পত্তিটি সম্পাদনা করেন এবং বোতামটি বাতিল করে সেট করেন তবে একটি বাতিল-বাটনটি ট্রিগার করুন।

কোডটিতে আপনি বাতিল বোতামটি ফর্মটি বন্ধ করার জন্য নীচে অনুসরণ করছেন:

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.