c# - item - Cómo establecer la colección en línea?
item combobox c# (6)
Por ejemplo:
DataTable table = new DataTable()
{
Columns = new DataColumnCollection(
{
new DataColumn("col1"),
new DataColumn("col2")
})
});
Está hablando de la característica de inicialización de colección agregada en C # 3. Se hace así:
DataTable table = new DataTable()
{
Columns =
{
new DataColumn("col1"),
new DataColumn("col2")
}
};
Esto no llama a un constructor de colección, usa la colección que ya existe en la DataTable.
Esto es abreviado para Columns.Add (), por lo que no requiere que Columns tenga un setter.
¡Estabas tan cerca del código en tu pregunta!
Hay 2 razones por las que esto no funcionará:
1) la propiedad Columns
es de solo lectura 2) la clase DataColumnCollection
no tiene un constructor que acepte una colección de columnas para inicializarla.
Lo mejor que puede hacer es crear la tabla en una línea y agregar las columnas en otra:
DataTable table = new DataTable();
table.Columns.AddRange( new []
{
new DataColumn("col1"),
new DataColumn("col2")
});
Para responder a su otra pregunta, si las Columns
tuvieran un setter y las columnas IF DataColumnCollection
aceptasen en su constructor, la sintaxis sería:
DataTable table = new DataTable()
{
Columns = new DataColumnCollection( new DataColumn[]
{
new DataColumn("col1"),
new DataColumn("col2")
})
});
La clase DataColumnCollection
no tiene constructor por lo que no puede crear una instancia manualmente. El mensaje de error del compilador debe ser bastante autoexplicativo, diciendo algo como:
El tipo ''System.Data.DataColumnCollection'' no tiene constructores definidos
Puede agregar columnas a la colección DataTable.Columns
utilizando el método Add()
:
DataTable table = new DataTable();
table.Columns.Add(new DataColumn("col1"));
table.Columns.Add(new DataColumn("col2"));
La propiedad Columns
no tiene un setter, por lo que solo puede modificarlo.
Qué tal esto:
DataTable table = new DataTable();
table.Columns.AddRange(new[] { new DataColumn("col1"), new DataColumn("col2") });
Si quieres hacer una declaración en una lambda:
DataTable table = (() => {
var table = new DataTable();
table.Columns.AddRange(new[] { new DataColumn("col1"),
new DataColumn("col2") });
return table;})();
No puede usar esa sintaxis ya que la propiedad Columnas es de solo lectura. Usaría la técnica sugerida por Gabe.
Probablemente necesites eliminar las paretheses alrededor de ese inicializador de colección para DataColumnCollection
, y eliminar el inigualable, final )
Esos son problemas sintácticos, sin embargo. Los problemas subyacentes son que la propiedad Columns
no tiene setter, y DataColumnCollection
no tiene constructor público.
Básicamente, debe instanciar y luego llamar a .Columns.Add()
.
Si esto es algo que tiene que hacer mucho en su código, puede crear clases de ayuda que le proporcionen una sintaxis más amigable:
DataTable table = DataTableFactory.CreateTableWithColumns("col1", "col2");