Show control inside a user control outside of its parent

I have a usercontrol that has a text box and a list, and it uses them to provide autocomplete functionality for users.

However, I want the list to appear outside of the user control so that it doesn't get cropped when the list needs to be drawn near the edge of the user control. Any tips on how to do this? Essentially, I want the listbox to float outside of its container control.

The only way I can think of it is to pass the link to the external list for the user control when creating the instance, and then manipulate that list instead of having it inside the user control, but I don't like this approach. Thanks in advance.

+7
source share
1 answer

The problem is that you cannot escape the borders of your container form, but you can place your control somewhere else.

Here is what I got from working using the ToolstripDropDown class (I use it to display datepickers in a large enterprise application):

/// <summary> /// PopupHelper /// </summary> public sealed class PopupHelper : IDisposable { private readonly Control m_control; private readonly ToolStripDropDown m_tsdd; private readonly Panel m_hostPanel; // workarround - some controls don't display correctly if they are hosted directly in ToolStripControlHost public PopupHelper(Control pControl) { m_hostPanel = new Panel(); m_hostPanel.Padding = Padding.Empty; m_hostPanel.Margin = Padding.Empty; m_hostPanel.TabStop = false; m_hostPanel.BorderStyle = BorderStyle.None; m_hostPanel.BackColor = Color.Transparent; m_tsdd = new ToolStripDropDown(); m_tsdd.CausesValidation = false; m_tsdd.Padding = Padding.Empty; m_tsdd.Margin = Padding.Empty; m_tsdd.Opacity = 0.9; m_control = pControl; m_control.CausesValidation = false; m_control.Resize += MControlResize; m_hostPanel.Controls.Add(m_control); m_tsdd.Padding = Padding.Empty; m_tsdd.Margin = Padding.Empty; m_tsdd.MinimumSize = m_tsdd.MaximumSize = m_tsdd.Size = pControl.Size; m_tsdd.Items.Add(new ToolStripControlHost(m_hostPanel)); } private void ResizeWindow() { m_tsdd.MinimumSize = m_tsdd.MaximumSize = m_tsdd.Size = m_control.Size; m_hostPanel.MinimumSize = m_hostPanel.MaximumSize = m_hostPanel.Size = m_control.Size; } private void MControlResize(object sender, EventArgs e) { ResizeWindow(); } /// <summary> /// Display the popup and keep the focus /// </summary> /// <param name="pParentControl"></param> public void Show(Control pParentControl) { if (pParentControl == null) return; // position the popup window var loc = pParentControl.PointToScreen(new Point(0, pParentControl.Height)); m_tsdd.Show(loc); m_control.Focus(); } public void Close() { m_tsdd.Close(); } public void Dispose() { m_control.Resize -= MControlResize; m_tsdd.Dispose(); m_hostPanel.Dispose(); } } 

Using:

  private PopupHelper m_popup; private void ShowPopup() { if (m_popup == null) m_popup = new PopupHelper(yourListControl); m_popup.Show(this); } 
+5
source

All Articles