2012-08-30 53 views
7

我有一個帶有文本框和列表框的用戶控件,它使用它們爲用戶提供自動完成功能。在其父級的邊界之外顯示控件內部的用戶控件

但是,我希望列表框被繪製在用戶控件的邊界之外,以便在列表框必須在用戶控件的邊緣附近繪製時不會被截斷。有關如何做到這一點的任何提示?基本上我想要一個列表框在其容器控件邊界之外浮動。

我能想到的唯一方法是將實例化的用戶控件的外部列表框的引用傳遞給用戶控件,然後操作該列表框,而不是將其放在用戶控件中,但我不喜歡這種方法。提前致謝。

+0

你通過邊界的意思用戶控制? –

+0

@ BenRobinson:文本框展開後填寫用戶控件。如果用戶在文本框的邊緣附近打字,他基本上是在靠近用戶控制的邊緣打字。如果我在光標位置顯示一個列表框,它將被用戶控件邊界切斷。我不希望發生這種情況。 – user1391664

+0

對不起,我沒有閱讀你的標籤,我在想asp.net用戶控件 –

回答

5

問題是,您無法越過容器表單邊界,但您可以將控件託管在其他位置。

下面是我通過濫用ToolstripDropDown類工作(我用它來顯示在大型企業應用datepickers)什麼:

/// <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(); 
    } 
} 

用法:

private PopupHelper m_popup; 
    private void ShowPopup() 
    { 
     if (m_popup == null) 
      m_popup = new PopupHelper(yourListControl); 

     m_popup.Show(this); 
    } 
+0

是的,這工作。謝謝。 – user1391664

相關問題