IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Jak otevřít formulář, podle jména v proměnné, do karty tabPage?

Aktivity
Avatar
Matěj Zelenka:3.7.2022 23:09

Ahoj,
ve visual studiu mám projekt „Aplikace Windows Forms (.NET Framework)“(C#). Ze souboru XML si vyčítám názvy formulářů, které následně potřebuji zobrazit v jednotlivých tabPage. Vše mám již hotové, jen nevím, jak mám daný formulář zobrazit (jako v kódu níže), když mám jeho jméno jen v proměnné.

Moc děkuji za každou pomoc.
Matěj

Form2.Form2 newchild = new Form2.Form2() { TopLevel = false, TopMost = true };

Zkusil jsem: Zkoušel jsem hledat na internetu, ale ani po dlouhém hledání jsem nic funkčního nenašel.
Našel jsem např.:

  • var newchild = Activator.CreateInstance(Type.GetType("YourNamespace." + formName)) as Form;

    Vypíše chybu: System.Argumen­tNullException: Hodnota nemůže být NULL. a stejně by jej asi nezobrazilo v tabPage.

  • var newchild = Activator.CreateInstance(namespaceName, formName) as Form;

    Vypíše chybu: Typ System.Runtime­.Remoting.Objec­tHandle nejde převést na System.Window­s.Forms.Form prostřednictvím převodu odkazu, převodu zabalení, převodu rozbalení, převodu obálky nebo převodu s hodnotou null. a stejně by jej asi nezobrazilo v tabPage.

Chci docílit: Snažím se zobrazit formulář, podle názvu v proměnné, do karty tabPage.

 
Odpovědět
3.7.2022 23:09
Avatar
HONZ4
Člen
Avatar
Odpovídá na Matěj Zelenka
HONZ4:9.7.2022 18:40

Nefungovalo by to spíš takto:

= Form.FromHandle(Activator.CreateInstance(....));

(nezkoušel jsem to, nikdy jsem to nepotřeboval, takže jen střílím od boku)

Editováno 9.7.2022 18:42
 
Nahoru Odpovědět
9.7.2022 18:40
Avatar
Odpovídá na HONZ4
Matěj Zelenka:9.7.2022 18:51

Moc děkuji. Bohužel až do příští soboty nebudu u pc, ale potom to hned vyzkouším a odepíšu.

 
Nahoru Odpovědět
9.7.2022 18:51
Avatar
HONZ4
Člen
Avatar
Odpovídá na Matěj Zelenka
HONZ4:10.7.2022 13:33

Původní příspěvek ignoruj, dnes jsem měl čas si to zkusit:

using System;
using System.Reflection;
using System.Windows.Forms;
// Projekt: Aplikace Windows Forms .NET Framework 4.7.2

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            textBoxClassName.Text = "Form2";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form f = CreateFormFromClassName(textBoxClassName.Text);
            //f.BringToFront();
            f.Dock = DockStyle.Fill;
            f.TopLevel = false;
            f.Visible = true;
            f.FormBorderStyle = FormBorderStyle.None;
            TabPage p = new TabPage(textBoxClassName.Text);
            p.Controls.Add(f);
            tabControl1.TabPages.Add(p);
        }

        private Form CreateFormFromClassName(string className)
        {
            Assembly assembly = Assembly.GetExecutingAssembly();
            string assemblyName = assembly.GetName().Name;
            Type type = assembly.GetType(assemblyName + "." + className);
            return (Form)Activator.CreateInstance(type);
        }
    }
}

Je to bez ošetření chyb a je to trošku roztahané, abych to krokoval, ale funguje to. Takže už si to jen dolaď.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
10.7.2022 13:33
Avatar
Odpovídá na HONZ4
Matěj Zelenka:10.7.2022 13:49

Moc děkuji za tvůj čas. Hned v sobotu se na to podívám.
Matěj Zelenka

 
Nahoru Odpovědět
10.7.2022 13:49
Avatar
Odpovídá na HONZ4
Matěj Zelenka:16.7.2022 14:09

Moc děkuji, funguje to.

 
Nahoru Odpovědět
16.7.2022 14:09
Avatar
Odpovídá na HONZ4
Matěj Zelenka:27.7.2022 18:02

Ještě jednou ahoj,
mám ještě problém, že ono to ten formulář hledá v hlavním projektu a on je ve stejném sestavení, ale ve vedlejším projektu s jiným názvem. Takže bych potřeboval, aby to místo "WindowsFormsAp­p2.Form2" otevíralo "Form2.Form2".

Matěj

 
Nahoru Odpovědět
27.7.2022 18:02
Avatar
HONZ4
Člen
Avatar
Odpovídá na Matěj Zelenka
HONZ4:27.7.2022 19:15

Zdarec. Nestačilo by ti to takto?

private void button1_Click(object sender, EventArgs e)
        {
            Form f = CreateFormFromClassName(textBoxClassName.Text);
            if (f != null)
            {
                f.Dock = DockStyle.Fill;
                f.TopLevel = false;
                f.Visible = true;
                f.FormBorderStyle = FormBorderStyle.None;
                TabPage p = new TabPage(textBoxClassName.Text);
                p.Controls.Add(f);
                tabControl1.TabPages.Add(p);
            }
        }

        private Form CreateFormFromClassName(string className)
        { //Form2 a Form3 musíš samozřejmě přilinkovat k projektu
            switch(className)
            {
                case "Form2": return new Form2();
                case "Form3": return new Form3();
                default: return null;
            }
        }
 
Nahoru Odpovědět
27.7.2022 19:15
Avatar
Odpovídá na HONZ4
Matěj Zelenka:27.7.2022 19:47

Asi jsme se špatně pochopili.
Vytvořil jsem projekt Knihovna tříd .NET a vní formulář(aby to bylo v souboru zvlášť od projektu). A teď potřebuji tento formulář zobrazit do karty TabPage pomocí názvu v proměnné.
Ten tvůj předchozí kód funguje dobře, ale ten furmulář hledá v hlavním projektu "WindowsFormsAp­p2.Form2" namísto ve vedlejším "Form2.Form2".

Editováno 27.7.2022 19:48
 
Nahoru Odpovědět
27.7.2022 19:47
Avatar
HONZ4
Člen
Avatar
Odpovídá na Matěj Zelenka
HONZ4:28.7.2022 19:36

tak použij:

Assembly assembly = Assembly.LoadFile(_strUplnaCestaKeKnihovne);
 
Nahoru Odpovědět
28.7.2022 19:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.