2012-08-30 13 views
7

मेरे पास एक उपयोगकर्ता नियंत्रण है जिसमें एक टेक्स्टबॉक्स और एक सूची बॉक्स है, और यह उपयोगकर्ताओं को स्वत: पूर्ण कार्यक्षमता प्रदान करने के लिए उनका उपयोग करता है।अपने माता-पिता की सीमाओं के बाहर उपयोगकर्ता नियंत्रण के अंदर नियंत्रण दिखाएं

हालांकि, मैं चाहता हूं कि सूची बॉक्स उपयोगकर्ता नियंत्रण की सीमाओं के बाहर खींचा जाए ताकि उपयोगकर्ता नियंत्रण के किनारे के पास सूची बॉक्स को खींचा जाए तो इसे कटऑफ नहीं मिलता है। ऐसा करने के तरीके पर कोई सुझाव? अनिवार्य रूप से मैं अपने कंटेनर नियंत्रण की सीमाओं के बाहर एक सूची बॉक्स चाहता हूं।

एकमात्र तरीका मैं सोच सकता हूं कि तत्कालता पर उपयोगकर्ता नियंत्रण के लिए बाहरी सूची बॉक्स का संदर्भ पास करना है और उसके बाद उपयोगकर्ता नियंत्रण में इसे रखने के बजाय उस सूची बॉक्स में हेरफेर करना है, लेकिन मुझे यह दृष्टिकोण पसंद नहीं है। अग्रिम में धन्यवाद।

+0

आप की सीमाओं से क्या मतलब है उपयोगकर्ता नियंत्रण? –

+0

@ बेनबॉबिन्सन: टेक्स्टबॉक्स उपयोगकर्ता नियंत्रण को भरने के लिए विस्तारित करता है। यदि उपयोगकर्ता टेक्स्टबॉक्स के किनारे के पास टाइप कर रहा है, तो वह अनिवार्य रूप से उपयोगकर्ता नियंत्रण के किनारे के पास टाइप कर रहा है। अगर मैं कर्सर की स्थिति में एक सूची बॉक्स दिखाता हूं, तो यह उपयोगकर्ता नियंत्रण सीमा से कटऑफ होगा। मैं नहीं चाहता कि ऐसा हो। – user1391664

+0

क्षमा करें मैंने आपके टैग नहीं पढ़े, मैं एएसपीनेट उपयोगकर्ता नियंत्रण –

उत्तर

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

Yup सोच रहा था, यह काम किया। धन्यवाद। – user1391664

संबंधित मुद्दे