Resizing and positioning panels in another panel












0















I'm giving my panels inside another panel (this panel is in a usercontrol) a fixed location and a maximum size that changes with the size of the panel there in. Neither the resize or location works properly. The resize does happen but its to quickly. The location is fine if you only have 1 pinpanel for output and input. When you have more then 1 the locations are fixed but you need to resize the panel to resize to see the other panels. Could you point me in the right direction if you see the problem?



I have a panel drawPanel in this case that i use as a sort of background for the usercontrol. Inside this drawPanel i'm placing pinpanels. I want these pinpanels to resize with the usercontrol and give them a fixed location



    private void OnClickPinPanel(object source, EventArgs e)
{
if (source is PinPanel p)
{
int index;
if ((index = Array.IndexOf(inputPins, p)) >= 0)
{
ClickedPinPanel?.Invoke(index, true);
}
else
{
ClickedPinPanel?.Invoke(Array.IndexOf(outputPins, p), false);
}
}
//else log here
}

private void CreatePinPanels(bool isInput)
{
int x = 0;
int y = -(int)(this.Width * 0.05)/2;

if (isInput)
{
for (int i = 0; i < inputPins.Length; i++)
{
y += (i + 1) * (this.Height / inputPins.Length + 1);
inputPins[i] = new PinPanel()
{
Location = new Point(x, y),
Size = new Size((int)(this.Width * 0.05), (int)(this.Width * 0.05)),
Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right,
};
inputPins[i].Click += OnClickPinPanel;
}
}
else
{
x += this.Width - (int)(this.Width * 0.1);
for (int i = 0; i < outputPins.Length; i++)
{
y += (i + 1) * (this.Height / inputPins.Length+1);
outputPins[i] = new PinPanel()
{
Size = new Size((int)(this.Width * 0.1), (int)(this.Width * 0.1)),
Location = new Point(x, y),
Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right
};
outputPins[i].Click += OnClickPinPanel;
}
}
}


The result i get now is that the pinpanels get a fixed location but when you have more then 1 pinpanel, the location is wrong its like if he thinks that the usercontrol is bigger then it is Reality. In order to see all the pins i have to resize and get this After resize



I want it to look like this
expectations










share|improve this question























  • Your code need to move the left and top properties. When one control get larger the surrounding controls need to move so they do not overlap onto the one that grows larger so you need to change the left and top properties.

    – jdweng
    Dec 31 '18 at 14:44











  • @jdweng What about the positioning of the pinpanels? It needs to be of a certain size to see them all and there in the wrong location

    – Maxime C.
    Dec 31 '18 at 15:05











  • I specifically use the word "Controls" not panel because I was referring to ALL objects on the form.

    – jdweng
    Dec 31 '18 at 21:44
















0















I'm giving my panels inside another panel (this panel is in a usercontrol) a fixed location and a maximum size that changes with the size of the panel there in. Neither the resize or location works properly. The resize does happen but its to quickly. The location is fine if you only have 1 pinpanel for output and input. When you have more then 1 the locations are fixed but you need to resize the panel to resize to see the other panels. Could you point me in the right direction if you see the problem?



I have a panel drawPanel in this case that i use as a sort of background for the usercontrol. Inside this drawPanel i'm placing pinpanels. I want these pinpanels to resize with the usercontrol and give them a fixed location



    private void OnClickPinPanel(object source, EventArgs e)
{
if (source is PinPanel p)
{
int index;
if ((index = Array.IndexOf(inputPins, p)) >= 0)
{
ClickedPinPanel?.Invoke(index, true);
}
else
{
ClickedPinPanel?.Invoke(Array.IndexOf(outputPins, p), false);
}
}
//else log here
}

private void CreatePinPanels(bool isInput)
{
int x = 0;
int y = -(int)(this.Width * 0.05)/2;

if (isInput)
{
for (int i = 0; i < inputPins.Length; i++)
{
y += (i + 1) * (this.Height / inputPins.Length + 1);
inputPins[i] = new PinPanel()
{
Location = new Point(x, y),
Size = new Size((int)(this.Width * 0.05), (int)(this.Width * 0.05)),
Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right,
};
inputPins[i].Click += OnClickPinPanel;
}
}
else
{
x += this.Width - (int)(this.Width * 0.1);
for (int i = 0; i < outputPins.Length; i++)
{
y += (i + 1) * (this.Height / inputPins.Length+1);
outputPins[i] = new PinPanel()
{
Size = new Size((int)(this.Width * 0.1), (int)(this.Width * 0.1)),
Location = new Point(x, y),
Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right
};
outputPins[i].Click += OnClickPinPanel;
}
}
}


The result i get now is that the pinpanels get a fixed location but when you have more then 1 pinpanel, the location is wrong its like if he thinks that the usercontrol is bigger then it is Reality. In order to see all the pins i have to resize and get this After resize



I want it to look like this
expectations










share|improve this question























  • Your code need to move the left and top properties. When one control get larger the surrounding controls need to move so they do not overlap onto the one that grows larger so you need to change the left and top properties.

    – jdweng
    Dec 31 '18 at 14:44











  • @jdweng What about the positioning of the pinpanels? It needs to be of a certain size to see them all and there in the wrong location

    – Maxime C.
    Dec 31 '18 at 15:05











  • I specifically use the word "Controls" not panel because I was referring to ALL objects on the form.

    – jdweng
    Dec 31 '18 at 21:44














0












0








0








