07. maj 2009 - 11:44Der 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; } } } } }
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; } }
...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); } }
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.
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 :)
Husk at lukke spørgsmålet ved at vælge mit navn og acceptere mit svar.
Synes godt om
Ny brugerNybegynder
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.