2012-08-30 13 views
7

Ho un controllo usc che ha una casella di testo e una casella di riepilogo e li utilizza per fornire agli utenti funzionalità di completamento automatico.Mostrare il controllo all'interno del controllo utente al di fuori dei limiti della sua madre

Tuttavia, desidero che la casella di riepilogo venga disegnata all'esterno dei limiti del controllo utente in modo che non venga tagliata quando la casella di riepilogo deve essere disegnata vicino al bordo del controllo utente. Qualche consiglio su come farlo? Essenzialmente voglio una listbox che vada oltre i limiti del suo controllo contenitore.

L'unico modo in cui posso pensare è passare un riferimento a una listbox esterna al controllo utente sull'istanza e quindi manipolare quella listbox invece di averla dentro il controllo utente, ma non mi piace questo approccio. Grazie in anticipo.

+0

Che cosa si intende per confini il controllo dell'utente? –

+0

@BenRobinson: la casella di testo si espande per compilare il controllo utente. Se l'utente sta scrivendo vicino al bordo della casella di testo, sta essenzialmente digitando vicino al bordo del controllo utente. Se mostro una listbox alla posizione del cursore, verrà esclusa dal limite di usercontrol. Non voglio che ciò accada. – user1391664

+0

Scusa se non ho letto i tag, stavo pensando che l'utente di asp.net controlli –

risposta

5

Il problema è che non puoi sfuggire ai limiti del modulo contenitore, ma puoi ospitare il tuo controllo da qualche altra parte.

Ecco quello che ho ottenuto lavorando abusando della classe ToolStripDropDown (lo uso per visualizzare datepickers in una grande 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(); 
    } 
} 

Usage:

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

     m_popup.Show(this); 
    } 
+0

Sì, ha funzionato. Grazie. – user1391664

Problemi correlati