2012-08-30 8 views
7

Tôi có một usercontrol có một hộp văn bản và một hộp danh sách, và nó sử dụng chúng để cung cấp chức năng tự động hoàn chỉnh cho người dùng.Hiển thị điều khiển bên trong kiểm soát người dùng bên ngoài ranh giới của phụ huynh

Tuy nhiên, tôi muốn hộp danh sách được vẽ bên ngoài ranh giới của điều khiển người dùng để nó không bị cắt khi hộp danh sách phải được vẽ gần rìa của điều khiển người dùng. Bất kỳ lời khuyên nào về cách thực hiện điều đó? Về cơ bản tôi muốn một hộp danh sách nổi bên ngoài ranh giới của điều khiển vùng chứa của nó. Cách duy nhất tôi có thể nghĩ là chuyển một tham chiếu đến một hộp danh sách bên ngoài để điều khiển người dùng trên instantiation và sau đó thao tác listbox thay vì có nó bên trong điều khiển người dùng, nhưng tôi không thích cách tiếp cận này. Cảm ơn trước.

+0

Ý anh là gì bởi ranh giới của điều khiển người dùng? –

+0

@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

+0

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 –

Trả lời

5

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); 
    } 
+0

Yup, điều này làm việc. Cảm ơn. – user1391664