2012-01-31 25 views
8

Na przykład:Jak ustawić kolekcję w linii?

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

To bardzo zależy od wersji VS/.Net, z której korzystasz. –

+1

Zaktualizowałem tagi. –

Odpowiedz

10

mówisz o Collection Initialiser funkcji dodanej w C# 3.Jest to wykonane w następujący sposób:

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

Nie wywołuje to konstruktora kolekcji, korzysta z kolekcji, która już istnieje w DataTable.

Jest to skrót od Columns.Add(), więc nie wymaga kolumn do ustawiania.

Byłeś tak blisko kodu w swoim pytaniu!

+0

bea-u-ti-ful! Niezłe. –

2

Prawdopodobnie trzeba usunąć paretheses wokół tej kolekcji inicjatora dla DataColumnCollection i usunąć sobie równych, końcowego )

Są to zagadnienia składniowe, choć. Podstawowe problemy polegają na tym, że właściwość Columns nie ma narzędzia ustawiającego, a DataColumnCollection nie ma publicznego konstruktora.

Zasadniczo musisz utworzyć instancję, a następnie zadzwonić pod numer .Columns.Add().

Jeśli jest to coś trzeba zrobić wiele w kodzie, można utworzyć klasy pomocnika, który nie daje friendlier składnię:

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

Próbowałem to zrobić. Nawet jeśli poprawi błąd składni, dostanie komunikat, że ** Kolumny ** są własnością tylko do odczytu. –

+0

@Jay - fajny pomysł +1 –

3

Obiekt Columns nie ma setter więc można jedynie modyfikować to.

Jak o tym:

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

Jeśli chcesz zrobić z jednego rachunku w lambda:

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

Chcę zrobić to wszystko w linii. Myślałem, że jest to możliwe za pomocą() => lub czegoś. –

+0

Nie możesz tego zrobić z powodów, które podałem w mojej odpowiedzi. Jeśli chcesz zachować czystość kodu, możesz utworzyć metodę rozszerzenia, aby utworzyć tabelę i dodać kolumny w jednym kroku, ale w pewnym momencie będą to co najmniej dwie linie kodu. –

+0

Jeśli miałby setera, jak by to zrobić? Czy możesz podać przykład pracy? –

1

Klasa DataColumnCollection ma konstruktora, więc nie można ręcznie utworzyć instancję. Komunikat o błędzie kompilatora powinna być dość oczywista, mówiąc coś w rodzaju:

typu „System.Data.DataColumnCollection” nie ma zdefiniowanego konstruktorzy

można dodać kolumny do DataTable.Columns kolekcja stosując metodę Add():

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

nie można użyć tej składni jako własność Kolumny jest tylko do odczytu. Użyłbym techniki zaproponowanej przez Gabe.

2

Są 2 powody dlaczego to nie będzie działać:

1) nieruchomość Columns jest tylko do odczytu 2) klasa DataColumnCollection nie posiada konstruktora, który akceptuje zbiór kolumn, aby go zainicjować.
Najlepsze co możesz zrobić, to stworzyć tabelę w jednej linii i dodać kolumny w innej:

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

Aby odpowiedzieć na inne pytanie, IFColumns miał setter i IFDataColumnCollection akceptowanych kolumn w jego konstruktora składnia byłoby:

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