Get list of open windows form instance that are excuted from different assembly

后端 未结 5 1121
醉话见心
醉话见心 2020-12-10 08:26

I have a \'loader app\' that loads a menu and when user clicks the menu image button a list view opens based on the text

(if text = employee)  
(Go to class         


        
相关标签:
5条回答
  • 2020-12-10 08:57

    If you want a list of the open forms, that is Application.OpenForms. You could iterate over this, using GetType() and checking the .Assembly to find those from a different assembly. Beyond that, I'm not entire clear on the question...

            Assembly currentAssembly = Assembly.GetExecutingAssembly();
            List<Form> formsFromOtherAssemblies = new List<Form>();
            foreach (Form form in Application.OpenForms) {
                if (form.GetType().Assembly != currentAssembly) {
                    formsFromOtherAssemblies.Add(form);
                }
            }
    

    If you just want to track forms you have opened yourself, then cache that instance. Or if you use "owned forms", you can just check by name:

        private void button1_Click(object sender, EventArgs e) {
            foreach (Form form in OwnedForms) {
                if (form.Name == "Whatever") {
                    form.Activate();
                    return;
                }
            }
            Form child = new Form();
            child.Name = "Whatever";
            child.Owner = this;
            child.Show(this);
        }
    
    0 讨论(0)
  • 2020-12-10 09:13

    Mark Garvell's answer helped me to figure out what I should do, but it needed adjusting for WPF.

    (In my case I wanted to close any windows not owned by the main one when it closes, but the principle is the same.)

    private void EmployeeMenuItemClick(object sender, RoutedEventArgs e)
    {
        bool found = false;
        foreach(Window w in Application.Current.Windows)
        {
            if(w.GetType() == typeof(EmployeeListViewWindow)
            {
                found = true;
                break;
            }
        }
        if(!found)
        {
            EmployeeListViewWindow ew = new EmployeeListViewWindow();
            ew.Show();
        }
    }
    
    0 讨论(0)
  • 2020-12-10 09:14
        NewProduct newproduct;
        private void button1_Click(object sender, EventArgs e)
        {
    
            if(!isOpened())
            {
                newproduct = new NewProduct();
                newproduct.Show();
            }
    
        }
        private bool isOpened()
        {
            foreach (Form f in Application.OpenForms)
            {
                if (f == newproduct)
                {
                    return true;
                }
            }
            return false;
        }
    
    0 讨论(0)
  • 2020-12-10 09:20

    Another simple example

    private Boolean FindForm(String formName)
        {
            foreach (Form f in Application.OpenForms)
            {
                if (f.Name.Equals(formName))
                {
    
                    f.Location = new Point(POINT.X, POINT.Y + 22);
                    return true;
                }
            }
    
            return false;
        }
    
    0 讨论(0)
  • 2020-12-10 09:20

    You can use a Command pattern. The loader assembly will search for commands in loaded assemblies. For every command the loader create menu item ( or anything else, you want ), and click event will run the concrete command.

    The command must know if should be created new form or used some already existing.

    0 讨论(0)
提交回复
热议问题