Avatar billede km2 Nybegynder
07. maj 2009 - 11:44 Der er 5 kommentarer og
1 løsning

Hjælp til at skifte font i tekstboks - Hjælp!!!

Jeg har en funktion som laver 4 tekstbokse på min panel kontrol. Disse tekstbokse bliver tegnet i runtime med en løkke. Når jeg højreklikker en tekstboks kommer en menu frem og når jeg trykker på menupunktet kommer fontdialogboksen frem. Hvordan kan man skifte font i hver enkelt tekstboks individuelt?

Her er mit program:

using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace test_textboxarray
{
    public partial class Form1 : Form
    {
        TextBox t;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ContextMenu cmu = new ContextMenu();
            MenuItem mnuFont = new MenuItem();

            for (int i = 0; i < 4; i++)
            {
                mnuFont.Text = "&Font";
                cmu.MenuItems.Add(mnuFont);
                t = new TextBox();
                t.Name = "textbox" + i;
                t.ContextMenu = cmu;

                if (i < 1)
                {
                    t.Location = new Point(100, 100);
                    panel1.Controls.Add(t);
                }
                if (i > 1 && i < 3)
                {
                    t.Location = new Point(100, 70);
                    panel1.Controls.Add(t);
                }
                if (i > 2 && i < 4)
                {
                    t.Location = new Point(100, 40);
                    panel1.Controls.Add(t);
                }
                if (i > 3 && i < 5)
                {
                    t.Location = new Point(100, 10);
                    panel1.Controls.Add(t);
                }
            }
            mnuFont.Click += new EventHandler(mnuFont_Click);
        }
        public void mnuFont_Click(object sender, EventArgs e)
        {
            FontDialog fd = new FontDialog();
            if (fd.ShowDialog() == DialogResult.OK)
            {
                for (int i = 0; i < 3; i++)
                {
                    t.Font = fd.Font;
                }
            }   
        }
    }
}

Kan i hjælpe mig, det er meget vigtigt. Tak
Avatar billede Spotgun Seniormester
07. maj 2009 - 12:13 #1
Prøv med den her. Det kan sagtens være der er en mere effektiv måde at finde den pågældende textbox - det var bare et hurtigt eksempel. Der er i øvrigt heller ingen validering af om de forskellige casts er korrekte.

        public void mnuFont_Click(object sender, EventArgs e)
        {
            FontDialog fd = new FontDialog();
            if (fd.ShowDialog() == DialogResult.OK)
            {
                ((TextBox)((ContextMenu)((MenuItem)sender).Parent).SourceControl).Font = fd.Font;
            }
        }
Avatar billede Spotgun Seniormester
07. maj 2009 - 12:14 #2
...Tillod mig i øvrigt at omskrive dit program lidt:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

            ContextMenu cmu = new ContextMenu();
            MenuItem mnuFont = new MenuItem();
            mnuFont.Text = "&Font";
            mnuFont.Click += new EventHandler(mnuFont_Click);
            cmu.MenuItems.Add(mnuFont);

            for (int i = 0; i < 4; i++)
            {
                TextBox t = new TextBox();
                t.Name = "Textbox" + 1;
                t.ContextMenu = cmu;
                switch (i)
                {
                    case 0:
                        t.Location = new Point(100, 100);
                        break;
                    case 1:
                        t.Location = new Point(100, 70);
                        break;
                    case 2:
                        t.Location = new Point(100, 40);
                        break;
                    case 3:
                        t.Location = new Point(100, 10);
                        break;
                }
                panel1.Controls.Add(t);
            }
        }

        void mnuFont_Click(object sender, EventArgs e)
        {
            FontDialog fd = new FontDialog();
            if (fd.ShowDialog() == DialogResult.OK)
            {
                ((TextBox)((ContextMenu)((MenuItem)sender).Parent).SourceControl).Font = fd.Font;
            }
        }
    }
}
Avatar billede km2 Nybegynder
07. maj 2009 - 12:57 #3
Tak for det hurtige svar

Jeg har prøvet det du skrev og det virker som det skal. Jeg var aldrig kommet på den sætning som du skrev i min mnuFont_Click men det var det der skulle til. Nu kan jeg skifte fonten individuelt i hver tekstboks. Jeg vil gerne sige mange tak for at du kunne hjælpe mig så hurtigt.
Avatar billede Spotgun Seniormester
07. maj 2009 - 13:05 #4
Fint, du får et svar her. Er du med på hvad der sker i click eventen?

Variablen "sender" indeholder en reference til det MenuItem der er blevet klikket på. På den kigger vi på Parent, som indeholder en reference til den ContextMenu det ligger på. Og på ContextMenu finder du en reference til den valgte TextBox via SourceControl. Til sidst kan du så sætte Font på denne.

Det kunne som sagt godt være lavet pænere, og være taget højde for validering af kontrollerne, men det er en anden snak :)
Avatar billede km2 Nybegynder
07. maj 2009 - 18:45 #5
Ja den linie i click eventen er noget kompliceret, men forstår bedre nu hvad det er den gør, med din forklaring.
Avatar billede Spotgun Seniormester
09. maj 2009 - 20:37 #6
Husk at lukke spørgsmålet ved at vælge mit navn og acceptere mit svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester