কনটেক্সটমেনুস্ট্রিপ কী ব্যবহার করা হয়েছিল তা নির্ধারণ করুন


85

আমার কাছে একটি রয়েছে ContextMenuStripযা বেশ কয়েকটি বিভিন্ন তালিকা বাক্সে নির্ধারিত হয়। আমি এটি ব্যবহার করার সময় ContextMenuStripকী ক্লিক ListBoxকরা হয়েছিল তা সনাক্ত করার চেষ্টা করছি । আমি নীচের কোডটি শুরু হিসাবে চেষ্টা করেছি কিন্তু এটি কার্যকর হচ্ছে না। senderসঠিক মূল্য আছে, কিন্তু যখন আমি এটি দায়িত্ব অর্পণ করা চেষ্টা menuSubmittedএটা নাল হয়।

private void MenuViewDetails_Click(object sender, EventArgs e)
{
    ContextMenu menuSubmitted = sender as ContextMenu;
    if (menuSubmitted != null)
    {
        Control sourceControl = menuSubmitted.SourceControl;
    }
}

যেকোনো সাহায্যই অসাধারণ. ধন্যবাদ

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

private void MenuViewDetails_Click(object sender, EventArgs e)
        {
            ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
            if (menuItem != null)
            {
                ContextMenuStrip calendarMenu = menuItem.Owner as ContextMenuStrip;

                if (calendarMenu != null)
                {
                    Control controlSelected = calendarMenu.SourceControl;
                }
            }
        }

সমাধান আমি খুঁজছিলাম জন্য ধন্যবাদ। আমারও একই সমস্যা ছিল তবে আমি পরামর্শ দিচ্ছি ifstatements সমস্ত বিবৃতি নেস্টেল না করে এবং if (menuItem == null) return;আপনি যদি আমার মতো হন এবং ব্যবহার না করেন তবে আপনার কোডটি এটির চেয়ে বেশি ব্যবহারের অযাচিত 2 স্তরের বাসা বাঁধতে চায় না।
শন কোভাক

উত্তর:


126

একটির জন্য ContextMenu:

সমস্যাটি হ'ল senderপ্যারামিটারটি প্রসঙ্গ মেনুতে থাকা আইটেমটির দিকে ইঙ্গিত করে, প্রসঙ্গ মেনু নিজেই নয়।

এটি একটি সহজ ফিক্স, কারণ প্রত্যেকটি MenuItemএকটি GetContextMenuপদ্ধতি প্রকাশ করে যা আপনাকে জানায় ContextMenuযে সেই মেনু আইটেমটি রয়েছে।

আপনার কোডটি নিম্নলিখিতটিতে পরিবর্তন করুন:

private void MenuViewDetails_Click(object sender, EventArgs e)
{
    // Try to cast the sender to a MenuItem
    MenuItem menuItem = sender as MenuItem;
    if (menuItem != null)
    {
        // Retrieve the ContextMenu that contains this MenuItem
        ContextMenu menu = menuItem.GetContextMenu();

        // Get the control that is displaying this context menu
        Control sourceControl = menu.SourceControl;
    }
}

একটির জন্য ContextMenuStrip:

আপনি কিছু ContextMenuStripপরিবর্তে একটি ব্যবহার করেন এটি কিছুটা পরিবর্তন করে ContextMenu। দুটি নিয়ন্ত্রণ একে অপরের সাথে সম্পর্কিত নয় এবং একটির উদাহরণ একে অপরের উদাহরণে কাস্ট করা যায় না।

আগের মতো, ক্লিক করা আইটেমটি এখনও senderপ্যারামিটারে ফিরে আসে , সুতরাং আপনাকে ContextMenuStripপৃথক মেনু আইটেমটির মালিকানা নির্ধারণ করতে হবে । আপনি Ownerসম্পত্তি সঙ্গে এটি । অবশেষে, আপনি নিয়ন্ত্রণটি কোন নিয়ন্ত্রণের মেনুটি প্রদর্শন করছে তা নির্ধারণ করতে SourceControlসম্পত্তিটি ব্যবহার করবেন ।

আপনার কোডটি এভাবে পরিবর্তন করুন:

private void MenuViewDetails_Click(object sender, EventArgs e)
{
     // Try to cast the sender to a ToolStripItem
     ToolStripItem menuItem = sender as ToolStripItem;
     if (menuItem != null)
     {
        // Retrieve the ContextMenuStrip that owns this ToolStripItem
        ContextMenuStrip owner = menuItem.Owner as ContextMenuStrip;
        if (owner != null)
        {
           // Get the control that is displaying this context menu
           Control sourceControl = owner.SourceControl;
        }
     }
 }

