Restore Closed MDI Window

6 posts, 0 answers
  1. Kenneth
    Kenneth avatar
    8 posts
    Member since:
    Jul 2010

    Posted 12 Jan 2012 Link to this post

    I have a RadDock  on my main form.  Within this RadDock I create multiple Forms that are create via the following code according to the MDI section of the RadDock documentation,

             messageGenerationForm = new MessageGenerationForm( this );
             messageGenerationForm.Text = "Message Generation";
             messageGenerationForm.MdiParent = this;
             messageGenerationForm.Show();

    I set the CloseAction to be Hidden.

    They are created as ToolWindows so they can be undocked from the form.  If they are closed, I want to have a menu item that will allow them to be restored.  How is this to be done?


    Ken...
  2. Julian Benkov
    Admin
    Julian Benkov avatar
    1135 posts

    Posted 17 Jan 2012 Link to this post

    Hi Kenneth,

    To support this functionality, you can create a FindWindows method and populate your menu items depending on the the result. The search criteria is based on your concrete type, in your case MessageGenerationForm. To display some ToolWindows or a collection of windows, you can use DisplayWindow / DisplayWindows API of RadDock control. Here is a simple implementation:
    private void DisplayAllWindows(ToolWindow[] windows)
    {
        foreach (var item in windows)
        {
            this.radDock1.DisplayWindow(item);
        }
     
        //or
        this.radDock1.DisplayWindows(windows);
    }
     
    private ToolWindow[] FindWindows(Type type)
    {
        List<ToolWindow> windows = new List<ToolWindow>();
        foreach (ToolWindow item in this.radDock1.DockWindows)
        {
            if (item.Controls.Count > 0 && item.Controls[0].GetType() == type)
            {
                windows.Add(item);
            }
        }
     
        return windows.ToArray();
    }

    I hope this helps.

    All the best,
    Julian Benkov
    the Telerik team

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

  3. UI for WinForms is Visual Studio 2017 Ready
  4. Kenneth
    Kenneth avatar
    8 posts
    Member since:
    Jul 2010

    Posted 18 Jan 2012 Link to this post

    This doesn't work for me.  Let me try to provide more details to see if you can duplication my situation.  I have my radDock.MdiChildrenDockType set to ToolWindow.  AutoDetectMdiChildren is set to true.  When I try your example, the list is returning types of HostWindow, not ToolWindow.  I can see the two names below in the radDock.DockWindows.ToolWindows list by their names.  When I inspect them the window that I deleted has its MdiChild property set to null.  It appears that when I Hide the tabbed window, it is closing the Form.  So, even if I display the tab again, the contents are blank.  I'm not sure if I'm doing tings correctly.


          private void MainForm_Shown( object sender, EventArgs e )
          {
             messageGenerationForm = new MessageGenerationForm( this );
             messageGenerationForm.Text = "Message Generation";
             messageGenerationForm.MdiParent = this;
             messageGenerationForm.Show();

             eventCreationForm = new EventCreationForm( this );
             eventCreationForm.Text = "Event Creation";
             eventCreationForm.MdiParent = this;
             eventCreationForm.Show();

             // Set the EventList in the MessageGenerationForm so it has access to the events.
             messageGenerationForm.EventList = EventCreationForm.EventList;

             // This sets the active window to be the Event Creation form at startup.  Not sure why, but the
             // EventCreationForm is always at index = 0 in the ToolWindows array.
             radDock1.ActiveWindow = radDock1.DockWindows.ToolWindows[0];

             // Set the properties for the tabbed windows so they are consistent.
             foreach( DockWindow window in radDock1.DockWindows.ToolWindows ) {
                window.AllowedDockState = AllowedDockState.All;
                window.DefaultFloatingSize = new System.Drawing.Size( 1122, 913 );
                window.CloseAction = DockWindowCloseAction.Hide;
             }
          }
  5. Julian Benkov
    Admin
    Julian Benkov avatar
    1135 posts

    Posted 23 Jan 2012 Link to this post

    Hi Kenneth,

    In this scenario the auto detected child form is handled like a document window and its Close action disposes it. You can change this behavior by handling the DockWindowAdded event. Consider the sample below: 

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using Telerik.WinControls.UI;
    using Telerik.WinControls.UI.Docking;
     
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            private RadDock radDock = new RadDock();
            private RadButton radButton = new RadButton();
            private ToolWindow toolWindow = new ToolWindow("My Tool");
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                radDock.Dock = DockStyle.Fill;
                this.Controls.Add(radDock);
     
                this.IsMdiContainer = true;
                this.radDock.AutoDetectMdiChildren = true;
                this.radDock.DockWindowAdded += new DockWindowEventHandler(radDock_DockWindowAdded);
     
                Form form = new Form();
                form.Text = "My Form1";
                form.MdiParent = this;
                form.Show();
     
                form = new Form();
                form.Text = "My Form2";
                form.MdiParent = this;
                form.Show();
     
                form = new Form();
                form.Text = "My Form3";
                form.MdiParent = this;
                form.Show();
                 
                this.radDock.DockWindow(toolWindow, DockPosition.Left);
     
                radButton.Text = "Show all windows";
                radButton.Click += new EventHandler(radButton_Click);
                toolWindow.Controls.Add(radButton);
            }
     
            void radDock_DockWindowAdded(object sender, DockWindowEventArgs e)
            {
                if (e.DockWindow.DockState == DockState.TabbedDocument && e.DockWindow is HostWindow)
                {
                    Form form = e.DockWindow.Controls[0] as Form;
                    ToolWindow toolWindow = new ToolWindow(form.Text);
                    toolWindow.Controls.Add(form);
                    toolWindow.AllowedDockState = AllowedDockState.TabbedDocument | AllowedDockState.Hidden;
                    form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                    form.Dock = DockStyle.Fill;
                    this.radDock.AddDocument(toolWindow);
                    toolWindow.CloseAction = DockWindowCloseAction.Hide;
                    e.DockWindow.CloseAction = DockWindowCloseAction.CloseAndDispose;
                    e.DockWindow.Close();
                }
            }
     
            void radButton_Click(object sender, EventArgs e)
            {
                IEnumerable<DockWindow> windows = this.radDock.GetWindows<DockWindow>();
                foreach (var item in windows)
                {
                    if (item.DockState == DockState.Hidden && item.Controls.Count > 0 && item.Controls[0] is Form)
                    {
                        this.radDock.DisplayWindow(item);
                    }
                }
            }
        }
    }

    Please, feel free to contact us, if you have further questions.

    Regards,
    Julian Benkov
    the Telerik team

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

  6. Kenneth
    Kenneth avatar
    8 posts
    Member since:
    Jul 2010

    Posted 31 Jan 2012 Link to this post

    Julian,

    Thanks, this works exactly as I need.

    The only problem is, I don't really understand what you are doing in the radDock_WindowAdded() event handler.  Would you be able to take a few minutes and include comments in the code as to what you are doing and why?

    Is this solution generalizable to the case where I have a RadDock with ToolWindows within each MDI form? 

    I would like to be able to restore ToolWindows within each form, as well as the form itself.


    Ken...
  7. Julian Benkov
    Admin
    Julian Benkov avatar
    1135 posts

    Posted 03 Feb 2012 Link to this post

    Hi Kenneth,

    In the DockWindowAdded I handle the situation when the new MdiChild window is registered to RadDock control and I get the child form, change its properties and insert it in a new ToolWindow and then dispose the previous parent DockWindow. The operation just changes the behavior from DocumentWindow to ToolWindow and prevents the Form from being disposed. I set the FormBorderStyle to None, because otherwise the form will appear with its titlebar in the new ToolWindow. You can use this scenario like a general solution without any issues.

    Another approach is to change properties of the Form as we made in DockWindowAdded, and directly add it in a new ToolWindow. In this situation the AutoDetectMdiChildren and the default MDI Form behavior is not needed.

    I hope this information is useful. Let me know if you need further assistance. 

    Kind regards,
    Julian Benkov
    the Telerik team

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

Back to Top
UI for WinForms is Visual Studio 2017 Ready