Only dock form once

9 posts, 2 answers
  1. meraj
    meraj avatar
    47 posts
    Member since:
    Dec 2010

    Posted 24 Feb 2011 Link to this post

    How can I ensure that a Form that has been docked to an MDIForm doesn't get docked a 2nd time?  That is, I need a Form to only be visible once.  I tried making it a singleton class, but calling the DockControl of the RadDock still added a same form , though one was an empty shell.
  2. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 24 Feb 2011 Link to this post

    Hello Meraj,

    Please have a look at this forum post which explains a few options in detail.
    Hope that helps
    Richard
  3. UI for WinForms is Visual Studio 2017 Ready
  4. meraj
    meraj avatar
    47 posts
    Member since:
    Dec 2010

    Posted 26 Feb 2011 Link to this post

    Hi Richard,
    My scenario is that i have a MDI form with menu and i am opening the form as per menu click .
  5. Answer
    Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 26 Feb 2011 Link to this post

    Hello Meraj,

    Here is a full exmaple for you using a MainForm (MDI Parent) and two child forms.
    Hope this helps

    Main.Designer.cs
    namespace RadControlsWinFormsApp1
    {
        partial class Main
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components;
      
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
      
            #region Windows Form Designer generated code
      
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.radMenu1 = new Telerik.WinControls.UI.RadMenu();
                this.radMenuItem1 = new Telerik.WinControls.UI.RadMenuItem();
                this.radDock1 = new Telerik.WinControls.UI.Docking.RadDock();
                this.documentContainer1 = new Telerik.WinControls.UI.Docking.DocumentContainer();
                this.radMenuItem2 = new Telerik.WinControls.UI.RadMenuItem();
                ((System.ComponentModel.ISupportInitialize)(this.radMenu1)).BeginInit();
                ((System.ComponentModel.ISupportInitialize)(this.radDock1)).BeginInit();
                this.radDock1.SuspendLayout();
                ((System.ComponentModel.ISupportInitialize)(this.documentContainer1)).BeginInit();
                this.SuspendLayout();
                // 
                // radMenu1
                // 
                this.radMenu1.Items.AddRange(new Telerik.WinControls.RadItem[] {
                this.radMenuItem1,
                this.radMenuItem2});
                this.radMenu1.Location = new System.Drawing.Point(0, 0);
                this.radMenu1.Name = "radMenu1";
                this.radMenu1.Size = new System.Drawing.Size(548, 20);
                this.radMenu1.TabIndex = 1;
                this.radMenu1.Text = "radMenu1";
                // 
                // radMenuItem1
                // 
                this.radMenuItem1.Name = "radMenuItem1";
                this.radMenuItem1.Text = "Launch Child Form";
                this.radMenuItem1.Click += new System.EventHandler(this.radMenuItem1_Click);
                // 
                // radDock1
                // 
                this.radDock1.AutoDetectMdiChildren = true;
                this.radDock1.Controls.Add(this.documentContainer1);
                this.radDock1.Dock = System.Windows.Forms.DockStyle.Fill;
                this.radDock1.DocumentManager.DocumentInsertOrder = Telerik.WinControls.UI.Docking.DockWindowInsertOrder.InFront;
                this.radDock1.IsCleanUpTarget = true;
                this.radDock1.Location = new System.Drawing.Point(0, 20);
                this.radDock1.MainDocumentContainer = this.documentContainer1;
                this.radDock1.Name = "radDock1";
                this.radDock1.Padding = new System.Windows.Forms.Padding(5);
                // 
                // 
                // 
                this.radDock1.RootElement.MinSize = new System.Drawing.Size(25, 25);
                this.radDock1.Size = new System.Drawing.Size(548, 424);
                this.radDock1.SplitterWidth = 4;
                this.radDock1.TabIndex = 2;
                this.radDock1.TabStop = false;
                this.radDock1.Text = "radDock1";
                // 
                // documentContainer1
                // 
                this.documentContainer1.Location = new System.Drawing.Point(5, 5);
                this.documentContainer1.Name = "documentContainer1";
                // 
                // 
                // 
                this.documentContainer1.RootElement.MinSize = new System.Drawing.Size(25, 25);
                this.documentContainer1.Size = new System.Drawing.Size(538, 414);
                this.documentContainer1.SizeInfo.SizeMode = Telerik.WinControls.UI.Docking.SplitPanelSizeMode.Fill;
                this.documentContainer1.SplitterWidth = 4;
                this.documentContainer1.TabIndex = 0;
                this.documentContainer1.TabStop = false;
                // 
                // radMenuItem2
                // 
                this.radMenuItem2.Name = "radMenuItem2";
                this.radMenuItem2.Text = "Launch Child Form 2";
                this.radMenuItem2.Click += new System.EventHandler(this.radMenuItem2_Click);
                // 
                // Main
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(548, 444);
                this.Controls.Add(this.radDock1);
                this.Controls.Add(this.radMenu1);
                this.IsMdiContainer = true;
                this.Name = "Main";
                this.Text = "Form1";
                this.Load += new System.EventHandler(this.Main_Load);
                ((System.ComponentModel.ISupportInitialize)(this.radMenu1)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.radDock1)).EndInit();
                this.radDock1.ResumeLayout(false);
                ((System.ComponentModel.ISupportInitialize)(this.documentContainer1)).EndInit();
                this.ResumeLayout(false);
                this.PerformLayout();
      
            }
      
            #endregion
      
            private Telerik.WinControls.UI.RadMenu radMenu1;
            private Telerik.WinControls.UI.RadMenuItem radMenuItem1;
            private Telerik.WinControls.UI.Docking.RadDock radDock1;
            private Telerik.WinControls.UI.Docking.DocumentContainer documentContainer1;
            private Telerik.WinControls.UI.RadMenuItem radMenuItem2;
        }
    }

    Main.cs
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Telerik.WinControls.UI.Docking;
      
    namespace RadControlsWinFormsApp1
    {
        public partial class Main : Form
        {
            public Main()
            {
                InitializeComponent();
            }
      
            private void radMenuItem1_Click(object sender, EventArgs e)
            {
                  
                ChildForm childForm = ChildForm.Instance;
                if (childForm.Parent == null)
                {
                    childForm.MdiParent = this;
                    childForm.Show();
                }
                else
                {
                    this.radDock1.ActivateMdiChild(childForm);
                }  
            }
      
            private void radMenuItem2_Click(object sender, EventArgs e)
            {
                ChildForm2 childForm2 = ChildForm2.Instance;
                if (childForm2.Parent == null)
                {
                    childForm2.MdiParent = this;
                    childForm2.Show();
                }
                else
                {
                    this.radDock1.ActivateMdiChild(childForm2);
                
            }
      
            private void Main_Load(object sender, EventArgs e)
            {
      
            }
        }
    }


    ChildForm.Designer.cs
    namespace RadControlsWinFormsApp1
    {
        partial class ChildForm
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
      
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
      
            #region Windows Form Designer generated code
      
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.radLabel1 = new Telerik.WinControls.UI.RadLabel();
                ((System.ComponentModel.ISupportInitialize)(this.radLabel1)).BeginInit();
                this.SuspendLayout();
                // 
                // radLabel1
                // 
                this.radLabel1.Location = new System.Drawing.Point(13, 13);
                this.radLabel1.Name = "radLabel1";
                this.radLabel1.Size = new System.Drawing.Size(99, 16);
                this.radLabel1.TabIndex = 0;
                this.radLabel1.Text = "I am the child form";
                // 
                // ChildForm
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(284, 262);
                this.Controls.Add(this.radLabel1);
                this.Name = "ChildForm";
                this.Text = "ChildForm";
                this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.ChildForm_FormClosed);
                ((System.ComponentModel.ISupportInitialize)(this.radLabel1)).EndInit();
                this.ResumeLayout(false);
                this.PerformLayout();
      
            }
      
            #endregion
      
            private Telerik.WinControls.UI.RadLabel radLabel1;
        }
    }

    ChildForm.cs
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
      
    namespace RadControlsWinFormsApp1
    {
        public partial class ChildForm : Form
        {
            private static ChildForm instance;
      
            private ChildForm()
            {
                InitializeComponent();
            }
      
            public static ChildForm Instance
            {
                get
                {
                    if (instance == null)
                    {
                        instance = new ChildForm();
                    }
                    return instance;
                }
            }
      
            private void ChildForm_FormClosed(object sender, FormClosedEventArgs e)
            {
                instance.Dispose();
                instance = null;
            }
      
        }
    }


    ChildForm2.Designer.cs
    namespace RadControlsWinFormsApp1
    {
        partial class ChildForm2
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
      
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
      
            #region Windows Form Designer generated code
      
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.radLabel1 = new Telerik.WinControls.UI.RadLabel();
                ((System.ComponentModel.ISupportInitialize)(this.radLabel1)).BeginInit();
                this.SuspendLayout();
                // 
                // radLabel1
                // 
                this.radLabel1.Location = new System.Drawing.Point(22, 13);
                this.radLabel1.Name = "radLabel1";
                this.radLabel1.Size = new System.Drawing.Size(96, 16);
                this.radLabel1.TabIndex = 0;
                this.radLabel1.Text = "I am Child Form 2";
                // 
                // ChildForm2
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(284, 262);
                this.Controls.Add(this.radLabel1);
                this.Name = "ChildForm2";
                this.Text = "ChildForm2";
                this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.ChildForm2_FormClosed);
                ((System.ComponentModel.ISupportInitialize)(this.radLabel1)).EndInit();
                this.ResumeLayout(false);
                this.PerformLayout();
      
            }
      
            #endregion
      
            private Telerik.WinControls.UI.RadLabel radLabel1;
        }
    }

    ChildForm2.cs
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
      
    namespace RadControlsWinFormsApp1
    {
        public partial class ChildForm2 : Form
        {
            private static ChildForm2 instance;
      
            private ChildForm2()
            {
                InitializeComponent();
            }
      
            public static ChildForm2 Instance
            {
                get
                {
                    if (instance == null)
                    {
                        instance = new ChildForm2();
                    }
                    return instance;
                }
            }
      
            private void ChildForm2_FormClosed(object sender, FormClosedEventArgs e)
            {
                instance.Dispose();
                instance = null;
            }
        }
    }

    Let me know if you have any questions
    Richard
  6. meraj
    meraj avatar
    47 posts
    Member since:
    Dec 2010

    Posted 27 Feb 2011 Link to this post

    Thank You Richard,
                               Its very useful.
  7. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 27 Feb 2011 Link to this post

    You're welcome. Please remember to mark as answer.
  8. Answer
    Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 27 Feb 2011 Link to this post

    Hello Meraj, Richard

    I would suggest a different approach because you do not always have the luxury to make a singleton out of a form, or in general change the structure of the form,

    I believe there is an easier way of doing this, just before adding a new form you can check if that form is already part of the MdiChildren collection and just creating and adding it if it's not, like so:

    using System.Drawing;
    using System.Linq;
    using System.Windows.Forms;
    using Telerik.WinControls.UI;
    using Telerik.WinControls.UI.Docking;
     
    public class Form1 : Form
    {
        private RadDock radDock1;
     
        private RadMenu radMenu1;
     
        public Form1()
        {
            InitializeComponent();
            this.Size = new Size(800, 600);
     
            this.Controls.Add(radDock1 = new RadDock());
            radDock1.Dock = DockStyle.Fill;
            radDock1.MdiChildrenDockType = DockType.Document;
     
            this.IsMdiContainer = true;
            this.radDock1.AutoDetectMdiChildren = true;
     
            this.Controls.Add(radMenu1 = new RadMenu());
            radMenu1.Dock = DockStyle.Top;
            var menuItem = new RadMenuItem("Show Form1");
            menuItem.Click += new System.EventHandler(menuItem_Click);
            radMenu1.Items.Add(menuItem);
        }
     
        void menuItem_Click(object sender, System.EventArgs e)
        {
            var form = radDock1.MdiChildren.Where(m => m is Form2).FirstOrDefault();
            if (form == null)
            {
                form = new Form2();
                form.MdiParent = this;
                form.Visible = true;
            }
            else
            {
                radDock1.ActivateMdiChild(form);
            }
        }
     
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
     
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
     
        #region Windows Form Designer generated code
     
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Text = "Form1";
        }
     
        #endregion Windows Form Designer generated code
    }
     
    public class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            this.Controls.Add(new RadLabel() { Text = "Form1" });
        }
     
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
     
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
     
        #region Windows Form Designer generated code
     
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Text = "Form2";
        }
     
        #endregion Windows Form Designer generated code
    }

    This way you don't need to make your form a singleton.

    Hope this helps, if you have any other questions or comments, please let me know,

    Best Regards,
    Emanuel Varga

    Telerik WinForms MVP
  9. aquariens
    aquariens avatar
    8 posts
    Member since:
    Jun 2009

    Posted 22 Jun 2011 Link to this post

    May be a bit late for this post but I achieved the same by comparing .text property of the form and the document by iterating the documents in dock.

    Private Function IterateDockLoadForm(ByVal Form As RadForm) As Boolean
     
        IterateDockLoadForm = False
        Dim a = (From c As Docking.HostWindow In ucMainDock.DocumentManager.DocumentEnumerator Select c.Text)
        For i As Short = 0 To a.Count - 1
            If a(i).ToString = Form.Text Then
                IterateDockLoadForm = True
            End If
        Next
     
        If IterateDockLoadForm = True Then
            Return Nothing
            Exit Function
        Else
            Dim hostWindow As New Docking.HostWindow(Form)
            ucMainDock.DocumentManager.DocumentInsertOrder = Docking.DockWindowInsertOrder.ToBack
            ucMainDock.AddDocument(hostWindow)
            ucMainDock.ShowDocumentCloseButton = True
        End If
     
    End Function

    Easy calling from menus or RibbonBar

    IterateDockLoadForm(FormName)

    Hope it helps.
  10. Julian Benkov
    Admin
    Julian Benkov avatar
    1135 posts

    Posted 27 Jun 2011 Link to this post

    Hi meraj,

    Thank you for sharing your solution with the community. I am sure that the others will benefit from it.

    If you have feedback to share or if you have questions, feel free to write back.

    All the best,
    Julian Benkov
    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!
Back to Top
UI for WinForms is Visual Studio 2017 Ready