MDI Form, avoid duplicate opened forms

4 posts, 2 answers
  1. Davide
    Davide avatar
    5 posts
    Member since:
    Apr 2012

    Posted 26 Apr 2012 Link to this post

    Hi there,

    I am currently developing an MDI application exploiting your Raddock Control.

    As I am using forms as tabbed windows, I would like my application not to create a new tab (a second one), if the form is already open.

    Currently I am using the following workaround and nonetheless I don’t like very much this way J


    private void AddTabbedForm(BaseForm form)
    {
        if (this.radDock1.DockWindows.DocumentWindows.Where(w => w.Text == form.Text).Count() > 0)
        {
            this.radDock1.ActivateWindow(this.radDock1.DockWindows.DocumentWindows.Where(w => w.Text == form.Text).First());
            return;
        }
          form.MdiParent = this;
        form.Show();
    }
     


    Any hint to have it implemented in a more elegant way?


    Thank you very much
    Davide
  2. Answer
    Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 26 Apr 2012 Link to this post

    Hi Davide, 

    I would make the forms that you wish to display singleton classes and then not only can you show just the single instance, but you can also focus on the correct form as well. 

    There are a few parts to this... 
    The Main Form
    Designer File
    namespace RadControlsWinFormsApp1
    {
        partial class 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.radButton1 = new Telerik.WinControls.UI.RadButton();
                this.radButton2 = new Telerik.WinControls.UI.RadButton();
                this.radDock1 = new Telerik.WinControls.UI.Docking.RadDock();
                this.documentContainer1 = new Telerik.WinControls.UI.Docking.DocumentContainer();
                ((System.ComponentModel.ISupportInitialize)(this.radButton1)).BeginInit();
                ((System.ComponentModel.ISupportInitialize)(this.radButton2)).BeginInit();
                ((System.ComponentModel.ISupportInitialize)(this.radDock1)).BeginInit();
                this.radDock1.SuspendLayout();
                ((System.ComponentModel.ISupportInitialize)(this.documentContainer1)).BeginInit();
                ((System.ComponentModel.ISupportInitialize)(this)).BeginInit();
                this.SuspendLayout();
                //
                // radButton1
                //
                this.radButton1.Dock = System.Windows.Forms.DockStyle.Top;
                this.radButton1.Location = new System.Drawing.Point(0, 0);
                this.radButton1.Name = "radButton1";
                this.radButton1.Size = new System.Drawing.Size(467, 24);
                this.radButton1.TabIndex = 0;
                this.radButton1.Text = "Launch MDI Form 1";
                this.radButton1.Click += new System.EventHandler(this.radButton1_Click);
                //
                // radButton2
                //
                this.radButton2.Dock = System.Windows.Forms.DockStyle.Top;
                this.radButton2.Location = new System.Drawing.Point(0, 24);
                this.radButton2.Name = "radButton2";
                this.radButton2.Size = new System.Drawing.Size(467, 24);
                this.radButton2.TabIndex = 1;
                this.radButton2.Text = "Launch MDI Form 2";
                this.radButton2.Click += new System.EventHandler(this.radButton2_Click);
                //
                // radDock1
                //
                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.Location = new System.Drawing.Point(0, 48);
                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(467, 421);
                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.Padding = new System.Windows.Forms.Padding(5);
                //
                //
                //
                this.documentContainer1.RootElement.MinSize = new System.Drawing.Size(25, 25);
                this.documentContainer1.Size = new System.Drawing.Size(457, 411);
                this.documentContainer1.SizeInfo.SizeMode = Telerik.WinControls.UI.Docking.SplitPanelSizeMode.Fill;
                this.documentContainer1.SplitterWidth = 4;
                this.documentContainer1.TabIndex = 0;
                this.documentContainer1.TabStop = false;
                //
                // Form1
                //
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(467, 469);
                this.Controls.Add(this.radDock1);
                this.Controls.Add(this.radButton2);
                this.Controls.Add(this.radButton1);
                this.Name = "Form1";
                //
                //
                //
                this.RootElement.ApplyShapeToControl = true;
                this.Text = "Form1";
                ((System.ComponentModel.ISupportInitialize)(this.radButton1)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.radButton2)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.radDock1)).EndInit();
                this.radDock1.ResumeLayout(false);
                ((System.ComponentModel.ISupportInitialize)(this.documentContainer1)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this)).EndInit();
                this.ResumeLayout(false);
     
            }
     
            #endregion
     
            private Telerik.WinControls.UI.RadButton radButton1;
            private Telerik.WinControls.UI.RadButton radButton2;
            private Telerik.WinControls.UI.Docking.RadDock radDock1;
            private Telerik.WinControls.UI.Docking.DocumentContainer documentContainer1;
     
     
        }
    }

    Main Form 
    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;
    using Telerik.WinControls.UI;
     
    namespace RadControlsWinFormsApp1
    {
        public partial class Form1 : RadForm
        {
            public Form1()
            {
                InitializeComponent();
                this.IsMdiContainer = true;
                this.radDock1.AutoDetectMdiChildren = true;
            }
     
     
            private void radButton1_Click(object sender, EventArgs e)
            {
                MdiChild1 child1 = MdiChild1.Instance;
                DisplayForm(child1);
            }
     
            private void radButton2_Click(object sender, EventArgs e)
            {
                MdiChild2 child2 = MdiChild2.Instance;
                DisplayForm(child2);
            }
     
     
            private void DisplayForm(System.Windows.Forms.Form form)
            {
                this.Cursor = Cursors.WaitCursor;
                if (this.Contains(form))
                {
                    Telerik.WinControls.UI.Docking.HostWindow host = (Telerik.WinControls.UI.Docking.HostWindow)form.Parent;
                    this.radDock1.ActivateWindow(host);
                }
                else
                {
                    form.MdiParent = this;
                    form.Show();
                    Telerik.WinControls.UI.Docking.HostWindow host = (Telerik.WinControls.UI.Docking.HostWindow)form.Parent;
                    this.radDock1.ActivateWindow(host);
                }
     
                form.Focus();
                this.Cursor = Cursors.Default;
            }
     
     
     
        }
    }


    MDI Child1 Designer
    namespace RadControlsWinFormsApp1
    {
        partial class MdiChild1
        {
            /// <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()
            {
                ((System.ComponentModel.ISupportInitialize)(this)).BeginInit();
                this.SuspendLayout();
                //
                // MdiChild1
                //
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(298, 279);
                this.Name = "MdiChild1";
                this.Text = "MdiChild1";
                this.ThemeName = "ControlDefault";
                ((System.ComponentModel.ISupportInitialize)(this)).EndInit();
                this.ResumeLayout(false);
     
            }
     
            #endregion
        }
    }

    MDIChild1 Form
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using Telerik.WinControls;
     
    namespace RadControlsWinFormsApp1
    {
        public partial class MdiChild1 : Telerik.WinControls.UI.RadForm
        {
            private static MdiChild1 s_Instance;
     
            private MdiChild1()
            {
                InitializeComponent();
                this.FormClosed += new FormClosedEventHandler(MdiChild1_FormClosed);
            }
     
            public static MdiChild1 Instance
            {
                get
                {
                    if (MdiChild1.s_Instance == null)
                    {
                        MdiChild1.s_Instance = new MdiChild1();
                    }
                    return MdiChild1.s_Instance;
                }
            }
     
            void MdiChild1_FormClosed(object sender, FormClosedEventArgs e)
            {
                s_Instance = null;
            }
     
     
        }
    }

    (for MDI Child 2, just copy MDIChild1, replacing MDIChild1 with MDIChild2)

    Hope this helps. 
    Please remember to mark as answer if this solves your issue, or let me know if you have further questions
    Richard
  3. UI for WinForms is Visual Studio 2017 Ready
  4. Davide
    Davide avatar
    5 posts
    Member since:
    Apr 2012

    Posted 26 Apr 2012 Link to this post

    Hi Richard,
      thank you for the good answer, I like this  Singleton approach, but now we have already more than thirty developed forms,
    and time to finish application it's not so much :-) , if there was anything that would allow me to avoid to touch all  forms would be better


    Davide
  5. Answer
    Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 26 Apr 2012 Link to this post

    Hi Davide, 

    In that case, your current workaround would probably be fine. Though, to alter 30 forms to singleton shouldn't take too long. 
    Regards, 
    Richard
Back to Top