Avatar billede tigertool Nybegynder
15. august 2005 - 01:07 Der 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?
Avatar billede roenving Novice
15. august 2005 - 01:12 #1
Hvordan kalder du din label ?-)
Avatar billede tigertool Nybegynder
15. august 2005 - 01:14 #2
public void SetText(string text)
{
  label_title.Text = text;
}
Avatar billede tigertool Nybegynder
15. august 2005 - 01:19 #3
Jeg glemte lige at mit Label er i et Panel.
Avatar billede brian0905 Nybegynder
15. august 2005 - 08:28 #4
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:

public void SetText(string text)
{
  label_title.Text = text;
  label_title.Invalidate();
  label_title.Update();
}

Det er et bud...
Avatar billede anadan Nybegynder
15. august 2005 - 09:14 #5
label.Update();
Avatar billede tigertool Nybegynder
15. august 2005 - 22:04 #6
Hjælper desværre ikke.

Mit label ligger i et panel - jeg har også prøvet panel1.Update(); også uden held..
Avatar billede bitsch Nybegynder
16. august 2005 - 08:07 #7
Hvornår kalder du SetText?
Har du envt. mulighed for at vise mere af din kode?
Avatar billede tigertool Nybegynder
18. august 2005 - 00:09 #8
Ja, min control ser således ud:

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace BitGuarder_Controls
{
    public class TextGrid : System.Windows.Forms.UserControl
    {
        private System.ComponentModel.Container components = null;
        private int col_count = 2;
        private System.Windows.Forms.Panel panel1;
        private int row_count = 2;
       
        public TextGrid()
        {
            InitializeComponent();
           
           
            TextGrid_Resize(null, null);

        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                    components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.panel1 = new System.Windows.Forms.Panel();
            this.SuspendLayout();
            //
            // panel1
            //
            this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
            this.panel1.Location = new System.Drawing.Point(0, 0);
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size(392, 320);
            this.panel1.TabIndex = 0;
            //
            // TextGrid
            //
            this.BackColor = System.Drawing.SystemColors.Window;
            this.Controls.Add(this.panel1);
            this.Name = "TextGrid";
            this.Size = new System.Drawing.Size(400, 328);
            this.BindingContextChanged += new System.EventHandler(this.TextGrid_Resize);
            this.Resize += new System.EventHandler(this.TextGrid_Resize);
            this.ResumeLayout(false);

        }
        #endregion

        private void TextGrid_Resize(object sender, System.EventArgs e)
        {
            panel1.Location = new Point(0,0);
            panel1.Width = this.Width;
            panel1.Height = this.Height;

            panel1.Controls.Clear();
           
            int y = 0;
            int x = 0;

            int w = this.Width / col_count;
            int h = this.Height / row_count;
           
            for (int r = 0; r < row_count; r++)
            {
                for (int c = 0; c < col_count; c++)
                {
                    Label l = new Label();
                    l.Width = w;
                    l.Height = h;
                    l.Location = new Point(x, y);
                    l.Text = "0";
                    l.BackColor = this.BackColor;
                    l.Name = "" + c + ";" + r;
               
                    panel1.Controls.Add(l);               
                    x += w;
                }
                y += h;
                x = 0;
            }
        }

        public int Cols
        {
            set {col_count = value;}
            get {return col_count;}
        }

        public int Rows
        {
            set {row_count = value;}
            get {return row_count;}
        }

        public void Text_XY(int x, int y, string text)
        {
            string name = "" + x + ";" + y;

            foreach (Control c in panel1.Controls)
            {
                if (c.GetType() == typeof(Label))
                {
                    c.BackColor = SystemColors.Desktop;
                    Label l = (Label) c;
                   

                    if (l.Name == name)
                    {
                        l.Text = text;
                        l.BackColor = SystemColors.WindowText;
                        Console.WriteLine(l.Name);
                        l.Invalidate();
                        l.Update();
                        panel1.Invalidate();
                        panel1.Update();
                    }
                }
            }
        }
    }
}
Avatar billede anadan Nybegynder
18. august 2005 - 09:00 #9
Lige for en ordens skyld,

l.Invalidate();
l.Update();

kan klares i ét hug med

l.Refresh();
Avatar billede tigertool Nybegynder
18. august 2005 - 23:31 #10
ok - men det afhjælper ikke problemet?
Avatar billede brian0905 Nybegynder
19. august 2005 - 07:47 #11
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) ?
Avatar billede tigertool Nybegynder
19. august 2005 - 19:18 #12
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!
Avatar billede tigertool Nybegynder
24. august 2005 - 16:46 #13
Er der nogen der gider afprøve den control og se om de kan få det til at virke?
Avatar billede bitsch Nybegynder
27. august 2005 - 21:26 #14
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.
Avatar billede bitsch Nybegynder
27. august 2005 - 21:42 #15
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.
Avatar billede bitsch Nybegynder
27. august 2005 - 23:27 #16
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;

        System.Collections.Generic.List<List<Label>> rowList;

        public TextGrid()
        {
            InitializeComponent();

            this.CreateLabels();
        }

        /// <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>();

                for (int column = 0; column < columns; column++)
                {
                    Label label = new Label();
                    label.Width = width;
                    label.Location = new Point(x, y);
                    label.BackColor = this.BackColor;
                    label.Name = String.Format("c:{0} r:{1}", column, row);
                    // l.Text = "0";
                    label.Text = label.Name;

                    panel1.Controls.Add(label);
                    columnList.Add(label);

                    x += width;
                }

                this.rowList.Add(columnList);

                y += height;
                x = 0;
            }
        }

        /// <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);
            }
        }
    }
Avatar billede bitsch Nybegynder
28. august 2005 - 00:00 #17
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;
Avatar billede bitsch Nybegynder
28. august 2005 - 00:08 #18
public int Columns
        {
            get
            {
                return this.columns;
            }

            set
            {
                if (value > 0 && value != this.columns)
                {
                    this.columns = value;
                    this.CreateLabels();
                }
            }
        }

        public int Rows
        {
            get
            {
                return this.rows;
            }

            set
            {
                if (value > 0 && value != this.rows)
                {
                    this.rows = value;
                    this.CreateLabels();
                }
            }
        }
Avatar billede bitsch Nybegynder
29. august 2005 - 15:52 #19
Det må vist være svar nok for denne gang
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