2008-11-11 16 views
10

मैंने डेटाटाइम पिकर को फिर से कार्यान्वित करने का निर्णय लिया है, क्योंकि एक मानक डेटाटाइम पिकर शून्य नहीं है। उपयोगकर्ता रिक्त फ़ील्ड से शुरू करना चाहता है और दिनांक (चयन नहीं) टाइप करना चाहता है।फॉर्म नियंत्रण के बाहर उपयोगकर्ता नियंत्रण प्रदर्शन

मैंने ऐसा करने के लिए उपयोगकर्ता नियंत्रण बनाया है, लेकिन यदि उपयोगकर्ता नियंत्रण फ़ॉर्म के किनारे के पास है, तो इसे फॉर्म सीमा पर काट दिया जाएगा। मानक डेटाटाइम पिकर इस समस्या से पीड़ित नहीं है।

यहां एक समस्या दिखा रही तस्वीर है। मेरे उपयोगकर्ता नियंत्रण बाईं तरफ है, मानक DateTimePicker सही पर है:

alt text http://img50.imageshack.us/img50/9104/datetimepickervu6.jpg

आप देख सकते हैं, मानक नियंत्रण फार्म और आवेदन सीमा से अधिक प्रदर्शित करेगा। मैं वही काम करने के लिए अपने नियंत्रण में महीने पिकर कैसे प्राप्त करूं?

धन्यवाद!

+0

स्क्रीनशॉट देखो कि तुम एक WinForm में काम कर रहे हैं asp.net नहीं के रूप में अपने टैग बता सकते हैं? सामान्य? –

+0

हां, मेरा टैग गलत था। मुझे लगता है कि मुझे एक और कोक चाहिए। :) –

+0

ओह, तो लोग * करते हैं * आईई का उपयोग करें :) – Dan

उत्तर

24

टूलस्ट्रिपड्रॉपडाउन नियंत्रण में यह कार्यक्षमता है जिससे इसे विरासत में मिलाकर हम एक साधारण पॉपअपविंडो बना सकते हैं।

/// <summary> 
/// A simple popup window that can host any System.Windows.Forms.Control 
/// </summary> 
public class PopupWindow : System.Windows.Forms.ToolStripDropDown 
{ 
    private System.Windows.Forms.Control _content; 
    private System.Windows.Forms.ToolStripControlHost _host; 

    public PopupWindow(System.Windows.Forms.Control content) 
    { 
     //Basic setup... 
     this.AutoSize = false; 
     this.DoubleBuffered = true; 
     this.ResizeRedraw = true; 

     this._content = content; 
     this._host = new System.Windows.Forms.ToolStripControlHost(content); 

     //Positioning and Sizing 
     this.MinimumSize = content.MinimumSize; 
     this.MaximumSize = content.Size; 
     this.Size = content.Size; 
     content.Location = Point.Empty; 

     //Add the host to the list 
     this.Items.Add(this._host); 
    } 
} 

उपयोग:

PopupWindow popup = new PopupWindow(MyControlToHost); 
popup.Show(new Point(100,100)); 
... 
popup.Close(); 
+0

पवित्र बकवास, यह कोड कभी भी सबसे भयानक कोड है। मैं इसे अपने उपयोगकर्ता नियंत्रण में एकीकृत कर रहा हूं, धन्यवाद। –

+2

मुझे यह काम मिल गया। क्या सीमा को हटाने के लिए वैसे भी है? –

+2

मैंने इस कोड को लागू किया है, लेकिन पॉपअप फोकस चोरी करता रहता है। क्या इसको रोकने के लिए कोई रास्ता है? – jblaske

3

स्क्रीनशॉट विंडोज फॉर्म एप्लिकेशन की तरह दिखता है, इसलिए मेरा जवाब Winforms के लिए है।

मुझे लगता है कि सबसे अच्छा समाधान कस्टम कंट्रोल बनाने के लिए होगा जो स्वचालित रूप से डेटाटाइम पिकर का उपयोग करता है जिसमें पहले से ही व्यवहार है।

