15. august 2005 - 01:07Der er
18 kommentarer og 1 løsning
Kan ikke ændre text value på Label
Hej,
Jeg arbejder pt med min egen control. I min control er der et par Labels. Jeg har lavet en metode på min control der medtager en string som parameter og ønsker så at denne string skal sættes som text på det ene Label. Mit problem er så at jeg fint kan kalde metoden - jeg kommer også ind i metoden og får udført koden - men text'en i labelet ændres desværre ikke. Er der noget jeg skal update eller lignende?
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Jeg har været ude for at under visse omstændigheder er der ikke ressourcer nok på en maskine til at gentegne hver gang (spørg mig ikke hvorfor) men det hjalp da jeg gjorde dette:
Du kalder for det førset aldrig Test_XY! Står der når komponenten starter op (når du kører den og ikke i design mode) "0" i alle dine labels (alle 4) ?
det er jo en control så jeg instansere den i en test-form som jeg ikke har inkluderet i koden her - meningen var at hjælpere kunne copy-paste controllen og prøve denne på en test-form!
Jeg har ryddet lidt op i din kode og så virker det hos mig:
public void Text_XY(int x, int y, string text) { string name = "" + x + ";" + y;
foreach (Label l in panel1.Controls) { // Har bl.a. fjernet en masse unødvendigt casting! l.BackColor = SystemColors.Desktop;
if (l.Name == name) { l.Text = text; // Dette invaliderer også den pågældende label! // l.BackColor = SystemColors.WindowText; ? Hvad ønsker du skal ske break; // Ingen grund til at fortsætte løkke! (Du har opdateret hvad du skulle) } } }
Kort kommentar: Når Text assignes bliver labelen invalideret og du behøver derfor ikke at foretage dig noget ved mindre at du ønsker øvrige dele af din kontrol opdateret.
Undgå unødvendig casting! Ikke fordi det er noget problem her i dette eksempel, men hvorfor gøre det når det er unødvendigt.
Der er naturligvis mere som skal rettes, for din TextGrid_Resize metode er ikke særlig smart.
1. Du starter med at definere panel1's størrelse og placering! Dette er unødvendigt da du blot kan sætte dock style til "Fill" (this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;)
2. Derefter starter du med at slette samtlige labels. Dette er jo ikke så hensigtsmæssigt, da du derved sletter de labels som du netop har opdateret med Text_XY.
Du bør lave en separat metode til at oprette dine labels, og lade din resize metode nøjes med at resize.
Ok det er jo weekend, så her får du lige din kode retur med rettelser :-)
Jeg har her anvendt en matrix til at gemme labels i men det kan naturligvis gøres på andre måder. Jeg har forsøgt at bibeholde så meget af din kode som muligt. CreateLabels opretter dine labels. TextGridResize.. ja den resizer (med din egen formel for ikke at rette for meget) SetText erstatter Text_XY, men er det samme.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Windows.Forms; using System.Diagnostics;
public partial class TextGrid : UserControl { private int columns = 2; private int rows = 2;
/// <summary> /// Creates labels for the Control /// </summary> private void CreateLabels() { this.rowList = new List<List<Label>>(); this.panel1.Controls.Clear();
int y = 0; int x = 0;
int width = this.Width / columns; int height = this.Height / rows;
for (int row = 0; row < rows; row ++) { List<Label> columnList = new List<Label>();
/// <summary> /// Called then the control is resized. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TextGridResize(object sender, EventArgs e) { Debug.Assert(this.rowList != null, "this.rowList");
int y = 0; int x = 0;
int w = this.Width / columns; int h = this.Height / rows;
foreach ( List<Label> row in this.rowList) { foreach (Label label in row) { label.Location = new Point(x, y);
x += w; }
y += h; x = 0; } }
/// <summary> /// Sets a text for a specific label. /// </summary> /// <param name="row">Row ID.</param> /// <param name="column">Column ID.</param> /// <param name="text">Text for the label.</param> public void SetText(int row, int column, string text) { Debug.Assert(this.rowList != null, "this.rowList");
try { Label label = this.rowList[row][column];
if (label != null) { label.Text = text; } else { throw new ArgumentNullException("Missing Label."); } } catch (ArgumentOutOfRangeException ex) { throw new ArgumentOutOfRangeException("The specified location is unknown.", ex); } } }
Husk at kalde CreateLabels fra din "setter" på din property for Columns og Rows! CreateLabels bør kalde this.Invalidate(); til slut hvilket jeg glemte i farten. Derudover kan du overveje at sætte label.AutoEllipsis = true hvilket giver et pænere resultat hvis gridden er for lille til teksten;
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.