2009-06-24 15 views
5

मैं कुछ कोड का पुन: उपयोग करना चाहता हूं जिसे मैंने डेटाग्रिडव्यू में कुछ कार्यक्षमता जोड़ने के लिए लिखा था। मैं डिफ़ॉल्ट डेटाग्रिडव्यू गुणों और घटनाओं को उजागर करना चाहता हूं, इसलिए मैं एक नया कस्टम घटक नहीं बनाना चाहता था। तो मैंने एक सबक्लास लिखने की कोशिश की, जो ठीक काम करता है। लेकिन यह भी मेरे लिए हुआ कि मैं एक स्टैंडअलोन यूटिलिटी क्लास लिख सकता हूं जो कि कन्स्ट्रक्टर में डेटाग्रिडव्यू लेता है और इसे उसी तरह सेट करता है। जैसेउपयोगिता वर्ग बनाम subclassing .net नियंत्रण

public class 
MyGrid 
{ 
    private DataGridView m_dg; 

    public MyGrid(DataGridView dg) 
    { 
     m_dg = dg; 
     m_dg.RowHeadersVisible = false; 
     m_dg.SortCompare += new DataGridViewSortCompareEventHandler(m_dg_SortCompare); 
    } 

    void m_dg_SortCompare(object sender, DataGridViewSortCompareEventArgs e) 
    { 
     // do custom sorting here 
    } 
} 

मेरे ऐप की स्टार्टअप में तो कहीं मैं

MyGrid g1 = new MyGrid(dataGridView1); 
MyGrid g2 = new MyGrid(dataGridView2); 

और बहुत आगे है कहेंगे। इस दृष्टिकोण के लिए कोई नुकसान? ऐसा लगता है कि बहुत से कोड समान होने जा रहे हैं, अंतर यह है कि आप विस्तारित ग्रिड को कैसे चालू करते हैं (फॉर्म में एक उप-वर्गीकृत नियंत्रण खींचें और ड्रॉप करें, एक सादा डेटाग्रिडव्यू खींचें और उपरोक्त कोड पर कॉल करें)

उत्तर

1

उपयोगिता वर्ग का एकमात्र नुकसान यह है कि आप डिज़ाइनर समर्थन खो देते हैं। मतलब, यदि आप नियंत्रण को उपclass करते हैं, जब आप इसे डिज़ाइनर में जोड़ते हैं, तो आपके विरासत नियंत्रण के निर्माता में किए गए कोई भी परिवर्तन डिज़ाइनर में दिखाई देंगे। इसके अलावा, यदि आप इसमें कुछ गुण जोड़ना चाहते हैं, तो वे गुण विंडो में दिखाई देंगे, जिससे इसे और भी लचीलापन मिल जाएगा। यदि डिजाइनर समर्थन आपके लिए कोई फर्क नहीं पड़ता है, तो मुझे उपयोगिता वर्ग में कोई अन्य कमी दिखाई नहीं देती है।

3

इन लंबे समय तक, एक उपयोगिता वर्ग उप-वर्गीकृत नियंत्रण से अधिक रखरखाव योग्य होगा जब तक आप सॉर्टिंग को संशोधित करने से डेटाग्रिड व्यू को बढ़ाने के लिए कुछ और अधिक महत्वपूर्ण नहीं कर रहे हैं।

उपयोगिता वर्ग के लिए आपका दृष्टिकोण (कन्स्ट्रक्टर में डेटाग्रिड व्यू लेना) एक ठोस दृष्टिकोण है।

1

यदि आप सी # 3, extension methods का उपयोग कर रहे हैं तो यह देखने के लायक हो सकता है। ऐसा लगता है कि आप एक प्रकार के व्यवहार को जोड़ रहे हैं, जिसे आप बॉक्स से बाहर करना चाहते थे।

static class GridExtMethods 
    { 
     public static void SortAsICommand(this MyGrid grid) 
     { 
      //grid.Prop = value; possible 
      grid.Sort += MyCustomSort; 
     } 
     static void MyCustomSort(object sender, SortEventArgs evtArgs) 
     { 
      Console.WriteLine("Sort {0} and {1}", evtArgs.First, evtArgs.Second); 
     } 
    } 

....

static void Main() 
{ 
    var grid = new MyGrid(10,20); 
    grid.SortAsICommand(); 

    //grid.RaiseEvent(); do something that raises the event 
} 
संबंधित मुद्दे