2008-12-09 16 views
7

होवर करता है आप सी # विनफॉर्म नियंत्रण कैसे बना सकते हैं जो इसके क्षेत्र की सीमाओं से बाहर हो जाता है? ड्रॉप डाउन बॉक्स जैसे। जैसे कि आपके पास एक छोटे आकार के पैनल में ड्रॉपडाउनबॉक्स था।सी # विनफॉर्म नियंत्रण कैसे बनाएं जो

उत्तर

2

मैंने हाल ही में कुछ ऐसा ही किया, और मैंने एक सूची बॉक्स का उपयोग किया। एक सूची बॉक्स के बारे में अच्छा सोचें, यह है कि आप इसे कहीं भी प्रदर्शित कर सकते हैं, यहां तक ​​कि अपने नियंत्रण की सीमाओं से भी। इस तरह, जब आप एक बटन क्लिक या जो भी हो, के माध्यम से पता लगाते हैं, तो आपको ड्रॉपडाउन को प्रदर्शित करने की आवश्यकता होती है, बस सूची बॉक्स को पॉप्युलेट करें और इसे कहीं भी प्रदर्शित करें। मैं यहाँ से विचार आया:

http://msdn.microsoft.com/en-us/library/aa480727.aspx

वे छानने के साथ एक कस्टम DataGridView निर्माण करने के लिए कैसे, और फिल्टर मूल्यों को प्रदर्शित करने, वे हेडर सेल के तहत एक ListBox जगह दिखाते हैं।

7

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

using System; 
using System.Drawing; 
using System.ComponentModel; 
using System.Windows.Forms; 

public class MyListBox : ListBox { 
    private Control mParent; 
    private Point mPos; 
    private bool mInitialized; 

    public MyListBox(Control parent) { 
    mParent = parent; 
    mInitialized = true; 
    this.SetTopLevel(true); 
    parent.LocationChanged += new EventHandler(parent_LocationChanged); 
    mPos = mParent.Location; 
    } 

    public new Point Location { 
    get { return mParent.PointToClient(this.Location); } 
    set { 
     Point zero = mParent.PointToScreen(Point.Empty); 
     base.Location = new Point(zero.X + value.X, zero.Y + value.Y); 
    } 
    } 

    protected override Size DefaultSize { 
    get { 
     return mInitialized ? base.DefaultSize : Size.Empty; 
    } 
    } 

    protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) { 
    if (this.mInitialized) 
     base.SetBoundsCore(x, y, width, height, specified); 
    } 

    void parent_LocationChanged(object sender, EventArgs e) { 
    base.Location = new Point(base.Left + mParent.Left - mPos.X, base.Top + mParent.Top - mPos.Y); 
    mPos = mParent.Location; 
    } 

    protected override CreateParams CreateParams { 
    get { 
     CreateParams cp = base.CreateParams; 
     if (mParent != null && !DesignMode) { 
     cp.Style = (int)(((long)cp.Style & 0xffff) | 0x90200000); 
     cp.Parent = mParent.Handle; 
     Point pos = mParent.PointToScreen(Point.Empty); 
     cp.X = pos.X; 
     cp.Y = pos.Y; 
     cp.Width = base.DefaultSize.Width; 
     cp.Height = base.DefaultSize.Height; 
     } 
     return cp; 
    } 
    } 
} 
+0

इसे आजमाया और यह बहुत अच्छा काम करता है, लेकिन किसी भी तरह से यह DrawItem और SelectedIndexChanged जैसे ListBox ईवेंट नहीं बढ़ाता है। क्या आपको कोई विचार है क्यों? –

+0

मेरी प्रतिक्रिया यहां देखें: http://stackoverflow.com/questions/398176/listbox-with-overriden-createparams-doesnt-raise-item-events#398694 –

0

यहाँ एक अच्छा लेख है:

http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/article.asp

यह एक वर्ग है जो इस होने का मुश्किल पहलुओं में से कुछ सही ढंग से इस तरह के आवेदन खिड़की शीर्षक पट्टी को सक्रिय रखने के रूप में काम करने के लिए, संभालती है , Alt-Tab को संभालने और माउस क्लिक के साथ रद्द करना।

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