user2718537
user2718537

Reputation: 101

I'm getting a stackoverflowexception and i'm not sure why

I made a custom user control and am having trouble setting a custom property. This is the code I'm having trouble with, I'm not sure why I'm getting the stack overflow exception. Any help would be much appreciated.

displayList = new List<ItemDisplay>();
foreach (var item in InventoryData2.Items)
{
    ItemDisplay id = new ItemDisplay();
    id.Item = item;
    id.Name = item.Item.ItemNumber;
    id.Location = new System.Drawing.Point(0, displayList.Count * id.Height);
    displayList.Add(id);
}


public InventoryItem Item 
{
    get { return Item; }
    set { 
        Item = value;
        lblItemNumber.Text = Item.Item.ItemNumber;
        lblTitle.Text = Item.Item.Title;
        lblModel.Text = Item.Item.Model;
        lblPrice.Text = Item.Item.Price.ToString();
    }
}

Upvotes: 1

Views: 127

Answers (2)

Alex
Alex

Reputation: 23290

You have a "recursive" property access:

public InventoryItem Item 
{ 
    get 
    {
        return Item; // <-- "recursive" getter
    }
    set 
    { 
        Item = value; // <-- "recursive" setter
        lblItemNumber.Text = Item.Item.ItemNumber;
        lblTitle.Text = Item.Item.Title;
        lblModel.Text = Item.Item.Model;
        lblPrice.Text = Item.Item.Price.ToString();
    }
}

This should look like this (with a backing field):

private InventoryItem item;
public InventoryItem Item 
{ 
    get 
    {
        return item; 
    }
    set 
    { 
        item = value;
        lblItemNumber.Text = item.Item.ItemNumber;
        lblTitle.Text = item.Item.Title;
        lblModel.Text = item.Item.Model;
        lblPrice.Text = item.Item.Price.ToString();
    }
}

Upvotes: 2

Kris Vandermotten
Kris Vandermotten

Reputation: 10201

The getter of this property will cause infinite recursion:

public InventoryItem Item { get { return Item; }

So will the setter:

set 
{ 
    Item = value;

You probably want something like this:

private InventoryItem item;

public InventoryItem Item 
{
    get 
    { 
        return this.item; 
    }
    set 
    { 
        this.item = value;
        lblItemNumber.Text = value.Item.ItemNumber;
        lblTitle.Text = value.Item.Title;
        lblModel.Text = value.Item.Model;
        lblPrice.Text = value.Item.Price.ToString();
    }
}

Upvotes: 8

Related Questions