Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
Aktualizovali jsme provozní podmínky. Pokračováním užívání sítě s nimi projevíte souhlas.
BF extended 2022
Avatar
Matěj Zelenka:3. července 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. července 23:09
Avatar
HONZ4
Člen
Avatar
Odpovídá na Matěj Zelenka
HONZ4:9. července 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. července 18:42
 
Nahoru Odpovědět
9. července 18:40
Avatar
Odpovídá na HONZ4
Matěj Zelenka:9. července 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. července 18:51
Avatar
HONZ4
Člen
Avatar
Odpovídá na Matěj Zelenka
HONZ4:10. července 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. července 13:33
Avatar
Odpovídá na HONZ4
Matěj Zelenka:10. července 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. července 13:49
Avatar
Odpovídá na HONZ4
Matěj Zelenka:16. července 14:09

Moc děkuji, funguje to.

 
Nahoru Odpovědět
16. července 14:09
Avatar
Odpovídá na HONZ4
Matěj Zelenka:27. července 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. července 18:02
Avatar
HONZ4
Člen
Avatar
Odpovídá na Matěj Zelenka
HONZ4:27. července 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. července 19:15
Avatar
Odpovídá na HONZ4
Matěj Zelenka:27. července 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. července 19:48
 
Nahoru Odpovědět
27. července 19:47
Avatar
HONZ4
Člen
Avatar
Odpovídá na Matěj Zelenka
HONZ4:28. července 19:36

tak použij:

Assembly assembly = Assembly.LoadFile(_strUplnaCestaKeKnihovne);
 
Nahoru Odpovědět
28. července 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.