क्लिक किए जाने तक एक खाली टेक्स्टबॉक्स दिखाएं, फिर डेटाटेमिपर को प्रदर्शित करें।

है कि आप कोड का एक समूह की बचत होगी ..

+0

यह एक है अच्छा सुझाव, मैं कल कोशिश करूँगा। मैं अभी भी जानना चाहता हूं कि मेरे मूल प्रश्न का उत्तर देने का कोई तरीका है या नहीं! :) –

+0

इस कस्टम नियंत्रण को चाल करना चाहिए: http://www.codeguru.com/csharp/csharp/cs_controls/custom/article.php/c9645 –

+0

यह पता चला कि मैं इस पथ से नीचे नहीं जा सका। मैंने उपरोक्त नियंत्रण से शुरुआत की, लेकिन नियंत्रण स्थापित करने का कोई तरीका नहीं है ताकि उपयोगकर्ता इसे टैब कर सकें और टाइपिंग शुरू कर सकें - जिस उपयोगकर्ता के लिए मैं लिख रहा हूं उसके लिए एक महत्वपूर्ण विशेषता है। –

1

मैं 100% यकीन नहीं है, लेकिन परावर्तक पर DateTimePicker वर्ग का शीघ्रता से अवलोकन मुझे SafeNativeMethods.SetWindowPos आंतरिक वर्ग के लिए ले जाता है।

आप आधार नियंत्रण वर्ग से SetBoundsCore को ओवरराइड कर सकते हैं या जैसे टिग्रेन ने कहा, डेटटाइम पिकर के आधार पर कस्टम नियंत्रण बनाएं।

आशा है कि यह मदद करता है, ब्रूनो Figueiredo

2

जब एक कस्टम नियंत्रण लागू करने के लिए कोशिश कर रहा है कि मैं इस में भाग गया और पता चला कि यह एक उल्लेखनीय कठिन समस्या है। Windows.Forms मॉडल के भीतर कोई अंतर्निहित कार्यक्षमता नहीं है जिसका नियंत्रण उन नियंत्रणों का समर्थन करने के लिए है जिनके प्रदर्शन क्षेत्र उनके कंटेनर के क्लाइंट क्षेत्र के बाहर फैले हुए हैं।

आपको मूल रूप से Windows API का उपयोग करना होगा या AlwaysOnTop सेट के साथ फ़ॉर्म के अंदर अपने नियंत्रण खींचना होगा। दोनों दृष्टिकोण उनके मुकाबले कठिन हैं। मैंने अपने नियंत्रण को फिर से डिजाइन करना समाप्त कर दिया ताकि ड्रॉपडाउन में अपनी विस्तारित सामग्री को प्रदर्शित करने के बजाय यह एक मोडल संवाद का उपयोग कर सके। यह एक बहुत ही असंतुष्ट समाधान था, लेकिन मैंने कुछ हफ्तों तक अन्य दृष्टिकोणों की कोशिश की और कभी भी ऐसा कुछ भी नहीं मिला जो सभी उपयोग मामलों में लगातार काम करता था (जैसे एप्लिकेशन फोकस खो देता है)।

0

आपका नियंत्रण कटा हुआ हो जाने का कारण यह है कि यह आपके द्वारा बनाए गए फॉर्म का एक बाल नियंत्रण है। फॉर्म पर किसी भी नियंत्रण को फॉर्म द्वारा निहित किया जाना चाहिए, इसलिए यह कटा हुआ हो जाता है।

मैंने नेट में ऐसा नहीं किया है, लेकिन वीबी 6 में भी इसी तरह की समस्या थी। तब समाधान पॉपअप विंडो (आपके मामले में कैलेंडर) के माता-पिता को डेस्कटॉप होने के लिए सेट करना था। यह इसे आपके फॉर्म की सीमाओं से आगे बढ़ाने की अनुमति देगा। पॉपअप के एचडब्ल्यूएनडी को खोजने के लिए आपको कुछ पी/Invoke जादू करना होगा, और एक और पी/माता-पिता को सेट करने के लिए आमंत्रित करें।

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