user3170251
user3170251

Reputation: 310

Label text not updating

public void ItemGot()
{
    number = number + 1;            //Increment by 1
    quantity.Text = ("x" + number); //Overwrite Text
    quantity.Refresh();             //Updates the text
}

Hello, I have this code above. When this method runs, the text of a label I set up earlier should change the text to the one i set below. However, its not doing it. Furthermore, by setting breakpoints in Visual Studio, I have determined that:

  1. The method is being called,
  2. Number is being incremented properly.

There should be NO reason why this not working, because the program is recognizing that number is increasing by one. My friend said a similar question here. Still no help, and now that code is outdated. Please help!

EDIT: how I added the quantity label

First, I initialized it in the constructor: public Label quantity;

Then I did this: quantity = new Label();

Lastly, in another method, I gave the quantity the following properties:

quantity.Size = new Size(24, 24);
quantity.Text = ("x" + number);

quantity.Left = 48;

Controls.Add(quantity);

number is also in the constructor and is set to 0.

EDIT 2 : I'll Post my whole method

    public InventoryScreen()
    {
        btnItems = new Button();
        quantity = new Label();

        //call the methods for spawning the buttons 
        ButtonGenItems(cNumber, btnItems, quantity);

        InitializeComponent();
    }

    public void InventoryScreen_Load(object sender, EventArgs e)
    {

    }

    #region ButtonGenItems Method
    public void ButtonGenItems(int cNumber, Button btnItems,Label quantity)
    {
        int xPos = 126;
        int yPos = 25;

        for (int n = 0; n < 1; n++)
        {
            btnItems.Tag = n;
            btnItems.Size = new Size(48, 52);  //Button size X and Y
            btnItems.BackColor = Color.CornflowerBlue;

            quantity.Size = new Size(24, 24);
            quantity.Text = ("x" + number);

            if (yPos > 60) // Five Buttons in one column
            {
                yPos = 25; //spawn position Y
                xPos = xPos + btnItems.Width + 10; //spacing X
            }

            btnItems.Left = xPos; //Start Button spawn at the Left side
            btnItems.Top = yPos;  //Start spawn at the top side

            quantity.Left = 48;
            quantity.Top = 60;

            yPos = yPos + btnItems.Height + 10;

            btnItems.Text = "Use";

            Controls.Add(btnItems); //place Buttons
            Controls.Add(quantity);

            // the Event of click Button
            //btnItems.Click += new System.EventHandler(ItemUse); //to be implimented
        }
    }

    #endregion

    public void ItemGot()
    {
        //*Interestingly, the program recognizes that 'number' is increasing by 1, but label won't update the text
        //Furthermore, pressing the actual button will trigger the text update, but simulating a buttonclick WONT DO ANYTHING 

        Console.WriteLine("Text should now increment by 1");  //Debugging to test method
        number = number + 1;            //Increment by 1
        quantity.Text = ("x" + number); //Overwrite Text
    }
}

2.5 This is how the method is being called. This method is located in another class

public void Update(Vector2 pos)
        {
            this.position = pos; //get char position
            Inv = new InventoryScreen(); //create instance of object
            charRange = new Rectangle((int)position.X, (int)position.Y, 64, 57); //create rectangle


            //Intersection Code, If the character intersects with the item while the item is showing, run below
            if (alive && charRange.Intersects(itemRect))
            {
                alive = false; //stop showing the item
                Inv.ItemGot(); //Call the ItemGot class, which adds the item to the inventory screen
            }
        }

Upvotes: 3

Views: 1715

Answers (1)

Fabio
Fabio

Reputation: 32445

As I understand you have already open/showed form(instance of class InventoryScreen) with your label when you calling Update method, But...

Inside of method Update you creating a new instance of InventoryScreen, and calling function ItemGot with this new instance of form.

I think you need to pass reference of your current instance of InventoryScreen in method Update, then use that reference for calling ItemGot method

public void Update(Vector2 pos, InventoryScreen invscreen)
{
    this.position = pos;
    charRange = new Rectangle((int)position.X, (int)position.Y, 64, 57);

    if (alive && charRange.Intersects(itemRect))
    {
        alive = false;
        invscreen.ItemGot(); 
    }
}

Upvotes: 2

Related Questions