2010-06-23 12 views
5

मैं एक कस्टम DataRow बनाना चाहता हूं जो कि कहता है - IsCheapest नामक एक प्रोपरी।अतिरिक्त गुणों और विधियों के साथ सी # में डेटारो और डेटाटेबल का विस्तार कैसे करें?

public class RateDataRow : DataRow 
{ 
    protected internal RateDataRow(DataRowBuilder builder) : base(builder) 
    { 
    } 

    public bool IsCheapest { get; set ;} 
} 

और मैं एक नए DataTable है कि केवल *** RateDataRow *** शामिल रों ताकि .NewDataRow() RateDataRow उदाहरण देता है एक नई पंक्ति के रूप में करना चाहते हैं।

डेटाटेबल को विस्तारित करने वाले वर्ग पर कार्यान्वयन क्या होना चाहिए?

धन्यवाद,

उत्तर

0

अपने प्रश्न से यह स्पष्ट नहीं है कि आप लिखकर डेटासेट से परिचित हैं। वे मूल रूप से आप जो पूछ रहे हैं वह हैं।

आप एक्सएसडी (और एक्सएसडी डीबी स्कीमा से निकाले गए) के आधार पर टाइप किए गए डेटासेट बनाने के लिए अंतर्निहित विज़ार्ड का उपयोग कर सकते हैं। WinForms प्रोजेक्ट में, "डेटा स्रोत जोड़ें" का चयन करें और चरणों का पालन करें।

आपको लगता है कि मॉडल आप गुणों के लिए कोड से उधार ले सकता का उपयोग नहीं करना चाहते हैं यहां तक ​​कि अगर, आंशिक वर्गों आदि

यह बुद्धिमान है कि या तो मॉडल का उपयोग या बहुत करीब रहने के लिए होगा।

+0

क्षमा करें, लेकिन इस प्रश्न का उत्तर नहीं है, मुझे पता है यह देर हो चुकी है लेकिन यह पहली प्रविष्टि है कि लोगों को गूगल विषय से संबंधित पर मिलेगा है: अनुसंधान के एक बिट करने के बाद मैं काम करने के लिए निम्नलिखित पाया। – Kodaloid

3

डेटाटेबल एक GetRowType वर्चुअल विधि का खुलासा करता है, इसे व्युत्पन्न कक्षा में ओवरराइड करता है। कोई भी प्रयास गलत प्रकार की एक पंक्ति जोड़ने के लिए एक अपवाद फेंक देगा:

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyDataTable t = new MyDataTable(); 
     t.Rows.Add(t.NewRow()); // <-- Exception here, wrong type (base doesn't count). 
    } 
} 

public class MyDataTable : DataTable 
{ 
    public MyDataTable() 
     : base() 
    { } 

    protected override Type GetRowType() 
    { 
     return typeof(MyDataRow); 
    } 
} 

public class MyDataRow : DataRow 
{ 
    public MyDataRow() 
     : base(null) 
    { } 
} 
9

मैं जानता हूँ कि यह अब एक पुरानी पोस्ट है, लेकिन मैं उपरोक्त उदाहरण काम करने के लिए नहीं मिल सका। मुझे एक ही समस्या थी इसलिए समाधान खोजने के लिए उत्सुक था।

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyDataTable t1 = new MyDataTable(); 

     t1.Columns.Add(new DataColumn("Name", typeof(string))); 
     t1.Columns.Add(new DataColumn("DateOfBirth", typeof(DateTime))); 

     MyDataRow r1 = t1.NewRow() as MyDataRow; 
     r1["Name"] = "Bob"; 
     r1["DateOfBirth"] = new DateTime(1970, 5, 12); 
     t1.Rows.Add(r1); 
    } 
} 

[Serializable] 
public class MyDataTable : DataTable 
{ 
    public MyDataTable() 
     : base() 
    { 
    } 

    public MyDataTable(string tableName) 
     : base(tableName) 
    { 
    } 

    public MyDataTable(string tableName, string tableNamespace) 
     : base(tableName, tableNamespace) 
    { 
    } 

    /// <summary> 
    /// Needs using System.Runtime.Serialization; 
    /// </summary> 
    public MyDataTable(SerializationInfo info, StreamingContext context) 
     : base(info, context) 
    { 
    } 

    protected override Type GetRowType() 
    { 
     return typeof(MyDataRow); 
    } 

    protected override DataRow NewRowFromBuilder(DataRowBuilder builder) 
    { 
     return new MyDataRow(builder); 
    } 
} 

[Serializable] 
public class MyDataRow : DataRow 
{ 
    public bool MyPropertyThatIdicatesSomething { get; private set; } 

    public MyDataRow() 
     : base(null) 
    { 
    } 

    public MyDataRow(DataRowBuilder builder) 
     : base(builder) 
    { 
    } 
}