Is there any way to shorten this code? C # winforms

I am studying a window-shaped MDI form and I am playing with this simple application: alt text

Each ToolStripMeniItemone invokes one instance of a certain shape, but as you can see (see my code), my code repeats for each ToolStripMeniItem tool, how can I shorten this?

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

        private void form1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form1 f1 = null;
            if (IsFormAlreadyOpen(typeof(Form1)) == null)
            {
                f1 = new Form1();
                f1.MdiParent = this;
                f1.Show();
            }
            else
            {
                Form selectedForm = IsFormAlreadyOpen(typeof(Form1));
                foreach (Form OpenForm in this.MdiChildren)
                {
                    if (OpenForm == selectedForm)
                    {
                        if (selectedForm.WindowState == FormWindowState.Minimized)
                        {
                            selectedForm.WindowState = FormWindowState.Normal;
                        }
                        selectedForm.Select();
                    }
                }
            }
        }

        private void form2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 f2 = null;
            if (IsFormAlreadyOpen(typeof(Form2)) == null)
            {
                f2 = new Form2();
                f2.MdiParent = this;
                f2.Show();
            }
            else
            {
                Form selectedForm = IsFormAlreadyOpen(typeof(Form2));
                foreach (Form OpenForm in this.MdiChildren)
                {
                    if (OpenForm == selectedForm)
                    {
                        if (selectedForm.WindowState == FormWindowState.Minimized)
                        {
                            selectedForm.WindowState = FormWindowState.Normal;
                        }
                        selectedForm.Select();
                    }
                }
            }
            // and so on... for the other ToolStripMeniItem
        }
+3
source share
4 answers

A generic function is a function that will work with a set of types to be determined by the caller

so instead int doubleIt(int a) { return a*2; } you can say that T doubleIt<T>(T a){ return a*2; }

this means that you can define one function that can be called as follows:

int intResult = doubleIt(...pass in a int..);
double doubleResult = doubleIt(...pass in a double..);
float floatResult = doubleIt(...pass in a float..);

, , , T.

, T , , T where, T ,

, , , f1 .

Form f1 = null; , T f1 = null;

private void ClickEvent<T>(object sender, EventArgs e) where T: Form, new() {
            T f1 = null;
    .
    .
    .
 }

private void form1ToolStripMenuItem_Click(object sender, EventArgs e)       {
            ClickEvent<Form1>(sender, e)
        }

        private void form2ToolStripMenuItem_Click(object sender, EventArgs e) {
           ClickEvent<Form1>(sender, e) 
        }

, - :

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

private void ClickEvent<T>(object sender, EventArgs e) where T: Form, new() 
    {
    T f1 = null;
    if (IsFormAlreadyOpen(typeof(T)) == null)
    {
        f1 = new T();
        f1.MdiParent = this;
        f1.Show();
    }
    else
    {
        Form selectedForm = IsFormAlreadyOpen(typeof(T));
        foreach (Form OpenForm in this.MdiChildren)
        {
            if (OpenForm == selectedForm)
            {
                if (selectedForm.WindowState == FormWindowState.Minimized)
                {
                    selectedForm.WindowState = FormWindowState.Normal;
                }
                selectedForm.Select();
            }
        }
    }
}

    private void form1ToolStripMenuItem_Click(object sender, EventArgs e)       {
        ClickEvent<Form1>(sender, e)
    }

private void form2ToolStripMenuItem_Click(object sender, EventArgs e) {
   ClickEvent<Form1>(sender, e) 
}

: Linq, - .

  using System.Linq;

             public static Form IsFormAlreadyOpen(Type FormType)        {       
                return Application.OpenForms.Where( f => f.GetType() == FormType).FirstOrDefault();
            }

            private void ClickEvent<T>(object sender, EventArgs e) where T: Form, new() 
            {
                T selectedForm = IsFormAlreadyOpen(typeof(T); 
                if (selectedForm == null)             {
                    (new T() { MdiParent = this; }).Show()
                }
                else {  
                    this.MdiChildren.Where(o => o == selectedForm).ForEach(
                        openForm => { 
                            selectedForm.WindowState = (selectedForm.WindowState == FormWindowState.Minimized) ? FormWindowState.Normal : selectedForm.WindowState;
                            openForm.Select();
                        }
                    );
                }
            }
            private void form1ToolStripMenuItem_Click(object sender, EventArgs e)       {
                ClickEvent<Form1>(sender, e)
            }

            private void form2ToolStripMenuItem_Click(object sender, EventArgs e) {
               ClickEvent<Form2>(sender, e) 
            }

, , , linq .

+5

' MenuItem , MenuStrip, Click all, , , , ,

menuItem = new MenuItem("Form 1");
menuItem.Tag = Form1;
menuItem.Click += new EventHandler(frmMDI_FormHandler_Click);
frmMDI.MenuStrip.Add(menuItem);
+2

, . generics Activator.CreateInstance, , - OP, .

private void form1ToolStripMenuItem_Click(object sender, EventArgs e)
{
    OpenForm<Form2>();
}

private void OpenForm<T>() where T : Form
{
    T form = null;

    if (IsFormAlreadyOpen(typeof(T)) == null)
    {
        form = Activator.CreateInstance<T>();
        form.MdiParent = this;
        form.Show();
    }
    else
    {
        Form selectedForm = IsFormAlreadyOpen(typeof(T));
        foreach (Form OpenForm in this.MdiChildren)
        {
            if (OpenForm == selectedForm)
            {
                if (selectedForm.WindowState == FormWindowState.Minimized)
                {
                    selectedForm.WindowState = FormWindowState.Normal;
                }
                selectedForm.Select();
            }
        }
    }
}
+2

hackish ( , , tho: p)

: "IsXYZ (val)" bool... . "GetOpenForm (Type FormType)"

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

, " "... , ?

, Preet Tommie sender , , . - , . , .

0

Source: https://habr.com/ru/post/1766678/


All Articles