I'm giving my panels inside another panel (this panel is in a usercontrol) a fixed location and a maximum size that changes with the size of the panel there in. Neither the resize or location works properly. The resize does happen but its to quickly. The location is fine if you only have 1 pinpanel for output and input. When you have more then 1 the locations are fixed but you need to resize the panel to resize to see the other panels. Could you point me in the right direction if you see the problem?



I have a panel drawPanel in this case that i use as a sort of background for the usercontrol. Inside this drawPanel i'm placing pinpanels. I want these pinpanels to resize with the usercontrol and give them a fixed location



    private void OnClickPinPanel(object source, EventArgs e)
{
if (source is PinPanel p)
{
int index;
if ((index = Array.IndexOf(inputPins, p)) >= 0)
{
ClickedPinPanel?.Invoke(index, true);
}
else
{
ClickedPinPanel?.Invoke(Array.IndexOf(outputPins, p), false);
}
}
//else log here
}

private void CreatePinPanels(bool isInput)
{
int x = 0;
int y = -(int)(this.Width * 0.05)/2;

if (isInput)
{
for (int i = 0; i < inputPins.Length; i++)
{
y += (i + 1) * (this.Height / inputPins.Length + 1);
inputPins[i] = new PinPanel()
{
Location = new Point(x, y),
Size = new Size((int)(this.Width * 0.05), (int)(this.Width * 0.05)),
Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right,
};
inputPins[i].Click += OnClickPinPanel;
}
}
else
{
x += this.Width - (int)(this.Width * 0.1);
for (int i = 0; i < outputPins.Length; i++)
{
y += (i + 1) * (this.Height / inputPins.Length+1);
outputPins[i] = new PinPanel()
{
Size = new Size((int)(this.Width * 0.1), (int)(this.Width * 0.1)),
Location = new Point(x, y),
Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right
};
outputPins[i].Click += OnClickPinPanel;
}
}
}


The result i get now is that the pinpanels get a fixed location but when you have more then 1 pinpanel, the location is wrong its like if he thinks that the usercontrol is bigger then it is Reality. In order to see all the pins i have to resize and get this After resize



I want it to look like this
expectations










share|improve this question














I'm giving my panels inside another panel (this panel is in a usercontrol) a fixed location and a maximum size that changes with the size of the panel there in. Neither the resize or location works properly. The resize does happen but its to quickly. The location is fine if you only have 1 pinpanel for output and input. When you have more then 1 the locations are fixed but you need to resize the panel to resize to see the other panels. Could you point me in the right direction if you see the problem?



I have a panel drawPanel in this case that i use as a sort of background for the usercontrol. Inside this drawPanel i'm placing pinpanels. I want these pinpanels to resize with the usercontrol and give them a fixed location



    private void OnClickPinPanel(object source, EventArgs e)
{
if (source is PinPanel p)
{
int index;
if ((index = Array.IndexOf(inputPins, p)) >= 0)
{
ClickedPinPanel?.Invoke(index, true);
}
else
{
ClickedPinPanel?.Invoke(Array.IndexOf(outputPins, p), false);
}
}
//else log here
}

private void CreatePinPanels(bool isInput)
{
int x = 0;
int y = -(int)(this.Width * 0.05)/2;

if (isInput)
{
for (int i = 0; i < inputPins.Length; i++)
{
y += (i + 1) * (this.Height / inputPins.Length + 1);
inputPins[i] = new PinPanel()
{
Location = new Point(x, y),
Size = new Size((int)(this.Width * 0.05), (int)(this.Width * 0.05)),
Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right,
};
inputPins[i].Click += OnClickPinPanel;
}
}
else
{
x += this.Width - (int)(this.Width * 0.1);
for (int i = 0; i < outputPins.Length; i++)
{
y += (i + 1) * (this.Height / inputPins.Length+1);
outputPins[i] = new PinPanel()
{
Size = new Size((int)(this.Width * 0.1), (int)(this.Width * 0.1)),
Location = new Point(x, y),
Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right
};
outputPins[i].Click += OnClickPinPanel;
}
}
}


The result i get now is that the pinpanels get a fixed location but when you have more then 1 pinpanel, the location is wrong its like if he thinks that the usercontrol is bigger then it is Reality. In order to see all the pins i have to resize and get this After resize



I want it to look like this
expectations







c# winforms user-controls panel






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Dec 31 '18 at 14:41









Maxime C.Maxime C.

63




63













  • Your code need to move the left and top properties. When one control get larger the surrounding controls need to move so they do not overlap onto the one that grows larger so you need to change the left and top properties.

    – jdweng
    Dec 31 '18 at 14:44











  • @jdweng What about the positioning of the pinpanels? It needs to be of a certain size to see them all and there in the wrong location

    – Maxime C.
    Dec 31 '18 at 15:05











  • I specifically use the word "Controls" not panel because I was referring to ALL objects on the form.

    – jdweng
    Dec 31 '18 at 21:44



















  • Your code need to move the left and top properties. When one control get larger the surrounding controls need to move so they do not overlap onto the one that grows larger so you need to change the left and top properties.

    – jdweng
    Dec 31 '18 at 14:44











  • @jdweng What about the positioning of the pinpanels? It needs to be of a certain size to see them all and there in the wrong location

    – Maxime C.
    Dec 31 '18 at 15:05











  • I specifically use the word "Controls" not panel because I was referring to ALL objects on the form.

    – jdweng
    Dec 31 '18 at 21:44

















Your code need to move the left and top properties. When one control get larger the surrounding controls need to move so they do not overlap onto the one that grows larger so you need to change the left and top properties.

– jdweng
Dec 31 '18 at 14:44





