8

ユーザーが MDIParent で既に開いている子フォームを開こうとしたときに、自分の子フォームが何度も表示されないようにしたいと考えています。これを回避する 1 つの方法は、コントローラー (私の場合は BUTTON) を無効にすることですが、この機能にもショートカット キー ( Ctrl+ ) を指定しました。Lしたがって、ユーザーがCtrl+と入力Lすると、同じ子フォームが開き、2 つの子フォームが MDI にあることがわかります。

private void leadsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        frmWebLeads formWeblead = new frmWebLeads();
        formWeblead.MdiParent = this;
        formWeblead.WindowState = System.Windows.Forms.FormWindowState.Maximized;
        formWeblead.Show();

    }

これは避けたい。これどうやってするの? ここに画像の説明を入力

画像では、ユーザーが最初にメニュー (LEADS) を使用して開き、2 回目にショートカット キーで開いたときに、子フォーム Name Online Leadsが 2 回開かれていることがわかり ます。私はこれが起こることを望んでいません。フォームが既に開かれている場合は、別の同じフォームを開かないようにする必要があります...これを行う方法は?

4

15 に答える 15

4

1つだけ開いているはずの場合、私が通常行う方法は次のようなものです。

//class member for the only formWeblead
frmWebLeads formWebLead = null;

private void leadsToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (formWebLead == null)
    {
        formWeblead = new frmWebLeads();
        formWeblead.MdiParent = this;
    }

    formWeblead.WindowState = System.Windows.Forms.FormWindowState.Maximized;
    formWeblead.Show();
}
于 2011-07-12T04:37:03.963 に答える
4

これをフォームの main() 関数に設定します

    InitializeComponent();
     this.WindowState = FormWindowState.Maximized;
     this.ShowInTaskbar = true;

 from_login login = new from_login();
                login.MdiParent=this;
                login.Show();
                pmsnrr.pmsmain = this;  

これは、メニューストリップのスリックイベント内に入るコードです

if (this.ActiveMdiChild != null)
            this.ActiveMdiChild.Close();
            frm_companymaster company = new frm_companymaster();
            company.MdiParent = this;
            company.WindowState = FormWindowState.Normal;
            company.Show();
于 2012-11-10T08:09:25.953 に答える
4

私は個人的に一般的な実装を好みます:

private void ShowOrActivateForm<T>() where T : Form
        {
            var k = MdiChildren.Where(c => c.GetType() == typeof(T)).FirstOrDefault();
            if (k == null) 
            {                    

                k = (Form)Activator.CreateInstance(typeof(T));
                k.MdiParent = this;
                k.Show();
            }
            else
            {
                k.Activate();                
            }            
        }

次に、次のように使用できます。

ShowOrActivateForm<myForm>();

myForm は、作成するフォームの TYPE です

