views:

166

answers:

1

Hi,

Description of the problem:

  • Create a 'custom control'. Set it's property AutoScroll to 'true'. Change it's bg-color to green.
  • Create second 'custom control'. Change it's bg-color to red.
  • On main form place first custom control
  • In code create 20 instances of second control
  • Add a button and in the button:
    • In code set their position in loop like c.Location = new Point(0, y);
    • y += c.Height;
  • Run App.
  • Press the button
  • Scroll the container
  • Press the button again and can someone please explain me WHY the 0 is not the beggining of the container form?! The controls are shifted...

Before you answer:

  1. Yes the things need to be this way.
  2. Code sample below:

public partial class Form1 : Form { List list;

    public Form1()
    {
        InitializeComponent();

        list = new List<UserControl2>();

        for (int i = 0; i < 20; i++)
        {
            UserControl2 c = new UserControl2();
            list.Add(c);
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        foreach (UserControl2 c in list)
            userControl11.Controls.Add(c);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        int y = 0;
        foreach (UserControl2 c in list)
        { 
            c.Location = new Point(0, y);
            y += c.Height;
        }
    }
}
+2  A: 

Its because Location gives the coordinates of the upper left corner of the control relative to the upper left corner of its container. So when you scroll down, the Location will change.

Here is how to fix it:

  private void button1_Click(object sender, EventArgs e)
  {
     int y = list[0].Location.Y;
     foreach (UserControl2 c in list)
     {
        c.Location = new Point(0, y);
        y += c.Height;
     }
  }
SwDevMan81
me <3 you. This is still unclear to me... according to that definition setting it to 0 should work...
argh
Thanks :P. Yeah its confusing because once you scroll down, the actual Location of the control is now actually negative relative to where you scroll to because the user control you are adding to isnt moving. Setting the location to 0,0 basically says, ok where you are scrolled to right now is where I'm going to start adding controls. But in reality, the control is really way further up (negative to its current position). I'm glad this works for you.
SwDevMan81
I'm really curous what fu**tard came up with this idea of changing the values of Location based on scroll position...
argh