Vấn đề là bạn không thể thoát khỏi giới hạn biểu mẫu vùng chứa của mình, nhưng bạn có thể lưu trữ quyền kiểm soát của mình ở một nơi khác.
Đây là những gì tôi đã làm việc bằng cách lạm dụng lớp ToolstripDropDown (tôi sử dụng nó để hiển thị datepickers trong một ứng dụng doanh nghiệp lớn):
/// <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();
}
}
Cách sử dụng:
private PopupHelper m_popup;
private void ShowPopup()
{
if (m_popup == null)
m_popup = new PopupHelper(yourListControl);
m_popup.Show(this);
}
Ý anh là gì bởi ranh giới của điều khiển người dùng? –
@BenRobinson: Hộp văn bản mở rộng để điền vào điều khiển người dùng. Nếu người dùng đang gõ gần cạnh của hộp văn bản, anh ta chủ yếu là gõ gần rìa của điều khiển người dùng. Nếu tôi hiển thị hộp danh sách ở vị trí con trỏ, nó sẽ bị cắt bởi ranh giới usercontrol. Tôi không muốn điều đó xảy ra. – user1391664
Xin lỗi tôi đã không đọc thẻ của bạn, tôi đã suy nghĩ điều khiển người dùng asp.net –