2012-08-30 8 views
7

ユーザーコントロールにはテキストボックスとリストボックスがあり、ユーザーコントロールにはオートコンプリート機能があります。親コントロールの境界内にユーザーコントロールのコントロールを表示します

ただし、リストボックスをユーザーコントロールの境界の外側に描画し、リストボックスをユーザーコントロールの端の近くに描画する必要があるときに、カットオフしないようにします。それを行う方法に関するヒント?基本的には、コンテナコントロールの境界の外側にリストボックスを浮かべておきたいです。

私が考えることができる唯一の方法は、外部リストボックスへの参照をインスタンス化のユーザーコントロールに渡してから、ユーザーコントロール内に置くのではなくそのリストボックスを操作することです。前もって感謝します。

+0

あなたがの境界線とはどういう意味ですかユーザーコントロール? –

+0

@BenRobinson:テキストボックスを展開して、ユーザーコントロールに入力します。ユーザーがテキストボックスの端の近くに入力している場合は、基本的にユーザーコントロールの端の近くに入力しています。カーソル位置にリストボックスを表示すると、ユーザーコントロールの境界線によってカットオフされます。私はそれが起こることを望んでいない。 – user1391664

+0

申し訳ありません、私はあなたのタグを読んでいない、私はasp.netのユーザーコントロールを考えていた –

答えて

5

問題は、コンテナのフォーム境界からエスケープすることはできませんが、コントロールを別の場所にホストすることができます。

ここで(私は大規模なエンタープライズアプリケーションでdatepickersを表示するためにそれを使用する)私はToolstripDropDownクラスを乱用することによって作業得たものです:

/// <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