Your code need to move the left and top properties. When one control get larger the surrounding controls need to move so they do not overlap onto the one that grows larger so you need to change the left and top properties.

– jdweng
Dec 31 '18 at 14:44













@jdweng What about the positioning of the pinpanels? It needs to be of a certain size to see them all and there in the wrong location

– Maxime C.
Dec 31 '18 at 15:05





@jdweng What about the positioning of the pinpanels? It needs to be of a certain size to see them all and there in the wrong location

– Maxime C.
Dec 31 '18 at 15:05













I specifically use the word "Controls" not panel because I was referring to ALL objects on the form.

– jdweng
Dec 31 '18 at 21:44





I specifically use the word "Controls" not panel because I was referring to ALL objects on the form.

– jdweng
Dec 31 '18 at 21:44












1 Answer
1






active

oldest

votes


















0














Try something like this out.



Here is my test rig:



public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
numericUpDown1.Value = someChip1.NumberInputPins;
numericUpDown2.Value = someChip1.NumberOutputPins;
}

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
someChip1.NumberInputPins = (int)numericUpDown1.Value;
}

private void numericUpDown2_ValueChanged(object sender, EventArgs e)
{
someChip1.NumberOutputPins = (int)numericUpDown2.Value;
}

}


Sample chip with 5 inputs and 3 outputs:



enter image description here



Here is my PinPanel UserControl (just draws an ellipse/pin the size of the control):



public partial class PinPanel : UserControl
{

public PinPanel()
{
InitializeComponent();
}

private void PinPanel_Paint(object sender, PaintEventArgs e)
{
Rectangle rc = new Rectangle(new Point(0, 0), new Size(this.ClientRectangle.Width - 1, this.ClientRectangle.Height - 1));
e.Graphics.DrawEllipse(Pens.Black, rc);
}

private void PinPanel_SizeChanged(object sender, EventArgs e)
{
this.Refresh();
}

}


And finally, my SomeChip UserControl:



public partial class SomeChip : UserControl
{

public event PinPanelClick ClickedPinPanel;
public delegate void PinPanelClick(int index, bool input);

private PinPanel inputPins;
private PinPanel outputPins;

private int _NumberInputPins = 2;
public int NumberInputPins
{
get {
return _NumberInputPins;
}
set
{
if (value > 0 && value != _NumberInputPins)
{
_NumberInputPins = value;
CreatePinPanels();
this.Refresh();
}
}
}

private int _NumberOutputPins = 1;
public int NumberOutputPins
{
get
{
return _NumberOutputPins;
}
set
{
if (value > 0 && value != _NumberOutputPins)
{
_NumberOutputPins = value;
CreatePinPanels();
this.Refresh();
}
}
}

public SomeChip()
{
InitializeComponent();
}

private void SomeChip_Load(object sender, EventArgs e)
{
CreatePinPanels();
RepositionPins();
}

private void SomeChip_SizeChanged(object sender, EventArgs e)
{
this.Refresh();
}

private void SomeChip_Paint(object sender, PaintEventArgs e)
{
int PinHeight;
// draw the input pin runs
if (inputPins != null)
{
PinHeight = (int)((double)this.Height / (double)_NumberInputPins);
for (int i = 0; i < NumberInputPins; i++)
{
int Y = (i * PinHeight) + (PinHeight / 2);
e.Graphics.DrawLine(Pens.Black, 0, Y, this.Width / 4, Y);
}
}
// draw the output pin runs
if (outputPins != null)
{
PinHeight = (int)((double)this.Height / (double)_NumberOutputPins);
for (int i = 0; i < NumberOutputPins; i++)
{
int Y = (i * PinHeight) + (PinHeight / 2);
e.Graphics.DrawLine(Pens.Black, this.Width - this.Width / 4, Y, this.Width, Y);
}
}
//draw the chip itself (takes up 50% of the width of the UserControl)
Rectangle rc = new Rectangle(new Point(this.Width / 4, 0), new Size(this.Width / 2, this.Height - 1));
using (SolidBrush sb = new SolidBrush(this.BackColor))
{
e.Graphics.FillRectangle(sb, rc);
}
e.Graphics.DrawRectangle(Pens.Black, rc);
RepositionPins();
}

private void CreatePinPanels()
{
if (inputPins != null)
{
for (int i = 0; i < inputPins.Length; i++)
{
if (inputPins[i] != null && !inputPins[i].IsDisposed)
{
inputPins[i].Dispose();
}
}
}
inputPins = new PinPanel[_NumberInputPins];
for (int i = 0; i < inputPins.Length; i++)
{
inputPins[i] = new PinPanel();
inputPins[i].Click += OnClickPinPanel;
this.Controls.Add(inputPins[i]);
}
if (outputPins != null)
{
for (int i = 0; i < outputPins.Length; i++)
{
if (outputPins[i] != null && !outputPins[i].IsDisposed)
{
outputPins[i].Dispose();
}
}
}
outputPins = new PinPanel[_NumberOutputPins];
for (int i = 0; i < outputPins.Length; i++)
{
outputPins[i] = new PinPanel();
outputPins[i].Click += OnClickPinPanel;
this.Controls.Add(outputPins[i]);
}
}

private void OnClickPinPanel(object sender, EventArgs e)
{
PinPanel p = (PinPanel)sender;
if (inputPins.Contains(p))
{
ClickedPinPanel?.Invoke(Array.IndexOf(inputPins, p), true);
}
else if (outputPins.Contains(p))
{
ClickedPinPanel?.Invoke(Array.IndexOf(inputPins, p), false);
}
}

private void RepositionPins()
{
int PinRowHeight, PinHeight;
if (inputPins != null)
{
PinRowHeight = (int)((double)this.Height / (double)_NumberInputPins);
PinHeight = (int)Math.Min((double)(PinRowHeight / 2), (double)this.Height * 0.05);
for (int i = 0; i < inputPins.Length; i++)
{
if (inputPins[i] != null && !inputPins[i].IsDisposed)
{
inputPins[i].SetBounds(0, (int)((i * PinRowHeight) + (PinRowHeight /2 ) - (PinHeight / 2)), PinHeight, PinHeight);
}
}
}
if (outputPins != null)
{
PinRowHeight = (int)((double)this.Height / (double)_NumberOutputPins);
PinHeight = (int)Math.Min((double)(PinRowHeight / 2), (double)this.Height * 0.05);
for (int i = 0; i < outputPins.Length; i++)
{
if (outputPins[i] != null && !outputPins[i].IsDisposed)
{
outputPins[i].SetBounds(this.Width - PinHeight, (int)((i * PinRowHeight) + (PinRowHeight / 2) - (PinHeight / 2)), PinHeight, PinHeight);
}
}
}
}

}





