2012-01-31 2 views
8

Ví dụ:Làm cách nào để đặt tập hợp nội tuyến?

DataTable table = new DataTable() 
{ 
    Columns = new DataColumnCollection(
    { 
     new DataColumn("col1"), 
     new DataColumn("col2") 
    }) 
}); 
+0

Điều này phụ thuộc rất nhiều vào phiên bản của VS/.Net mà bạn đang sử dụng. –

+1

Tôi đã cập nhật các thẻ. –

Trả lời

10

Bạn đang nói về Collection Initialiser tính năng được thêm vào trong C# 3.Nó được thực hiện như thế này:

DataTable table = new DataTable() 
{ 
    Columns = 
    { 
     new DataColumn("col1"), 
     new DataColumn("col2") 
    } 
}; 

Đây không phải là người tạo bộ sưu tập, nó sử dụng bộ sưu tập đã tồn tại trong DataTable.

Đây là viết tắt của Cột.Thêm(), do đó, nó không yêu cầu Cột có trình đặt.

Bạn rất gần với mã trong câu hỏi của mình!

+0

bea-u-ti-ful! Đẹp nhất. –

2

Bạn có thể cần phải loại bỏ các paretheses xung quanh rằng bộ sưu tập initializer cho DataColumnCollection, và loại bỏ các chưa từng có, thức )

Đó là những vấn đề cú pháp, mặc dù. Các vấn đề cơ bản là thuộc tính Columns không có setter và DataColumnCollection không có hàm tạo công khai nào.

Về cơ bản, bạn phải khởi tạo và sau đó gọi .Columns.Add().

Nếu đây là một cái gì đó bạn phải làm rất nhiều trong mã của bạn, bạn có thể tạo các lớp helper mà sẽ cung cấp cho bạn cú pháp thân thiện hơn:

DataTable table = DataTableFactory.CreateTableWithColumns("col1", "col2"); 
+0

Tôi đã cố gắng thực hiện việc này. Ngay cả khi anh ta sửa lỗi cú pháp, anh ta sẽ gặp lỗi nói rằng ** Cột ** là thuộc tính chỉ đọc. –

+0

@Jay - ý tưởng hay là +1 –

3

Thuộc tính Columns không có một setter vì vậy bạn chỉ có thể sửa đổi nó.

Làm thế nào về điều này:

DataTable table = new DataTable(); 
table.Columns.AddRange(new[] { new DataColumn("col1"), new DataColumn("col2") }); 

Nếu bạn muốn làm gì với một tuyên bố trong một lambda:

DataTable table = (() => { 
    var table = new DataTable(); 
    table.Columns.AddRange(new[] { new DataColumn("col1"), 
            new DataColumn("col2") }); 
    return table;})(); 
+0

Tôi muốn làm tất cả nội tuyến. Tôi nghĩ rằng nó đã có thể sử dụng() => hoặc một cái gì đó. –

+0

Bạn không thể thực hiện nội tuyến vì những lý do tôi đưa ra trong câu trả lời của tôi. Nếu bạn muốn giữ mã sạch, bạn có thể tạo một phương thức mở rộng để tạo một bảng và thêm các cột trong một bước, nhưng tại một số thời điểm nó sẽ có ít nhất hai dòng mã. –

+0

Nếu nó có một setter, làm thế nào nó sẽ được thực hiện? Bạn có thể cung cấp một ví dụ làm việc xin vui lòng? –

1

Lớp DataColumnCollection không có constructor vì vậy bạn không thể tự tạo ra một ví dụ. thông báo lỗi của trình biên dịch nên được khá tự giải thích, nói điều gì đó dọc theo dòng:

Loại 'System.Data.DataColumnCollection' đã không có nhà xây dựng được xác định

Bạn có thể thêm cột vào DataTable.Columns bộ sưu tập bằng cách sử dụng phương pháp Add():

DataTable table = new DataTable(); 
table.Columns.Add(new DataColumn("col1")); 
table.Columns.Add(new DataColumn("col2")); 
1

Bạn không thể sử dụng cú pháp đó làm thuộc tính Cột là chỉ đọc. Tôi muốn sử dụng kỹ thuật được Gabe đề xuất.

2

Có 2 lý do tại sao điều này sẽ không làm việc:

1) tài sản Columns là read-only 2) lớp DataColumnCollection không có một constructor chấp nhận một tập hợp các cột để khởi tạo nó.
tốt nhất bạn có thể làm là tạo bảng trong một dòng và thêm các cột trong một:

DataTable table = new DataTable(); 
table.Columns.AddRange(new [] 
    { 
     new DataColumn("col1"), 
     new DataColumn("col2") 
    }); 

Để trả lời câu hỏi khác của bạn, NẾUColumns đã có một setter và NẾUDataColumnCollection cột được chấp nhận trong constructor của nó cú pháp sẽ là:

DataTable table = new DataTable() 
{ 
    Columns = new DataColumnCollection(new DataColumn[] 
    { 
     new DataColumn("col1"), 
     new DataColumn("col2") 
    }) 
});