于 2014-08-05T06:27:35.110 に答える
3
private void leadsToolStripMenuItem_Click(object sender, EventArgs e)
{
    formWeblead formWeblead = null;
    if ((formWeblead = IsFormAlreadyOpen(typeof(frmWebLeads)) == null)
    {
        formWeblead = new frmWebLeads();
        formWeblead.MdiParent = this;
        formWeblead.WindowState = System.Windows.Forms.FormWindowState.Maximized;
        formWeblead.Show();
    }
}

public static Form IsFormAlreadyOpen(Type FormType)
{
   foreach (Form OpenForm in Application.OpenForms)
   {
      if (OpenForm.GetType() == FormType)
         return OpenForm;
   }

   return null;
}
于 2011-07-12T04:40:09.017 に答える
0
// Implementation of the below class in your MDI Parent
private void openToolStripMenuItem_Click(object sender, EventArgs e) {
            if (SingletonForm.Exists) {
                return;
            } else {
                m_openToolStripMenuItem.Enabled = false;

                SingletonForm form = new SingletonForm();
                form.FormClosed += new FormClosedEventHandler(
                    delegate(object _sender, FormClosedEventArgs _e) {
                        m_openToolStripMenuItem.Enabled = true;
                    });
                form.MdiParent = this;              
                form.Show();
            }
        }


// SingletonForm Class
    using ...
    using System.Threading;

    namespace SingletonForm {

        public partial class SingletonForm : Form, IDisposable {
            static private readonly string m_mutexName = "SingletonForm.SingletonForm";
            private Mutex m_mutex;
            private bool m_disposed;

            public SingletonForm() {
                m_disposed = false;

                // Check to see if there is already a running instance...
                bool owned;
                m_mutex = new Mutex(true, m_mutexName, out owned);
                if (!owned) {
                    // Already running, get out...
                    Close();
                    return;
                }

                InitializeComponent();
            }

            ~SingletonForm() {
                Dispose(false);
            }

            static public bool Exists {
                get {
                    bool owned;
                    using (new Mutex(false, m_mutexName, out owned)) {
                        return !owned;
                    }
                }
            }

            // IDisposable Members
            // --------------------------------------------------------------------------
            #region IDisposable Members
            new public void Dispose() {
                Dispose(true);

                // Use SupressFinalize in case a subclass of this type implements a finalizer.
                GC.SuppressFinalize(this);
            }
            #endregion  // IDisposable Members

            /// <summary>
            /// Note: Comment out the Dispose(bool disposing) implementation in your
            /// SingletonForm.Designer.cs
            /// </summary>
            /// <param name="disposing">true if we are disposing.</param>
            protected override void Dispose(bool disposing) {
                if (disposing && (components != null)) {
                    components.Dispose();
                }

                base.Dispose(disposing);

                // If you need thread safety, use a lock around these 
                // operations, as well as in your methods that use the resource.
                if (!m_disposed) {
                    if (disposing) {
                        // Code to dispose the managed resources held by the class here...
                        if (m_mutex != null) {
                            m_mutex.Dispose();
                            m_mutex = null;
                        }
                    }

                    // Indicate that the instance has been disposed.
                    m_disposed = true;
                }
            }
        };
    };

1-nインスタンスが存在できるようにするために、代わりにセマフォを使用するのが良かったでしょう。

于 2011-07-12T13:03:22.903 に答える
0

子の複数インスタンスを防止する最も簡単な方法:

 private void Showforms(Form frm)
 {
   if (this.ActiveMdiChild==null)
   {
      frm.MdiParent = this;               
      frm.Show();
   }
 }

次に、次のように呼び出します。

Form1 frm = new Form1();
Showforms(frm);
于 2016-08-09T03:02:05.403 に答える
0

現在開いているフォームを確認して、それを実現できます。

if (Application.OpenForms.Count == 1) {
    ReportProductDetails Report9 = new ReportProductDetails();
    Report9.MdiParent = this;
    Report9.Show();
    Report9.Activate();
}
else {
    MessageBox.Show("Sorry!Close the All the Exist Form,Before open this Form", "Information", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
于 2012-12-16T09:13:19.157 に答える
0

これは、MDIParent でメニューをクリックしたときに 1 つのフォームのみを開く呼び出し用に作成した「メソッド」です。この「メソッド」がお役に立てば幸いです。

使用法: ToolStripMenuItems でも。

Form1 frm1 = new Form1();
CheckActiveChildForm(frm1,"myForm");

//myForm is the Text of Form1
private void CheckActiveChildForm(Form FormControl, string FormExists)
{
    int h = 0;
    if (MdiChildren.Count() == 0)
    {
        //Form2 childF = new Form2();
        FormControl.MdiParent = this;
        FormControl.Show();
    }

    if (MdiChildren.Count() > 0)
    {
        for (int i = 0; i < MdiChildren.Count(); i++)
        {
            if (MdiChildren.ElementAt(i).Text == FormExists)
            {
                h = 1;
            }
        }
    }

    if (h == 0)
    {
        FormControl.MdiParent = this;
        FormControl.Show();
    }
}
于 2012-02-21T02:16:47.013 に答える
0

最も簡単な方法は、子フォームへの参照を保持し、まだ存在しない場合にのみ新しいフォームを生成することです。このようなもの:

class ParentForm : Form { 
    frmWebLeads formWeblead = null;

    //...

    private void leadsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if(formWeblead != null) return;
        formWeblead = new frmWebLeads();
        formWeblead.MdiParent = this;
        formWeblead.WindowState = System.Windows.Forms.FormWindowState.Maximized;
        formWeblead.Show();

    }

}

閉じるときに formWeblead を null に設定するコードも必要ですが、その部分を理解できると確信しています:)

于 2011-07-12T04:38:13.857 に答える
0
    private void mnuMyForm_Click(object sender, EventArgs e) // click to open MyForm
    {
        foreach (Form item in this.MdiChildren) // check all opened forms
        {
            if (item.Name == "MyFormName") // check by form name if it's opened
            {
                item.BringToFront(); // bring it front
                return; //exit
            }
        }

        // if MyForm is not opened
        // you know what it is
        MyForm frm = new MyForm();
        frm.MdiParent = this;
        frm.Show();
    }
于 2015-12-20T13:30:35.550 に答える