views:

113

answers:

2

A ToolStripComboBox is placed after a ToolStripButton and is folowed by another one, which is right-aligned. How do I best set up the ToolStripComboBox to always adjust its length to fill all the space available between the preceeding and the folowing ToolStripButtons?

In past I used to handle a parent resize event, calculate the new length to set based on neighboring elements coordinates and setting the new size. But now, as I am developing a new application, I wonder if there is no better way.

A: 

There's no automatic layout option for this. But you can easily do it by implementing the ToolStrip.Resize event. This worked well:

    private void toolStrip1_Resize(object sender, EventArgs e) {
        toolStripComboBox1.Width = toolStripComboBox2.Bounds.Left - toolStripButton1.Bounds.Right - 4;
    }
    protected override void OnLoad(EventArgs e) {
        toolStrip1_Resize(this, e);
    }

Be sure to set the TSCB's AutoResize property to False or it won't work.

Hans Passant
Here goes a problem (I can't remember I had such in past, when I was using V2005). On each odd significant (the effect does not take place if size difference is as small as couple of pixels or so) size decrease a ToolStripComboBox disappears (appears if I decrease it once again (and is going to disappear again if I decrease it once more) or increase it). AutoResize is set to false, increasing a digit to be subtracted (which is 4 in your example) didn't help. The ToolStrip located inside a SplitContainer panel and is resized each time a mannel is resized by dragging the SplitContainer splitter.
Ivan
The most common occurrence case of the problem pattern I describe is restoring a form from maximized state - both ToolStripComboBoxes (in the left panel and in the right panel) disappear in this case.
Ivan
A: 

I use the following with great success:

private void toolStrip1_Layout(System.Object sender, System.Windows.Forms.LayoutEventArgs e)
{
    int width = toolStrip1.DisplayRectangle.Width;

    foreach (ToolStripItem tsi in toolStrip1.Items) {
        if (!(tsi == toolStripComboBox1)) {
            width -= tsi.Width;
            width -= tsi.Margin.Horizontal;
        }
    }

    toolStripComboBox1.Width = Math.Max(0, width - toolStripComboBox1.Margin.Horizontal);
}

The above code does not suffer from the disapearing control problem.

Martin