2012-01-31 12 views
8

Por ejemplo:¿Cómo configurar la colección en línea?

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

Esto depende mucho de la versión de VS/.Net que esté usando. –

+1

Actualicé las etiquetas. –

Respuesta

10

Usted está hablando de la función Collection Initialiser añadido en C# 3.Se realiza así:

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

Esto no llama a un constructor de recogida, que utiliza la colección que ya existe en el DataTable.

Esto es short-hand para Columns.Add(), por lo que no es necesario que Columns tenga un setter.

¡Estuviste tan cerca con el código en tu pregunta!

+0

bea-u-ti-ful! Buena esa. –

2

Es probable que tenga que quitar los paretheses en torno a que inicializador de colección para DataColumnCollection, y quitar el inigualable, última )

Esas son cuestiones sintácticas, sin embargo. Los problemas subyacentes son que la propiedad Columns no tiene definidor, y DataColumnCollection no tiene constructor público.

Básicamente, tiene que crear instancias y luego llamar al .Columns.Add().

Si esto es algo que tiene que hacer mucho en su código, puede crear clases de ayuda que le daría la sintaxis amigable:

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

intenté hacer esto. Incluso si corrige el error de sintaxis, obtendrá un error que dice que ** Columnas ** es una propiedad de solo lectura. –

+0

@Jay - buena idea +1 –

3

La propiedad Columns no tiene un regulador de modo que sólo se puede modificar eso.

¿Qué tal esto:

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

Si desea ver con un estado de cuenta en un lambda:

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

Quiero hacerlo todo en línea. Pensé que era posible usar() => o algo así. –

+0

No puede hacerlo en línea por las razones que di en mi respuesta. Si desea mantener el código limpio, puede crear un método de extensión para crear una tabla y agregar las columnas en un solo paso, pero en algún momento habrá al menos dos líneas de código. –

+0

Si tuviera un colocador, ¿cómo se haría? ¿Puedes proporcionar un ejemplo de trabajo, por favor? –

1

La clase DataColumnCollection tiene ningún constructor por lo que no se puede crear manualmente una instancia. mensaje de error del compilador debe ser bastante explica por sí mismo, diciendo algo en la línea de:

El 'System.Data.DataColumnCollection' tipo tiene constructores definidos

Puede agregar columnas a la DataTable.Columns colección mediante el método Add():

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

no se puede utilizar esa sintaxis que la propiedad Columns es de sólo lectura. Usaría la técnica sugerida por Gabe.

2

Hay 2 razones por las que esto no funcionará: 2) la clase DataColumnCollection no tiene un constructor que acepta un conjunto de columnas para inicializarlo

1) la propiedad Columns es de sólo lectura.
mejor que puede hacer es crear la tabla en una línea y agregar las columnas en otro:

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

para responder a su otra pregunta, SIColumns tenían un compositor y SIDataColumnCollection columnas aceptados en su constructor la sintaxis sería:

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