2012-08-30 31 views
7

Kullanıcılara bir metin kutusu ve bir liste kutusu içeren ve kullanıcılara otomatik tamamlama işlevselliği sağlamak için kullandığı bir usercontrol var. Ancak, liste kutusunun kullanıcı denetiminin sınırlarının dışına çekilmesini istiyorum, böylece liste kutusunun kullanıcı denetiminin kenarına yakın çekilmesi gerektiğinde kesilmemesi sağlanacaktır. Bunun nasıl yapılacağına dair bir ipucu var mı? Esas olarak, konteynır kontrolu sınırları dışında yüzen bir liste kutusu istiyorum.Ana denetimin kendi sınırları içinde kullanıcı denetimi içinde denetimi gösterme

Düşünebildiğim tek yol, bir dış liste kutusuna bir örnekleme üzerinde kullanıcı denetimi üzerinde bir başvuru iletmek ve sonra kullanıcı denetiminin içine koymak yerine bu liste kutusunu işlemek, ancak bu yaklaşımı sevmemektir. Şimdiden teşekkürler.

+0

Eğer sınırları ile ne demek istiyorsun kullanıcı kontrolü? –

+0

@BenRobinson: Kullanıcı denetimini doldurmak için metin kutusu genişler. Kullanıcı, metin kutusunun kenarına yakın yazıyorsa, aslında kullanıcı denetimi kenarına yakın yazıyordur. İmleç konumunda bir liste kutusu gösterirse, usercontrol sınırı tarafından kesilir. Bunun olmasını istemiyorum. – user1391664

+0

Üzgünüz, etiketler okundu, ben asp.net kullanıcı denetleyicileri –

cevap

5

Sorun şu ki, konteyner form sınırlarından kaçamazsınız, ancak denetiminizi başka bir yere koyabilirsiniz. İşte

(Ben büyük bir şirkette uygulamasında datepickers görüntülemek için kullanabilirsiniz) ToolstripDropDown sınıfını kötüye kullanarak çalışan ne var:

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

Kullanımı:

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

     m_popup.Show(this); 
    } 
+0

Yup olduğunu düşünüyordum, bu işe yaradı. Teşekkürler. – user1391664