@ ব্লুয়েফিট: তারপরে আপনার আর কিছু ভুল আছে। আমি এই কোডটি তিনটি ভিন্ন তালিকার বাক্সের সাথে সন্ধান করেছি, এবং সবকিছু প্রত্যাশা অনুযায়ী কাজ করেছে। আরও কিছু তিরস্কার কোড পোস্ট করুন।
কোডি গ্রে

4
@ ব্লুফিট: আমি আমার উত্তরে কোডটি আপডেট করেছি। তার মাঝে একটি বড় পার্থক্য ContextMenuএবং ContextMenuStrip। (আহা, এবং আমি দেখতে পাচ্ছি যে আপনি এটি ইতিমধ্যে খুঁজে পেয়েছেন Well আপনার নিজের জিনিস শিখতে আরও ভাল!)
কোডি গ্রে

4
আমি সোর্সকন্ট্রোলটি রেকর্ড করতে খোলার ইভেন্টটি ব্যবহার করেছি যা একটি স্থানীয় ভেরিয়েবলটিতে মেনুটি খোলায় এবং তারপরে আইটেম ক্লিকগুলি পরিচালনা করার সময় সেটি উল্লেখ করে।
কুইকড্যাঞ্জার

4
@ কিকড্যাঞ্জার হ্যাঁ, SourceControlদুঃখের সাথে শূন্য হয়ে গেছে যে মুহুর্তে Clickএকটি ToolStripItemসাব-আইটেমের একটি ঘটনা ContextMenuStripবহিষ্কার করা হয়েছে। মনে হচ্ছে যে ContextMenuStripএর Closedঘটনা দাবানল সামনে যে Clickঘটনা, যা সম্ভবত কি সমস্যা ঘটায় হয়; আমি ধরে নিই সম্পত্তিটি বন্ধ হয়ে যাওয়ার পরে সম্পত্তিটি সাফ হয়ে গেছে।
নাইয়ারগডস

4
@ কোডি গ্রে প্রকৃতপক্ষে, গাছটি গভীরতর হলে আপনাকে OwnerItemসম্পত্তিটির চেইনটি লুপ আপ করতে হবে যতক্ষণ না আপনি তার সম্পত্তির ToolStripItemকোনও সন্ধান ContextMenuStripপান Owner। তবে আমি যেমন মন্তব্য করেছি, এটি কাজ করে না; SourceControlপ্রসঙ্গ মেনুতে নাল হতে হবে। আপনি বলেছিলেন যে আপনি এটি পুনরুত্পাদন করতে পারবেন না যদিও ... সমস্যাটি কেবলমাত্র এক স্তর থেকেও বেশি মেনুতে ঘটে? খনি দুটি উপ-স্তরের গভীর ছিল।
নাইয়ারগডস

4

পুরানো পোস্ট, তবে আমার মতো কেউ যদি এটির সামনে আসে:

একটি কনটেক্সটমেনুস্ট্রিপের জন্য, উপরেরগুলি আমার পক্ষে কাজ করে না, তবে এটি কী করেছিল তা সন্ধানের দিকে নিয়ে যায়।

void DeleteMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    ContextMenuStrip menu = sender as ContextMenuStrip;
    Control sourceControl = menu.SourceControl;
    MessageBox.Show(sourceControl.Name);
}

এটি আমাকে প্রত্যাশিত নিয়ন্ত্রণের নাম দিয়েছে। আপনি যদি বিবৃতি দিয়ে বৈধতা ইত্যাদি রাখতে পারেন, আমি ঠিক পয়েন্ট পেতে পোস্ট করছি।


এটি কেবল একটিতে সরাসরি আইটেমগুলির সাথে কাজ করে ContextMenu। সমস্যাটি হ'ল সাব-মেনু আইটেমগুলিতেItemClicked ক্লিক করার সময় আগুন জ্বলে না ; তাদের নিজস্ব ইভেন্ট প্রয়োজন যা মেনু নয়, প্রেরক হিসাবে আইটেমটি নিজেই থাকবে। Click
নায়ারগডস

3

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

একটি প্রসঙ্গমেনু স্ট্রিপের জন্য:

    Control _sourceControl = null;
    private void contextMenuStrip_Opened(object sender, EventArgs e)
    {
        _sourceControl = contextMenuStrip.SourceControl;
    }

    private void contextMenuItem_Click(object sender, EventArgs e)
    {
        var menuItem = (ToolStripMenuItem)sender;

        _sourceControl.Text = menuItem.Text;
        MessageBox.Show(menuItem.Name);
        MessageBox.Show(sourceControl.Name);
    }

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