Winforms - RadMessageBox - Shortcut keys

9 posts, 2 answers
  1. Duane
    Duane avatar
    37 posts
    Member since:
    Sep 2010

    Posted 03 Mar 2011 Link to this post

    Hi Guys,

    Please can any one advise if there is a way for the RadMessageBox to be set up so when  Yes / No buttons are used, pressing "Y" or "N" on the keyboard will trigger the buttons?

    We are using 2009 Q2 controls.

    Thanks and kind regards,
    Duane.
  2. Answer
    Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 03 Mar 2011 Link to this post

    Hello,

    I don't have access to this version of the controls, but I think this should work (I am using the latest version).

    This is based on setting up a global shortcut on the form, checking to see if the focused control's parent is a RadMessageBox and then setting the dialog result to the chosen value.

    You can find out more about global shortcuts at this help topic

    So, to implement this...
    1: Desfine a shortcut provider that checks for Crtrl+Y and Ctrl+N and if it gets either of these, then as long as the FocusedControl parent is a RadMessageBox, it will send the response.

    MyShortcutProvider
    public class MyShortcutProvider : IShortcutProvider
     {
         private RadShortcutCollection shortcuts;
         private bool registered;
         public MyShortcutProvider()
         {
             this.shortcuts = new RadShortcutCollection(this);
         }
         #region IShortcutProvider Members
         public void OnPartialShortcut(PartialShortcutEventArgs e)
         {
             e.Handled = true;
         }
         public void OnShortcut(ShortcutEventArgs e)
         {
             if (e.FocusedControl.GetType() == typeof(RadButton))
             {
                 var button = e.FocusedControl;
                 if (button != null)
                 {
                     if (button.Parent != null)
                     {
                         if (button.Parent.Name == "RadMessageBox")
                         {
                             RadForm rmBox = (RadForm)button.Parent;
                             if (e.Shortcut.ToString().EndsWith("Y"))
                             {
                                 rmBox.DialogResult = DialogResult.Yes;
                                 e.Handled = true;
                             }
                             else if (e.Shortcut.ToString().EndsWith("N"))
                             {
                                 rmBox.DialogResult = DialogResult.No;
                                 e.Handled = true;
                             }
                         }
                     }
                 
             }
         }
         public void OnShortcutsChanged()
         {
             //Called by the Shortcuts collection when a shortcut is either added or removed from the collection
             //This is used for optimization purposes - e.g. is we do not have shortcuts registered,
             //we do not need to be registered with RadShortcutManager
             if (this.shortcuts.Count > 0)
             {
                 if (!this.registered)
                 {
                     RadShortcutManager.Instance.AddShortcutProvider(this);
                     this.registered = true;
                 }
             }
             else
             {
                 if (this.registered)
                 {
                     RadShortcutManager.Instance.RemoveShortcutProvider(this);
                     this.registered = false;
                 }
             }
         }
         public RadShortcutCollection Shortcuts
         {
             get
             {
                 return this.shortcuts;
             }
         }
         #endregion
     }

    2: In your form, create a class level field to hold the shortcut provider
    MyShortcutProvider provider;

    3: Set up the shortcuts
    public Form1()
    {
        InitializeComponent();
        provider = new MyShortcutProvider();
        provider.Shortcuts.Add(new RadShortcut(Keys.Control, Keys.Y));
        provider.Shortcuts.Add(new RadShortcut(Keys.Control, Keys.N));
    }

    4: On a button press (for example) launch the RadMessageBox to test
    private void radButton1_Click(object sender, EventArgs e)
    {
        DialogResult result = RadMessageBox.Show("Some text", this.Text, MessageBoxButtons.YesNo, RadMessageIcon.Info);
        if (result == System.Windows.Forms.DialogResult.Yes)
        {
            MessageBox.Show("Yes was pressed");
        }
        else if (result == System.Windows.Forms.DialogResult.No)
        {
            MessageBox.Show("No was pressed");
        }
    }

    I hope that helps but let me know if you have any questions
    Richard
  3. Duane
    Duane avatar
    37 posts
    Member since:
    Sep 2010

    Posted 03 Mar 2011 Link to this post

    Hi Richard,

    Thanks for that. It does seem a little long winded having to set that up and then assign the use for EVERY form (providing I have understood correctly!) As we have over 500 forms in our application so it will be a bit of a bind to implement. I'm sure before we changed over to the Telerik controls, the standard MS .Net dialogs worked off the shelf with "Y" and "N" key presses triggering the dialog's buttons.

    I'll will look at implementing your solution though. Thanks again.

    Best regards,

    Duane.

  4. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 03 Mar 2011 Link to this post

    Hello,

    Yes, you have understood correctly and it is quite long. Perhaps that would be a good feature request to submit to Telerik.
    Let me know if you have further questions
    Richard
  5. Answer
    Svett
    Admin
    Svett avatar
    728 posts

    Posted 07 Mar 2011 Link to this post

    Hi Guys,

    @Richard: Thank you for your assistance.
    @Duane: You can also achieve this behavior by setting a custom localization provider that will be used by all message boxes. You can use the following code snippet:

    public class MyRadMessageLocalizationProvider : RadMessageLocalizationProvider
    {
        public override string GetLocalizedString(string id)
        {
            if (id == RadMessageStringID.YesButton)
            {
                return "&Yes";
            }
            else if (id == RadMessageStringID.NoButton)
            {
                return "&No";
            }
     
            return base.GetLocalizedString(id);
        }
    }

    Then you should replace the default localization provider when your application is started:
    RadMessageLocalizationProvider.CurrentProvider = new MyRadMessageLocalizationProvider();

    Finally, you can show the message box anywhere in your application:
    RadMessageBox.Show("Hello", "Test", MessageBoxButtons.YesNo);

    Best wishes,
    Svett
    the Telerik team
    Registration for Q1 2011 What’s New Webinar Week is now open. Mark your calendar for the week starting March 21st and book your seat for a walk through all the exciting stuff we ship with the new release!
  6. Duane
    Duane avatar
    37 posts
    Member since:
    Sep 2010

    Posted 07 Mar 2011 Link to this post

    @Svett:
    Hi Svett, That is brilliant and just what I need. A fair bit easier to implement than Richard example. Implmented and working.



    @Richard: Sorry had to go with Svett's example as easier to implement in such a large project. Thanks for your input though.

    Edited for spellos!
  7. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 07 Mar 2011 Link to this post

    Not at all!! - I wish i had thought of that too... always good to see a neater solution and I've picked up something new too.
    All the best
    Richard
  8. Steve
    Steve avatar
    2 posts
    Member since:
    Apr 2014

    Posted 19 Feb 2015 in reply to Svett Link to this post

    Hi,

    I implemented your solution and now the RadMessageBox shows the shortcut underline for "Y" in Yes, however, pressing the "Y" does not provide any action. Is there something I'm doing wrong?
  9. Dess
    Admin
    Dess avatar
    1949 posts

    Posted 24 Feb 2015 Link to this post

    Hello Steve,

    Thank you for writing.

    Your question has already been answered in the support thread you have opened on the same topic. However, I am posting the answer here as well in order the community to benefit from it. 

    In order to achieve your goal, you need to use RadShortcut. Here is a sample code snippet:
    Private Sub RadButton1_Click(sender As Object, e As EventArgs) Handles RadButton1.Click
        Dim yesButton As RadButton = TryCast(RadMessageBox.Instance.Controls("radButton1"), RadButton)
        If yesButton IsNot Nothing Then
            yesButton.ButtonElement.Shortcuts.Add(New RadShortcut(Nothing, Keys.Y))
        End If
      
        Dim nosButton As RadButton = TryCast(RadMessageBox.Instance.Controls("radButton2"), RadButton)
        If nosButton IsNot Nothing Then
            nosButton.ButtonElement.Shortcuts.Add(New RadShortcut(Nothing, Keys.N))
        End If
      
        Dim dr As DialogResult = RadMessageBox.Show("Some message", "Question", MessageBoxButtons.YesNo)
        Console.WriteLine(dr)
    End Sub

    I hope this information helps. Should you have further questions, I would be glad to help.
     
    Regards,
    Dess
    Telerik
     

    Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.

     
Back to Top