2010-06-23 41 views
5

Tôi muốn tạo ra một DataRow tùy chỉnh mà sẽ có của người nói - một sự thích hợp được gọi là IsCheapest.Làm cách nào để mở rộng DataRow và DataTable trong C# bằng các thuộc tính và phương thức bổ sung?

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

    public bool IsCheapest { get; set ;} 
} 

Và tôi muốn có một DataTable mới mà chỉ *** RateDataRow *** chứa s để .NewDataRow() trả về RateDataRow dụ như một hàng mới.

triển khai trên lớp kéo dài DataTable là gì?

Cảm ơn,

Trả lời

0

Từ câu hỏi của bạn không rõ liệu bạn có quen thuộc với Tập dữ liệu đã nhập hay không. Về cơ bản họ là những gì bạn đang yêu cầu.

Bạn có thể sử dụng trình thủ thuật tích hợp để tạo Tập dữ liệu đã nhập dựa trên XSD (và XSD được trích xuất từ ​​lược đồ Db). Trong một dự án WinForms, chọn "Add DataSource" và làm theo các bước.

Thậm chí nếu bạn không muốn sử dụng mô hình mà bạn có thể mượn từ mã cho tài sản, các lớp học phần, vv

Nó sẽ là khôn ngoan để thể sử dụng mô hình đó hoặc ở rất gần với nó.

+0

Xin lỗi nhưng đây không phải là câu trả lời cho câu hỏi này, nhưng đây là mục nhập đầu tiên mọi người sẽ tìm thấy trên google liên quan đến chủ đề. – Kodaloid

3

DataTable hiển thị phương thức ảo GetRowType, ghi đè lên điều này trong lớp dẫn xuất. Bất kỳ nỗ lực nào để thêm một hàng loại sai sẽ ném một ngoại lệ:

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

Tôi biết đây là một bài đăng cũ nhưng tôi không thể lấy ví dụ trên để làm việc. Tôi đã có một vấn đề tương tự như vậy đã được quan tâm để tìm một giải pháp. Sau một vài nghiên cứu, tôi đã tìm thấy những điều sau đây để làm việc:

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) 
    { 
    } 
} 
Các vấn đề liên quan