share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53988645%2fresizing-and-positioning-panels-in-another-panel%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    Try something like this out.



    Here is my test rig:



    public partial class Form1 : Form
    {

    public Form1()
    {
    InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    numericUpDown1.Value = someChip1.NumberInputPins;
    numericUpDown2.Value = someChip1.NumberOutputPins;
    }

    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
    someChip1.NumberInputPins = (int)numericUpDown1.Value;
    }

    private void numericUpDown2_ValueChanged(object sender, EventArgs e)
    {
    someChip1.NumberOutputPins = (int)numericUpDown2.Value;
    }

    }


    Sample chip with 5 inputs and 3 outputs:



    enter image description here



    Here is my PinPanel UserControl (just draws an ellipse/pin the size of the control):



    public partial class PinPanel : UserControl
    {

    public PinPanel()
    {
    InitializeComponent();
    }

    private void PinPanel_Paint(object sender, PaintEventArgs e)
    {
    Rectangle rc = new Rectangle(new Point(0, 0), new Size(this.ClientRectangle.Width - 1, this.ClientRectangle.Height - 1));
    e.Graphics.DrawEllipse(Pens.Black, rc);
    }

    private void PinPanel_SizeChanged(object sender, EventArgs e)
    {
    this.Refresh();
    }

    }


    And finally, my SomeChip UserControl:



    public partial class SomeChip : UserControl
    {

    public event PinPanelClick ClickedPinPanel;
    public delegate void PinPanelClick(int index, bool input);

    private PinPanel inputPins;
    private PinPanel outputPins;

    private int _NumberInputPins = 2;
    public int NumberInputPins
    {
    get {
    return _NumberInputPins;
    }
    set
    {
    if (value > 0 && value != _NumberInputPins)
    {
    _NumberInputPins = value;
    CreatePinPanels();
    this.Refresh();
    }
    }
    }

    private int _NumberOutputPins = 1;
    public int NumberOutputPins
    {
    get
    {
    return _NumberOutputPins;
    }
    set
    {
    if (value > 0 && value != _NumberOutputPins)
    {
    _NumberOutputPins = value;
    CreatePinPanels();
    this.Refresh();
    }
    }
    }

    public SomeChip()
    {
    InitializeComponent();
    }

    private void SomeChip_Load(object sender, EventArgs e)
    {
    CreatePinPanels();
    RepositionPins();
    }

    private void SomeChip_SizeChanged(object sender, EventArgs e)
    {
    this.Refresh();
    }

    private void SomeChip_Paint(object sender, PaintEventArgs e)
    {
    int PinHeight;
    // draw the input pin runs
    if (inputPins != null)
    {
    PinHeight = (int)((double)this.Height / (double)_NumberInputPins);
    for (int i = 0; i < NumberInputPins; i++)
    {
    int Y = (i * PinHeight) + (PinHeight / 2);
    e.Graphics.DrawLine(Pens.Black, 0, Y, this.Width / 4, Y);
    }
    }
    // draw the output pin runs
    if (outputPins != null)
    {
    PinHeight = (int)((double)this.Height / (double)_NumberOutputPins);
    for (int i = 0; i < NumberOutputPins; i++)
    {
    int Y = (i * PinHeight) + (PinHeight / 2);
    e.Graphics.DrawLine(Pens.Black, this.Width - this.Width / 4, Y, this.Width, Y);
    }
    }
    //draw the chip itself (takes up 50% of the width of the UserControl)
    Rectangle rc = new Rectangle(new Point(this.Width / 4, 0), new Size(this.Width / 2, this.Height - 1));
    using (SolidBrush sb = new SolidBrush(this.BackColor))
    {
    e.Graphics.FillRectangle(sb, rc);
    }
    e.Graphics.DrawRectangle(Pens.Black, rc);
    RepositionPins();
    }

    private void CreatePinPanels()
    {
    if (inputPins != null)
    {
    for (int i = 0; i < inputPins.Length; i++)
    {
    if (inputPins[i] != null && !inputPins[i].IsDisposed)
    {
    inputPins[i].Dispose();
    }
    }
    }
    inputPins = new PinPanel[_NumberInputPins];
    for (int i = 0; i < inputPins.Length; i++)
    {
    inputPins[i] = new PinPanel();
    inputPins[i].Click += OnClickPinPanel;
    this.Controls.Add(inputPins[i]);
    }
    if (outputPins != null)
    {
    for (int i = 0; i < outputPins.Length; i++)
    {
    if (outputPins[i] != null && !outputPins[i].IsDisposed)
    {
    outputPins[i].Dispose();
    }
    }
    }
    outputPins = new PinPanel[_NumberOutputPins];
    for (int i = 0; i < outputPins.Length; i++)
    {
    outputPins[i] = new PinPanel();
    outputPins[i].Click += OnClickPinPanel;
    this.Controls.Add(outputPins[i]);
    }
    }

    private void OnClickPinPanel(object sender, EventArgs e)
    {
    PinPanel p = (PinPanel)sender;
    if (inputPins.Contains(p))
    {
    ClickedPinPanel?.Invoke(Array.IndexOf(inputPins, p), true);
    }
    else if (outputPins.Contains(p))
    {
    ClickedPinPanel?.Invoke(Array.IndexOf(inputPins, p), false);
    }
    }

    private void RepositionPins()
    {
    int PinRowHeight, PinHeight;
    if (inputPins != null)
    {
    PinRowHeight = (int)((double)this.Height / (double)_NumberInputPins);
    PinHeight = (int)Math.Min((double)(PinRowHeight / 2), (double)this.Height * 0.05);
    for (int i = 0; i < inputPins.Length; i++)
    {
    if (inputPins[i] != null && !inputPins[i].IsDisposed)
    {
    inputPins[i].SetBounds(0, (int)((i * PinRowHeight) + (PinRowHeight /2 ) - (PinHeight / 2)), PinHeight, PinHeight);
    }
    }
    }
    if (outputPins != null)
    {
    PinRowHeight = (int)((double)this.Height / (double)_NumberOutputPins);
    PinHeight = (int)Math.Min((double)(PinRowHeight / 2), (double)this.Height * 0.05);
    for (int i = 0; i < outputPins.Length; i++)
    {
    if (outputPins[i] != null && !outputPins[i].IsDisposed)
    {
    outputPins[i].SetBounds(this.Width - PinHeight, (int)((i * PinRowHeight) + (PinRowHeight / 2) - (PinHeight / 2)), PinHeight, PinHeight);
    }
    }
    }
    }

    }





    share|improve this answer




























      0














      Try something like this out.



      Here is my test rig:



      public partial class Form1 : Form
      {

      public Form1()
      {
      InitializeComponent();
      }

      private void Form1_Load(object sender, EventArgs e)
      {
      numericUpDown1.Value = someChip1.NumberInputPins;
      numericUpDown2.Value = someChip1.NumberOutputPins;
      }

      private void numericUpDown1_ValueChanged(object sender, EventArgs e)
      {
      someChip1.NumberInputPins = (int)numericUpDown1.Value;
      }

      private void numericUpDown2_ValueChanged(object sender, EventArgs e)
      {
      someChip1.NumberOutputPins = (int)numericUpDown2.Value;
      }

      }


      Sample chip with 5 inputs and 3 outputs:



      enter image description here



      Here is my PinPanel UserControl (just draws an ellipse/pin the size of the control):



      public partial class PinPanel : UserControl
      {

      public PinPanel()
      {
      InitializeComponent();
      }

      private void PinPanel_Paint(object sender, PaintEventArgs e)
      {
      Rectangle rc = new Rectangle(new Point(0, 0), new Size(this.ClientRectangle.Width - 1, this.ClientRectangle.Height - 1));
      e.Graphics.DrawEllipse(Pens.Black, rc);
      }

      private void PinPanel_SizeChanged(object sender, EventArgs e)
      {
      this.Refresh();
      }

      }


      And finally, my SomeChip UserControl:



      public partial class SomeChip : UserControl
      {

      public event PinPanelClick ClickedPinPanel;
      public delegate void PinPanelClick(int index, bool input);

      private PinPanel inputPins;
      private PinPanel outputPins;

      private int _NumberInputPins = 2;
      public int NumberInputPins
      {
      get {
      return _NumberInputPins;
      }
      set
      {
      if (value > 0 && value != _NumberInputPins)
      {
      _NumberInputPins = value;
      CreatePinPanels();
      this.Refresh();
      }
      }
      }

      private int _NumberOutputPins = 1;
      public int NumberOutputPins
      {
      get
      {
      return _NumberOutputPins;
      }
      set
      {
      if (value > 0 && value != _NumberOutputPins)
      {
      _NumberOutputPins = value;
      CreatePinPanels();
      this.Refresh();
      }
      }
      }

      public SomeChip()
      {
      InitializeComponent();
      }

      private void SomeChip_Load(object sender, EventArgs e)
      {
      CreatePinPanels();
      RepositionPins();
      }

      private void SomeChip_SizeChanged(object sender, EventArgs e)
      {
      this.Refresh();
      }

      private void SomeChip_Paint(object sender, PaintEventArgs e)
      {
      int PinHeight;
      // draw the input pin runs
      if (inputPins != null)
      {
      PinHeight = (int)((double)this.Height / (double)_NumberInputPins);
      for (int i = 0; i < NumberInputPins; i++)
      {
      int Y = (i * PinHeight) + (PinHeight / 2);
      e.Graphics.DrawLine(Pens.Black, 0, Y, this.Width / 4, Y);
      }
      }
      // draw the output pin runs
      if (outputPins != null)
      {
      PinHeight = (int)((double)this.Height / (double)_NumberOutputPins);
      for (int i = 0; i < NumberOutputPins; i++)
      {
      int Y = (i * PinHeight) + (PinHeight / 2);
      e.Graphics.DrawLine(Pens.Black, this.Width - this.Width / 4, Y, this.Width, Y);
      }
      }
      //draw the chip itself (takes up 50% of the width of the UserControl)
      Rectangle rc = new Rectangle(new Point(this.Width / 4, 0), new Size(this.Width / 2, this.Height - 1));
      using (SolidBrush sb = new SolidBrush(this.BackColor))
      {
      e.Graphics.FillRectangle(sb, rc);
      }
      e.Graphics.DrawRectangle(Pens.Black, rc);
      RepositionPins();
      }

      private void CreatePinPanels()
      {
      if (inputPins != null)
      {
      for (int i = 0; i < inputPins.Length; i++)
      {
      if (inputPins[i] != null && !inputPins[i].IsDisposed)
      {
      inputPins[i].Dispose();
      }
      }
      }
      inputPins = new PinPanel[_NumberInputPins];
      for (int i = 0; i < inputPins.Length; i++)
      {
      inputPins[i] = new PinPanel();
      inputPins[i].Click += OnClickPinPanel;
      this.Controls.Add(inputPins[i]);
      }
      if (outputPins != null)
      {
      for (int i = 0; i < outputPins.Length; i++)
      {
      if (outputPins[i] != null && !outputPins[i].IsDisposed)
      {
      outputPins[i].Dispose();
      }
      }
      }
      outputPins = new PinPanel[_NumberOutputPins];
      for (int i = 0; i < outputPins.Length; i++)
      {
      outputPins[i] = new PinPanel();
      outputPins[i].Click += OnClickPinPanel;
      this.Controls.Add(outputPins[i]);
      }
      }

      private void OnClickPinPanel(object sender, EventArgs e)
      {
      PinPanel p = (PinPanel)sender;
      if (inputPins.Contains(p))
      {
      ClickedPinPanel?.Invoke(Array.IndexOf(inputPins, p), true);
      }
      else if (outputPins.Contains(p))
      {
      ClickedPinPanel?.Invoke(Array.IndexOf(inputPins, p), false);
      }
      }

      private void RepositionPins()
      {
      int PinRowHeight, PinHeight;
      if (inputPins != null)
      {
      PinRowHeight = (int)((double)this.Height / (double)_NumberInputPins);
      PinHeight = (int)Math.Min((double)(PinRowHeight / 2), (double)this.Height * 0.05);
      for (int i = 0; i < inputPins.Length; i++)
      {
      if (inputPins[i] != null && !inputPins[i].IsDisposed)
      {
      inputPins[i].SetBounds(0, (int)((i * PinRowHeight) + (PinRowHeight /2 ) - (PinHeight / 2)), PinHeight, PinHeight);
      }
      }
      }
      if (outputPins != null)
      {
      PinRowHeight = (int)((double)this.Height / (double)_NumberOutputPins);
      PinHeight = (int)Math.Min((double)(PinRowHeight / 2), (double)this.Height * 0.05);
      for (int i = 0; i < outputPins.Length; i++)
      {
      if (outputPins[i] != null && !outputPins[i].IsDisposed)
      {
      outputPins[i].SetBounds(this.Width - PinHeight, (int)((i * PinRowHeight) + (PinRowHeight / 2) - (PinHeight / 2)), PinHeight, PinHeight);
      }
      }
      }
      }

      }





      share|improve this answer


























        0












        0








        0







        Try something like this out.



        Here is my test rig:



        public partial class Form1 : Form
        {

        public Form1()
        {
        InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        numericUpDown1.Value = someChip1.NumberInputPins;
        numericUpDown2.Value = someChip1.NumberOutputPins;
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
        someChip1.NumberInputPins = (int)numericUpDown1.Value;
        }

        private void numericUpDown2_ValueChanged(object sender, EventArgs e)
        {
        someChip1.NumberOutputPins = (int)numericUpDown2.Value;
        }

        }


        Sample chip with 5 inputs and 3 outputs:



        enter image description here



        Here is my PinPanel UserControl (just draws an ellipse/pin the size of the control):



        public partial class PinPanel : UserControl
        {

        public PinPanel()
        {
        InitializeComponent();
        }

        private void PinPanel_Paint(object sender, PaintEventArgs e)
        {
        Rectangle rc = new Rectangle(new Point(0, 0), new Size(this.ClientRectangle.Width - 1, this.ClientRectangle.Height - 1));
        e.Graphics.DrawEllipse(Pens.Black, rc);
        }

        private void PinPanel_SizeChanged(object sender, EventArgs e)
        {
        this.Refresh();
        }

        }


        And finally, my SomeChip UserControl:



        public partial class SomeChip : UserControl
        {

        public event PinPanelClick ClickedPinPanel;
        public delegate void PinPanelClick(int index, bool input);

        private PinPanel inputPins;
        private PinPanel outputPins;

        private int _NumberInputPins = 2;
        public int NumberInputPins
        {
        get {
        return _NumberInputPins;
        }
        set
        {
        if (value > 0 && value != _NumberInputPins)
        {
        _NumberInputPins = value;
        CreatePinPanels();
        this.Refresh();
        }
        }
        }

        private int _NumberOutputPins = 1;
        public int NumberOutputPins
        {
        get
        {
        return _NumberOutputPins;
        }
        set
        {
        if (value > 0 && value != _NumberOutputPins)
        {
        _NumberOutputPins = value;
        CreatePinPanels();
        this.Refresh();
        }
        }
        }

        public SomeChip()
        {
        InitializeComponent();
        }

        private void SomeChip_Load(object sender, EventArgs e)
        {
        CreatePinPanels();
        RepositionPins();
        }

        private void SomeChip_SizeChanged(object sender, EventArgs e)
        {
        this.Refresh();
        }

        private void SomeChip_Paint(object sender, PaintEventArgs e)
        {
        int PinHeight;
        // draw the input pin runs
        if (inputPins != null)
        {
        PinHeight = (int)((double)this.Height / (double)_NumberInputPins);
        for (int i = 0; i < NumberInputPins; i++)
        {
        int Y = (i * PinHeight) + (PinHeight / 2);
        e.Graphics.DrawLine(Pens.Black, 0, Y, this.Width / 4, Y);
        }
        }
        // draw the output pin runs
        if (outputPins != null)
        {
        PinHeight = (int)((double)this.Height / (double)_NumberOutputPins);
        for (int i = 0; i < NumberOutputPins; i++)
        {
        int Y = (i * PinHeight) + (PinHeight / 2);
        e.Graphics.DrawLine(Pens.Black, this.Width - this.Width / 4, Y, this.Width, Y);
        }
        }
        //draw the chip itself (takes up 50% of the width of the UserControl)
        Rectangle rc = new Rectangle(new Point(this.Width / 4, 0), new Size(this.Width / 2, this.Height - 1));
        using (SolidBrush sb = new SolidBrush(this.BackColor))
        {
        e.Graphics.FillRectangle(sb, rc);
        }
        e.Graphics.DrawRectangle(Pens.Black, rc);
        RepositionPins();
        }

        private void CreatePinPanels()
        {
        if (inputPins != null)
        {
        for (int i = 0; i < inputPins.Length; i++)
        {
        if (inputPins[i] != null && !inputPins[i].IsDisposed)
        {
        inputPins[i].Dispose();
        }
        }
        }
        inputPins = new PinPanel[_NumberInputPins];
        for (int i = 0; i < inputPins.Length; i++)
        {
        inputPins[i] = new PinPanel();
        inputPins[i].Click += OnClickPinPanel;
        this.Controls.Add(inputPins[i]);
        }
        if (outputPins != null)
        {
        for (int i = 0; i < outputPins.Length; i++)
        {
        if (outputPins[i] != null && !outputPins[i].IsDisposed)
        {
        outputPins[i].Dispose();
        }
        }
        }
        outputPins = new PinPanel[_NumberOutputPins];
        for (int i = 0; i < outputPins.Length; i++)
        {
        outputPins[i] = new PinPanel();
        outputPins[i].Click += OnClickPinPanel;
        this.Controls.Add(outputPins[i]);
        }
        }

        private void OnClickPinPanel(object sender, EventArgs e)
        {
        PinPanel p = (PinPanel)sender;
        if (inputPins.Contains(p))
        {
        ClickedPinPanel?.Invoke(Array.IndexOf(inputPins, p), true);
        }
        else if (outputPins.Contains(p))
        {
        ClickedPinPanel?.Invoke(Array.IndexOf(inputPins, p), false);
        }
        }

        private void RepositionPins()
        {
        int PinRowHeight, PinHeight;
        if (inputPins != null)
        {
        PinRowHeight = (int)((double)this.Height / (double)_NumberInputPins);
        PinHeight = (int)Math.Min((double)(PinRowHeight / 2), (double)this.Height * 0.05);
        for (int i = 0; i < inputPins.Length; i++)
        {
        if (inputPins[i] != null && !inputPins[i].IsDisposed)
        {
        inputPins[i].SetBounds(0, (int)((i * PinRowHeight) + (PinRowHeight /2 ) - (PinHeight / 2)), PinHeight, PinHeight);
        }
        }
        }
        if (outputPins != null)
        {
        PinRowHeight = (int)((double)this.Height / (double)_NumberOutputPins);
        PinHeight = (int)Math.Min((double)(PinRowHeight / 2), (double)this.Height * 0.05);
        for (int i = 0; i < outputPins.Length; i++)
        {
        if (outputPins[i] != null && !outputPins[i].IsDisposed)
        {
        outputPins[i].SetBounds(this.Width - PinHeight, (int)((i * PinRowHeight) + (PinRowHeight / 2) - (PinHeight / 2)), PinHeight, PinHeight);
        }
        }
        }
        }

        }





        share|improve this answer













        Try something like this out.



        Here is my test rig:



        public partial class Form1 : Form
        {

        public Form1()
        {
        InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        numericUpDown1.Value = someChip1.NumberInputPins;
        numericUpDown2.Value = someChip1.NumberOutputPins;
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
        someChip1.NumberInputPins = (int)numericUpDown1.Value;
        }

        private void numericUpDown2_ValueChanged(object sender, EventArgs e)
        {
        someChip1.NumberOutputPins = (int)numericUpDown2.Value;
        }

        }


        Sample chip with 5 inputs and 3 outputs:



        enter image description here



        Here is my PinPanel UserControl (just draws an ellipse/pin the size of the control):



        public partial class PinPanel : UserControl
        {

        public PinPanel()
        {
        InitializeComponent();
        }

        private void PinPanel_Paint(object sender, PaintEventArgs e)
        {
        Rectangle rc = new Rectangle(new Point(0, 0), new Size(this.ClientRectangle.Width - 1, this.ClientRectangle.Height - 1));
        e.Graphics.DrawEllipse(Pens.Black, rc);
        }

        private void PinPanel_SizeChanged(object sender, EventArgs e)
        {
        this.Refresh();
        }

        }


        And finally, my SomeChip UserControl:



        public partial class SomeChip : UserControl
        {

        public event PinPanelClick ClickedPinPanel;
        public delegate void PinPanelClick(int index, bool input);

        private PinPanel inputPins;
        private PinPanel outputPins;

        private int _NumberInputPins = 2;
        public int NumberInputPins
        {
        get {
        return _NumberInputPins;
        }
        set
        {
        if (value > 0 && value != _NumberInputPins)
        {
        _NumberInputPins = value;
        CreatePinPanels();
        this.Refresh();
        }
        }
        }

        private int _NumberOutputPins = 1;
        public int NumberOutputPins
        {
        get
        {
        return _NumberOutputPins;
        }
        set
        {
        if (value > 0 && value != _NumberOutputPins)
        {
        _NumberOutputPins = value;
        CreatePinPanels();
        this.Refresh();
        }
        }
        }

        public SomeChip()
        {
        InitializeComponent();
        }

        private void SomeChip_Load(object sender, EventArgs e)
        {
        CreatePinPanels();
        RepositionPins();
        }

        private void SomeChip_SizeChanged(object sender, EventArgs e)
        {
        this.Refresh();
        }

        private void SomeChip_Paint(object sender, PaintEventArgs e)
        {
        int PinHeight;
        // draw the input pin runs
        if (inputPins != null)
        {
        PinHeight = (int)((double)this.Height / (double)_NumberInputPins);
        for (int i = 0; i < NumberInputPins; i++)
        {
        int Y = (i * PinHeight) + (PinHeight / 2);
        e.Graphics.DrawLine(Pens.Black, 0, Y, this.Width / 4, Y);
        }
        }
        // draw the output pin runs
        if (outputPins != null)
        {
        PinHeight = (int)((double)this.Height / (double)_NumberOutputPins);
        for (int i = 0; i < NumberOutputPins; i++)
        {
        int Y = (i * PinHeight) + (PinHeight / 2);
        e.Graphics.DrawLine(Pens.Black, this.Width - this.Width / 4, Y, this.Width, Y);
        }
        }
        //draw the chip itself (takes up 50% of the width of the UserControl)
        Rectangle rc = new Rectangle(new Point(this.Width / 4, 0), new Size(this.Width / 2, this.Height - 1));
        using (SolidBrush sb = new SolidBrush(this.BackColor))
        {
        e.Graphics.FillRectangle(sb, rc);
        }
        e.Graphics.DrawRectangle(Pens.Black, rc);
        RepositionPins();
        }

        private void CreatePinPanels()
        {
        if (inputPins != null)
        {
        for (int i = 0; i < inputPins.Length; i++)
        {
        if (inputPins[i] != null && !inputPins[i].IsDisposed)
        {
        inputPins[i].Dispose();
        }
        }
        }
        inputPins = new PinPanel[_NumberInputPins];
        for (int i = 0; i < inputPins.Length; i++)
        {
        inputPins[i] = new PinPanel();
        inputPins[i].Click += OnClickPinPanel;
        this.Controls.Add(inputPins[i]);
        }
        if (outputPins != null)
        {
        for (int i = 0; i < outputPins.Length; i++)
        {
        if (outputPins[i] != null && !outputPins[i].IsDisposed)
        {
        outputPins[i].Dispose();
        }
        }
        }
        outputPins = new PinPanel[_NumberOutputPins];
        for (int i = 0; i < outputPins.Length; i++)
        {
        outputPins[i] = new PinPanel();
        outputPins[i].Click += OnClickPinPanel;
        this.Controls.Add(outputPins[i]);
        }
        }

        private void OnClickPinPanel(object sender, EventArgs e)
        {
        PinPanel p = (PinPanel)sender;
        if (inputPins.Contains(p))
        {
        ClickedPinPanel?.Invoke(Array.IndexOf(inputPins, p), true);
        }
        else if (outputPins.Contains(p))
        {
        ClickedPinPanel?.Invoke(Array.IndexOf(inputPins, p), false);
        }
        }

        private void RepositionPins()
        {
        int PinRowHeight, PinHeight;
        if (inputPins != null)
        {
        PinRowHeight = (int)((double)this.Height / (double)_NumberInputPins);
        PinHeight = (int)Math.Min((double)(PinRowHeight / 2), (double)this.Height * 0.05);
        for (int i = 0; i < inputPins.Length; i++)
        {
        if (inputPins[i] != null && !inputPins[i].IsDisposed)
        {
        inputPins[i].SetBounds(0, (int)((i * PinRowHeight) + (PinRowHeight /2 ) - (PinHeight / 2)), PinHeight, PinHeight);
        }
        }
        }
        if (outputPins != null)
        {
        PinRowHeight = (int)((double)this.Height / (double)_NumberOutputPins);
        PinHeight = (int)Math.Min((double)(PinRowHeight / 2), (double)this.Height * 0.05);
        for (int i = 0; i < outputPins.Length; i++)
        {
        if (outputPins[i] != null && !outputPins[i].IsDisposed)
        {
        outputPins[i].SetBounds(this.Width - PinHeight, (int)((i * PinRowHeight) + (PinRowHeight / 2) - (PinHeight / 2)), PinHeight, PinHeight);
        }
        }
        }
        }

        }






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Dec 31 '18 at 18:16









        Idle_MindIdle_Mind

        22.8k21424




        22.8k21424
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53988645%2fresizing-and-positioning-panels-in-another-panel%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Mossoró

            Error while reading .h5 file using the rhdf5 package in R

            Pushsharp Apns notification error: 'InvalidToken'