This is a migrated thread and some comments may be shown as answers.

Adding a Custom Button to RadWindow Titlebar

9 Answers 514 Views
Dock
This is a migrated thread and some comments may be shown as answers.
Brian Bates
Top achievements
Rank 1
Brian Bates asked on 17 Aug 2011, 04:00 PM
See Article: http://www.telerik.com/support/kb/aspnet-ajax/window/adding-a-custom-button-to-radwindow-titlebar.aspx

I would like to know how to add a custom print button to RadWindow for WinForms.

For example how to implement a print button in my window titlebar. Some typical scenarios include implementing help or print button based on this functionality.

I would like to add buttons to the windows that I am using in a RadDock.  It it possible in WinForms?

9 Answers, 1 is accepted

Sort by
0
Alexander
Telerik team
answered on 19 Aug 2011, 04:16 PM
Hello Brian,

Thank you for your question.

To accomplish your scenario you can add a RadButtonElement to the TitleBar of RadDock control's FloatingWindows. I have attached a sample project for your reference.

Please write back if you have additional questions.

Best regards,
Alexander
the Telerik team

Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get now >>

0
Brian Bates
Top achievements
Rank 1
answered on 22 Aug 2011, 01:05 PM
Alexander,

Thank you for your response, and this will work perfectly, but is there a way to keep the button even when the window is docked?
0
Alexander
Telerik team
answered on 25 Aug 2011, 08:35 AM
Hello Brian,

Thank you for writing back.

I have attached an updated project which adds print buttons to docked ToolWindows. Please let me know if I can assist you further.

Kind regards,
Alexander
the Telerik team

Thank you for being the most amazing .NET community! Your unfailing support is what helps us charge forward! We'd appreciate your vote for Telerik in this year's DevProConnections Awards. We are competing in mind-blowing 20 categories and every vote counts! VOTE for Telerik NOW >>

0
Hesham Desouky
Top achievements
Rank 2
answered on 13 Nov 2011, 05:09 PM
Thanks for the code.

One more assistance required. How can I position the button element to the left of the auto-hide element
0
Alexander
Telerik team
answered on 16 Nov 2011, 10:42 AM
Hello Hesham,

Thank you for contacting me again.

The auto-hide elements of RadDock are elements of the RadPageView control which do not allow inserting additional items. This feature request has been added to our PITS and we will implement it in a future release if more customers request it.

Best regards,
Alexander
the Telerik team

Q2’11 SP1 of RadControls for WinForms is available for download (see what's new); also available is the Q3'11 Roadmap for Telerik Windows Forms controls.

0
John Crumpton
Top achievements
Rank 1
answered on 30 Nov 2011, 06:44 PM
How would you wire the events up? The code that creates the button is on the parent (dock host), but the button itself is on the child windows. The handler would need to be in the code behind for the child windows (in my case they are user controls), but i dont see how to wire those events up.
0
Alexander
Telerik team
answered on 02 Dec 2011, 05:00 PM
Hello John,

Thank you for writing.

The buttons in this solution are created at run time and you can add handlers for their events when you create the buttons. In case you need to handle these events outside the form/user control which contains them, you can create custom events and raise them using the buttons event handlers.

I hope it helps in your scenario.

Best regards,
Alexander
the Telerik team

Q3’11 of RadControls for WinForms is available for download (see what's new). Get it today.

0
John Crumpton
Top achievements
Rank 1
answered on 03 Dec 2011, 11:55 AM
I do have it working, but what I did looks a bit (maybe more than a bit) kludgy...

From your example:
private void AddButtons(DockWindow window)
      {
          if (window.DockState == DockState.Hidden || window.DockState == DockState.TabbedDocument)
          {
              return;
          }
 
          DockLayoutPanel panel = ((ToolTabStrip)window.TabStrip).CaptionElement.Children[2] as DockLayoutPanel;
          if (panel.Children.Count < 5)
          {
              RadButtonElement btnRefresh = new RadButtonElement();
              btnRefresh.Image = refreshImage;
              btnRefresh.ToolTipText = "Refresh Data";
              btnRefresh.Name = "btnRefresh_" + window.Name.ToString();
              btnRefresh.Click += new EventHandler(RefreshDashlet);
              panel.Children.Insert(3, btnRefresh);
 
              RadButtonElement btnGroup = new RadButtonElement();
              btnGroup.Image = toolImage;
              btnGroup.Name = "btnGroup_" + window.Name.ToString();
              btnGroup.Click += new EventHandler(ShowConfig);
              btnGroup.ToolTipText = "Select Group";
              panel.Children.Insert(3, btnGroup);
          }
      }

in the form which contains the Rad Dock control:
public void ShowConfig(object sender, EventArgs e)
   {
       try
       {
           RadButtonElement btnGroup = (RadButtonElement)sender;
           string dl = btnGroup.Name.Split('_')[2];
           foreach (HostWindow window in this.DockHost.DockWindows)
           {
               string cname = window.Name.Split('_')[0];
               string g = window.Name.Split('_')[1];
               if (g == dl)
               {
                   switch (cname)
                   {
                       case "NewOpportunities":
                           Dashlets.NewOpportunities dash = (Dashlets.NewOpportunities)window.Content;
                           dash.ShowConfig();
                           return;
                   }
 
               }
           }
       }
       catch (Exception ex)
       { }
   }

.ShowConfig is a public method of the user control hosted in the dock window.
I'm not really happy with this, but it does work.
I don't see how I can directly wire the event since the new EventHandler method expects me to pass a method that exists on the same form... not in the user control that doesn't exist until runtime
btnRefresh.Click += new EventHandler(RefreshDashlet);
0
Alexander
Telerik team
answered on 07 Dec 2011, 01:28 PM
Hello John,

Thank you for sharing your solution. A second approach to handle the buttons click event in your form is to create an event in the user control:
public delegate void ButtonClickedEventHandler(object sender, ButtonClickedEventArgs e);
public event ButtonClickedEventHandler ButtonClicked;
 
public class ButtonClickedEventArgs : EventArgs
{
    public readonly RadButtonElement Button;
 
    public ButtonClickedEventArgs(RadButtonElement button)
    {
        this.Button = button;
    }
}

The event arguments in the above snippet are just an example. You can include in them any useful in your case data.

Then you can raise this event when a button is clicked:
DockLayoutPanel panel = ((ToolTabStrip)window.TabStrip).CaptionElement.Children[2] as DockLayoutPanel;
if (panel.Children.Count < 5)
{
    RadButtonElement radButtonElement = new RadButtonElement();
    radButtonElement.Click += new EventHandler(radButtonElement_Click);
    radButtonElement.Text = "Print";
    panel.Children.Insert(3, radButtonElement);
}
 
//...
 
private void radButtonElement_Click(object sender, EventArgs e)
{
    if (this.ButtonClicked != null)
    {
        this.ButtonClicked(this, new ButtonClickedEventArgs((RadButtonElement)sender));
    }
}

And you can add a handler to this user control event in your form.

Honestly, I am not sure if this approach is more convenient for your case than the one you described. Basically, these two approaches seem to be the most practical for this solution.

Best regards,
Alexander
the Telerik team

Q3’11 of RadControls for WinForms is available for download (see what's new). Get it today.

Tags
Dock
Asked by
Brian Bates
Top achievements
Rank 1
Answers by
Alexander
Telerik team
Brian Bates
Top achievements
Rank 1
Hesham Desouky
Top achievements
Rank 2
John Crumpton
Top achievements
Rank 1
Share this question
or