Skip Navigation LinksHome / Community & Support / Developer Productivity Tools Forums / WinForms > Dock > Only dock form once

Answered Only dock form once

Feed from this thread
  • meraj avatar

    Posted on Feb 24, 2011 (permalink)

    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.

    Reply

  • Posted on Feb 24, 2011 (permalink)

    Hello Meraj,

    Please have a look at this forum post which explains a few options in detail.
    Hope that helps
    Richard

    Reply

  • Say Hello to Telerik's PivotGrid for ASP.NET AJAX, Silverlight, WPF and WinForms. Now packed with OLAP support.
  • meraj avatar

    Posted on Feb 26, 2011 (permalink)

    Hi Richard,
    My scenario is that i have a MDI form with menu and i am opening the form as per menu click .

    Reply

  • Posted on Feb 26, 2011 (permalink)

    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

    Reply

  • meraj avatar

    Posted on Feb 27, 2011 (permalink)

    Thank You Richard,
                               Its very useful.

    Reply

  • Posted on Feb 27, 2011 (permalink)

    You're welcome. Please remember to mark as answer.

    Reply

  • Posted on Feb 27, 2011 (permalink)

    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

    Reply

  • Posted on Jun 22, 2011 (permalink)

    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.

    Reply

  • Julian Benkov Julian Benkov admin's avatar

    Posted on Jun 27, 2011 (permalink)

    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!

    Reply

  • Say Hello to Telerik's PivotGrid for ASP.NET AJAX, Silverlight, WPF and WinForms. Now packed with OLAP support.

Back to Top

Skip Navigation LinksHome / Community & Support / Developer Productivity Tools Forums / WinForms > Dock > Only dock form once
Related resources for "Only dock form once"

[ Features | Demos | Documentation | Knowledge Base | Telerik TV | Code Library | Step-by-step Tutorial | Blogs | Self-Paced Trainer ]