Por defecto, MainGrid y SubGrid renderizar el conjunto de columna que devuelva la vista activa de Dataverse. El GridColumn componente te permite tomar el control explícito: cuando se declaran uno o más GridColumn hijos, la cuadrícula renderiza solo esas columnas, en el orden declarado, y la proyección del lado del servidor se reescribe para obtener exactamente el conjunto declarado. Úsalo para reducir una cuadrícula a las columnas que importan para una página específica, reordenarlas, personalizar el ancho / alineación, suministrar plantillas por celda o columnas de superficie que no estén en la vista subyacente — sin editar la vista de Dataverse en sí.
Demo en directo
Una MainGrid sobre la contact tabla mezclando a GridTemplateColumn con cuatro hijos normalesGridColumn. La primera celda es sintética — compone un avatar inicial más un nombre en negrita a partir de valores brutos firstname + lastname extraídos en la proyección mediante DependsOn. Las siguientes tres muestran plantillas por celda en columnas encuadernadas: un mailto: enlace, un número de teléfono con un icono en línea y una insignia de edad codificada por colores que lee la vía GetValueOrDefault<T>() cruda DecimalValue para la comparación de umbrales. La última, Birthday, no tiene plantilla, por lo que la celda de fecha incorporada la representa. Haz clic en el icono de engranes y activa Editable para ver las columnas EditChildContent de plantilla en acción — la celda de Nombre Completo cambia del renderizado avatar a dos editores lado a TextEdit lado vinculados a firstname + lastname.
Ejemplo de reacción
Ejemplo de Blazor
React TypeScript
Razor
Cualquiera puede ver los contactos en la cuadrícula de abajo. Inicia sesión para crear, ver y actualizar tus propios contactos.
Deja los GridColumn componentes dentro de un GridColumns envoltorio bajo la cuadrícula. Los nombres de columnas declarados anulan la proyección de <attribute> FetchXML — el servidor recupera las columnas declaradas aunque no estén en la selección de columna de la vista activa. El TableName parámetro es opcional en modo declarado: cuando se omite, se utiliza el propio TableName parámetro de la cuadrícula (no es necesario repetirlo en cada columna).
Declarar cualquier GridColumn hijo cambia la cuadrícula a modo reemplazo: las columnas declaradas son todo el conjunto de columnas renderizado Y todo el conjunto de columnas obtenidas. Las columnas de vista no declaradas aquí se eliminan tanto del renderizado como de la proyección del servidor. Si quieres la mayoría de las columnas de vistas con uno o dos ajustes, elimina el wrapper por completo o crea una vista personalizada a través CustomViewDefinitionsde .
Parámetros requeridos
Cada GridColumn declaración tiene:
ColumnName — Obligatorio. Nombre lógico de la columna a proyectar. Soporta notación de puntos para columnas de entidades enlazadas con alias (primarycontactid.emailaddress1); el alias debe existir ya como a <link-entity> en el FetchXML de la vista activa.
TableName — Opcional. Nombre lógico de la tabla cuyos metadatos describen esta columna. Cuando se omite, recae en la red TableName eléctrica — útil para mantener el margen de consumo breve en cuadrículas de una sola mesa.
Ancho de columna
Úsalo Width para anular el ancho almacenado de la vista. Acepta cualquier longitud CSS — píxeles ("150px"), porcentajes ("20%"), o "auto". Sin un ancho explícito, la cuadrícula vuelve al valor predeterminado derivado de los metadatos y a la distribución natural de la tabla.
Úsala Align para anular la alineación horizontal tanto del cabezal como de las células del cuerpo. Las columnas numéricas y de dinero se alinean por defecto a Align.End (a la derecha) mediante el respaldo basado en metadatos; las columnas booleanas por defecto son Align.Center. Configúralo explícitamente cuando quieras un alineamiento no predeterminado, o para alinear una celda con plantilla personalizada de forma consistente.
React
Blazor
{/* Las columnas numérica y monetaria ya se alinean al final mediante la
Respaldo basado en metadatos. Establece alineación explícita cuando
Quiero un alineamiento no por defecto. */}
<GridColumns>
<GridColumn columnName="firstname" />
<GridColumn columnName="creditlimit" align="end" />
<GridColumn columnName="donotemail" align="center" />
</GridColumns>
<!-- Las columnas numérica y monetaria ya se alinean al final mediante la
Respaldo basado en metadatos. Establece Align explícitamente cuando
Quiero un alineamiento no por defecto. -->
<GridColumns>
<GridColumn ColumnName="firstname" />
<GridColumn ColumnName="creditlimit" Align="DataGridCellAlignment.End" />
<GridColumn ColumnName="donotemail" Align="DataGridCellAlignment.Center" />
</GridColumns>
Columnas de Entidades Vinculadas
Las columnas de entidades enlazadas con alias usan notación de puntos que coincide con el alias FetchXML de la vista. El alias debe estar ya definido como a <link-entity> en la vista activa. Al establecer TableName la tabla de origen apunta el alias para que la resolución de metadatos caiga en la entidad correcta. El servidor devuelve estas columnas con su nombre de visualización localizado cualificado para la tabla principal (por ejemplo, "Email (Contacto Principal)") — sin necesidad de humanización en el lado del cliente.
React
Blazor
<MainGrid tableName="account">
<GridColumns>
<GridColumn columnName="name" />
{/* Columna de entidad enlazada con aliasing: la notación de puntos coincide
cómo aparece la columna en el alias FetchXML de la vista.
El servidor resuelve automáticamente los metadatos de la entidad enlace
desde el FetchXML — no se requiere un prop tableName separado. */}
<GridColumn columnName="primarycontactid.emailaddress1" />
</GridColumns>
</MainGrid>
<MainGrid TableName="account">
<GridColumns>
<GridColumn ColumnName="name" />
<!-- Columna de entidad enlazada con aliasing: la notación de puntos coincide
cómo aparece la columna en el alias FetchXML de la vista.
TableName debe apuntar a la tabla de la ENTIDAD-ENLACE por lo que
Los metadatos se resuelven en contra de la entidad correcta. -->
<GridColumn ColumnName="primarycontactid.emailaddress1"
TableName="contact" />
</GridColumns>
</MainGrid>
Plantillas por celda
Suministra ChildContent para renderizar cada celda con marcado personalizado. La plantilla recibe GridRowContext — su PrimaryRecord propiedad expone la fila completa TableRecord (valores de columnas escritos, valores formateados, permisos, todo). Útil para formateo condicional (texto rojo sobre un umbral), iconos, insignias, enlaces o cualquier otra cosa que puedas construir a partir del registro de la fila.
React
Blazor
<GridColumns>
<GridColumn columnName="fullname" />
<GridColumn
columnName="creditlimit"
cellRenderer={({ record }) => {
// El TableRecord de la fila — valores brutos + formateados disponibles.
const raw = (record.properties?.creditlimit as { value?: number })?.value;
const over = typeof raw === 'number' && raw >= 100_000;
const formatted = record.formattedValues?.creditlimit ?? '-';
return (
<span style={{ color: over ? 'var(--colorStatusDangerForeground1)' : 'inherit' }}>
{formatted}
</span>
);
}}
/>
</GridColumns>
<GridColumns>
<GridColumn ColumnName="fullname" />
<GridColumn ColumnName="creditlimit">
<ChildContent>
@{
var raw = context.PrimaryRecord
.GetValueOrDefault<MoneyValue>("creditlimit")?.Value;
var over = raw is decimal d && d >= 100_000m;
}
<span style="color: @(over ? "var(--colorStatusDangerForeground1)" : "inherit")">
@(context.PrimaryRecord.FormattedValues["creditlimit"] ?? "-")
</span>
</ChildContent>
</GridColumn>
</GridColumns>
Conocer la celda: CellTemplate
ChildContent recibe la fila, que comparte cada celda de ella, por lo que no puede saber qué columna está generando — ni qué correspondió la búsqueda de la cuadrícula. Cuando la celda necesita saber, suministra CellTemplate en su lugar. Recibe un GridColumnCellContext: la Rowcelda ColumnName, la celda de , Metadata y se Valueescribió , la DisplayValue celda incorporada mostraría, y Highlight(text), que marca exactamente lo que la búsqueda coincidió igual que las celdas integradas — el término de búsqueda en texto, las columnas de búsqueda y elección, y el valor total de una columna de número o fecha cuya comparación se cumple. Tiene precedencia sobre ChildContent cuando ambas están establecidas. En React a cellRenderer ya recibe el texto de valuela celda , metadata y searchText: pass searchText to <Highlighter> para texto, y para un número o columna de dinero comprueba con parseNumericSearch y matchesNumericSearch, y para una columna de fecha con parseDateSearch y matchesDateSearch — que toma el texto formateado de la celda en lugar de su valor, ya que el día en que cae una fecha depende de la zona horaria en la que se muestra y de la localidad de useLocale() — marcando el valor con <HighlightFull> cuando coinciden.
React
Blazor
<GridColumn
columnName="emailaddress1"
cellRenderer={({ record, searchText }) => {
// Marca qué coincidió la búsqueda de la cuadrícula, como hacen las celdas integradas.
const email = resolveColumnDisplayValue(record, 'emailaddress1') ?? '';
return (
<a href={`mailto:${email}`}>
<Highlighter text={email} searchText={searchText ?? null} />
</a>
);
}}
/>
<GridColumn ColumnName="emailaddress1">
<CellTemplate Context="cell">
<!-- Marca qué coincidió la búsqueda de la cuadrícula, como hacen las celdas integradas. -->
<a href="mailto:@cell.DisplayValue">@cell.Highlight(cell.DisplayValue)</a>
</CellTemplate>
</GridColumn>
Registro principal en SubGrids
Cuando la cuadrícula se monta como un SubGrid, GridRowContext.ParentRecord expone el registro de circundante RecordContext(el padre de la SubRed). Accede a ella dentro de una ChildContent plantilla cuando el formato condicional necesite comparar la columna de una fila con la del padre — por ejemplo, resalta contactos que industrycode no coincidan con la cuenta del padre, o etiqueta filas propiedad del propietario del padre. null En un registro independiente MainGrid donde no hay registro padre.
React
Blazor
<SubGrid relationshipName="contact_customer_accounts">
<GridColumns>
<GridColumn columnName="fullname" />
<GridColumn
columnName="industrycode"
cellRenderer={({ record, parentRecord }) => {
// Compara la industria de este contacto con la de la cuenta principal
const rowIndustry = record.formattedValues?.industrycode;
const parentIndustry = parentRecord?.formattedValues?.industrycode;
const mismatch =
parentIndustry != null && rowIndustry != null && rowIndustry !== parentIndustry;
return (
<span style={{ color: mismatch ? 'var(--colorStatusDangerForeground1)' : 'inherit' }}>
{rowIndustry ?? '-'}
</span>
);
}}
/>
</GridColumns>
</SubGrid>
<SubGrid RelationshipName="contact_customer_accounts">
<GridColumns>
<GridColumn ColumnName="fullname" TableName="contact" />
<GridColumn ColumnName="industrycode" TableName="contact">
<ChildContent>
@{
var rowIndustry = context.PrimaryRecord.FormattedValues
.GetValueOrDefault("industrycode");
var parentIndustry = context.ParentRecord?.FormattedValues
.GetValueOrDefault("industrycode");
var mismatch = parentIndustry is not null
&& rowIndustry is not null
&& rowIndustry != parentIndustry;
}
<span style="color: @(mismatch ? "var(--colorStatusDangerForeground1)" : "inherit")">
@(rowIndustry ?? "-")
</span>
</ChildContent>
</GridColumn>
</GridColumns>
</SubGrid>
Paridad de reacción
El lado React supera la misma superficie que cellRendererla hélice de parentRecord 's (CellRendererProps.parentRecord).
CuadrículaPlantillaColumna
Úsalo GridTemplateColumn cuando una columna no se asigna a una sola columna de Dataverse — combina varios valores en bruto en una sola celda, renderiza una insignia de estado en varios campos o emite una celda de acciones puramente decorativas sin ninguna dependencia de datos. A diferencia de , una columna plantilla no ColumnNametiene : declare las columnas por DependsOn las que lee el renderizador y el framework las fusiona en la proyección FetchXML, de modo que los datos llegan GridColumnctx.Row.PrimaryRecord cuando tu plantilla se ejecuta. Recibe ChildContent un GridTemplateColumnContext (usa el Context="ctx" atributo para nombrarlo) que lleva la fila, el padre SubGrid opcional y una consulta preconfigurada DependsOnMetadata con los nombres de columnas que has declarado.
React
Blazor
<MainGrid tableName="contact">
<GridColumns>
{/* Combina nombre + apellido en un solo "Nombre Completo"
celda. dependsOn indica al marco de qué columnas el
Plantilla se lee para proyectarse en el fetch.
sortBy apunta al encabezado de ordenar a apellido.
searchBy pone ambos en la búsqueda de la cuadrícula; El resaltador marca la coincidencia. */}
<GridTemplateColumn
displayName="Nombre completo"
dependsOn={['firstname', 'lastname']}
sortBy="lastname"
searchBy={['firstname', 'lastname']}
cellRenderer={({ record, searchText }) => {
const first = (record.properties?.firstname as { value?: string })?.value ?? '';
const last = (record.properties?.lastname as { value?: string })?.value ?? '';
return <strong><Highlighter text={`${first} ${last}`} searchText={searchText ?? null} /></strong>;
}}
/>
<GridColumn columnName="emailaddress1" />
</GridColumns>
</MainGrid>
<MainGrid TableName="contact">
<Columns>
<GridColumns>
<!-- Combina nombre + apellido en un solo "Nombre Completo"
celda. DependsOn indica al marco qué columnas tienen el
Plantilla se lee para proyectarse en el fetch.
SortBy apunta al encabezado de ordenar a apellido.
SearchBy pone ambos en la búsqueda de la cuadrícula; El resaltado marca la coincidencia. -->
<GridTemplateColumn Title="Nombre completo"
DependsOn="@(new[] { "firstname", "lastname" })"
SortBy="lastname"
SearchBy="@(new[] { "firstname", "lastname" })">
<ChildContent Context="ctx">
@{
var first = ctx.Row.PrimaryRecord
.GetValueOrDefault<StringValue>("firstname")?.Value ?? "";
var last = ctx.Row.PrimaryRecord
.GetValueOrDefault<StringValue>("lastname")?.Value ?? "";
}
<strong>@ctx.Highlight($"{first} {last}")</strong>
</ChildContent>
</GridTemplateColumn>
<GridColumn ColumnName="emailaddress1" />
</GridColumns>
</Columns>
</MainGrid>
Una columna plantilla no forma parte de la búsqueda de la cuadrícula a menos que digas por qué buscarla. SearchBy (searchBy en React) nombra las columnas: se obtienen automáticamente, se corresponden con las reglas habituales de la cuadrícula para su tipo (el texto empieza con la búsqueda, o lo contiene tras un inicio *; se compara una columna de número o fecha), y se listan en el cuadro de búsqueda bajo el título de la columna de la plantilla. Las columnas en DependsOn solo se obten, nunca se buscan — un código de estado detrás de una insignia no debería coincidir con lo que alguien escribe. Para marcar qué coincidió la búsqueda como lo hacen las celdas integradas, renderiza el texto de la celda en ctx.Highlight(text) Blazor, o pasa el del renderizador searchText a <Highlighter> en React; ambos están vacíos para una columna sin SearchBy.
Columna plantilla vs. Contenido hijo de GridColumn
GridColumn ChildContent Aún así, personaliza una columna acotada — ordenando, editando despacho y el encabezado de columna todos con la clave de su único ColumnName. Busca GridTemplateColumn solo cuando no haya una columna subyacente única a la que vincular (celdas compuestas, celdas de acción decorativa, insignias de estado que combinan varios campos). Mezclar ambos está bien — se entrelazan en orden declarado a lo largo del conjunto de columnas de la cuadrícula.
Columnas decorativas (sin dependencia de datos)
Salta DependsOn completamente cuando la celda muestre contenido puramente decorativo como botones o iconos en línea. La estructura sigue montando la columna en la posición correcta de la tabla renderizada; No se añade nada a la proyección del servidor para esa columna.
React
Blazor
{/* Columna de plantilla de decoración pura: no dependeOn, el renderizador
No lee de la fila. Útil para botones de acción / iconos. */}
<GridTemplateColumn
displayName=""
width="80px"
cellRenderer={({ record }) => (
<Button
icon={<MoreHorizontal16Regular />}
onClick={() => openContextMenu(record.id)}
/>
)}
/>
<!-- Columna de plantilla de decoración pura: no DependsOn, el renderizador
No lee de la fila. Útil para botones de acción / iconos. -->
<GridTemplateColumn Title="" Width="80px">
<ChildContent Context="ctx">
<FluentButton IconStart="@(new Icons.Regular.Size16.MoreHorizontal())"
OnClick="@(() => OpenContextMenu(ctx.Row.PrimaryRecord.Id))" />
</ChildContent>
</GridTemplateColumn>
Plantillas de edición en línea
Empareja el modo ChildContent de lectura de a GridTemplateColumncon un EditChildContent para que la columna sea editable cuando el interruptor de Editable de la cuadrícula esté activado. La plantilla de edición recibe un GridTemplateColumnEditContext — mismo contexto de fila que la plantilla de lectura (editCtx.Row.PrimaryRecord, la opcional editCtx.Row.ParentRecord en una SubGrid, la editCtx.DependsOnMetadata consulta) más un asistente imperativoeditCtx.SetValue(columnName, value).
EditChildContent se activa cuando la cuadrícula es editable (AllowEdit="true" en la cuadrícula más el usuario ha cambiado el interruptor Editable en el menú de engranes de la barra de herramientas), la fila no está pendiente-eliminación y la propia columna declara una plantilla de edición. Las columnas decorativas de plantilla que omiten EditChildContent permanecen en modo solo lectura incluso en modo edición — útiles para columnas de acciones que siempre deberían renderizar los mismos botones.
Patrón 1 — Editores estándar de entrada
El caso más común: la celda se compone a partir de varias columnas encotadas, y quieres que el usuario edite cada una. Suelta los editores que coinciden / <NumberEdit> / dentro EditChildContent — el framework encadena el registro principal y la coincidencia EditContextValidator de la fila dentro de ese ámbito, de modo que los editores se registran por sí mismos para el dirty-tracking y la validación exactamente como lo hacen bajo un bound's ChildContent<GridColumn>. <ColumnEdit><TextEdit> No hace falta cableado extra.
React
Blazor
<GridTemplateColumn
displayName="Nombre completo"
dependsOn={['firstname', 'lastname']}
sortBy="lastname"
// Plantilla de solo lectura (existente).
cellRenderer={({ record }) => {
const first = (record.properties?.firstname as { value?: string })?.value ?? '';
const last = (record.properties?.lastname as { value?: string })?.value ?? '';
return <strong>{first} {last}</strong>;
}}
// Plantilla de edición: se dispara cuando el interruptor editable de la cuadrícula está activado
// Y la fila es cambiable. Elimina dos <TextEdit>'' del lado de los editores
// Y se conectan automáticamente a seguimiento sucio y validación
// Exactamente como hacen bajo un atadura '<GridColumn>'.
editRenderer={() => (
<div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>
<TextEdit columnName="firstname" displayLabelWhenAvailable={false} />
<TextEdit columnName="lastname" displayLabelWhenAvailable={false} />
</div>
)}
/>
<GridTemplateColumn Title="Nombre completo"
DependsOn="@(new[] { "firstname", "lastname" })"
SortBy="lastname">
<!-- Plantilla de solo lectura (existente). -->
<ChildContent Context="ctx">
<strong>
@(ctx.Row.PrimaryRecord.GetValueOrDefault<StringValue>("firstname")?.Value)
@(ctx.Row.PrimaryRecord.GetValueOrDefault<StringValue>("lastname")?.Value)
</strong>
</ChildContent>
<!-- Plantilla de edición: se activa cuando el interruptor de Editable de la cuadrícula está activado
Y la fila es cambiable. Elimina dos <TextEdit>'' del lado de los editores
Y se conectan automáticamente a seguimiento sucio y validación
Exactamente como hacen bajo un atadura '<GridColumn>'. -->
<EditChildContent Context="editCtx">
<FluentStack Orientation="Orientation.Horizontal" HorizontalGap="6"
VerticalAlignment="VerticalAlignment.Center">
<TextEdit ColumnName="firstname"
DisplayLabelWhenAvailable="false"
DisplayTooltipWhenAvailable="false" />
<TextEdit ColumnName="lastname"
DisplayLabelWhenAvailable="false"
DisplayTooltipWhenAvailable="false" />
</FluentStack>
</EditChildContent>
</GridTemplateColumn>
Patrón 2 — Widget personalizado con SetValue
Cuando la superficie del editor no se asigna 1:1 a una columna de Dataverse — un único cuadro de texto "Primero Último" que se divide en dos columnas, un deslizador vinculado a varios campos porcentuales, un selector personalizado de rango de fechas que escribe inicio + fin — renderiza tu propia entrada y llama editCtx.SetValue(columnName, value) a cada columna afectada. El framework enruta la escritura al correcto AliasedTableRecord (gestionando los nombres de columnas de enlaces de entidades con notación de puntos) y lanza el evento del ValueChanged registro para que el dirty-tracking y la cola de actualización pendiente de la fila detecten el cambio.
React
Blazor
<GridTemplateColumn
displayName="Nombre completo"
dependsOn={['firstname', 'lastname']}
sortBy="lastname"
cellRenderer={({ record }) => {
const first = (record.properties?.firstname as { value?: string })?.value ?? '';
const last = (record.properties?.lastname as { value?: string })?.value ?? '';
return <strong>{first} {last}</strong>;
}}
editRenderer={({ record, setValue }) => {
const first = (record.properties?.firstname as { value?: string })?.value ?? '';
const last = (record.properties?.lastname as { value?: string })?.value ?? '';
const combined = [first, last].filter(Boolean).join(' ');
return (
<Input
value={combined}
onChange={(_, data) => {
const next = data.value ?? '';
// Divide en la primera casilla — todo lo que viene después aparece en apellido.
const idx = next.indexOf(' ');
const head = idx === -1 ? next : next.slice(0, idx);
const tail = idx === -1 ? '' : next.slice(idx + 1);
setValue('firstname', { $type: 'StringValue', value: head });
setValue('lastname', { $type: 'StringValue', value: tail || null });
}}
/>
);
}}
/>
<GridTemplateColumn Title="Nombre completo"
DependsOn="@(new[] { "firstname", "lastname" })"
SortBy="lastname">
<ChildContent Context="ctx">
@{
var first = ctx.Row.PrimaryRecord.GetValueOrDefault<StringValue>("firstname")?.Value;
var last = ctx.Row.PrimaryRecord.GetValueOrDefault<StringValue>("lastname")?.Value;
}
<strong>@first @last</strong>
</ChildContent>
<EditChildContent Context="editCtx">
@{
var combined =
(editCtx.Row.PrimaryRecord.GetValueOrDefault<StringValue>("firstname")?.Value ?? "")
+ " "
+ (editCtx.Row.PrimaryRecord.GetValueOrDefault<StringValue>("lastname")?.Value ?? "");
}
<FluentTextInput Value="@combined.Trim()" ValueChanged="@(next =>
{
// Divide en la primera casilla — todo lo que viene después aparece en apellido.
var parts = next.Split(' ', 2);
editCtx.SetValue("firstname", new StringValue { Value = parts[0] });
editCtx.SetValue("lastname", new StringValue { Value = parts.Length > 1 ? parts[1] : null });
})" />
</EditChildContent>
</GridTemplateColumn>
Validación en el camino imperativo
Los editores estándar se EditChildContent registraban automáticamente con las EditContextValidator filas y participaban en la puerta de validación antes de guardar del framework. El editCtx.SetValue camino evita esa canalización — el framework no puede validar valores que no provengan de un editor registrado. Si tu widget personalizado necesita imponer restricciones, ejecuta dentro de la ValueChanged callback antes de llamar SetValue, o recurre al patrón de editor de entrada directa cuando sea posible.
En una SubGrid
Todo lo que se aplica a MainGrid funciona de forma idéntica en SubGrid. Empareja las columnas declaradas con botones de barra de herramientas en el Buttons fragmento de renderizado para una experiencia de edición en línea enfocada con alcance a la colección relacionada del registro padre — y combínalo con @@context.ParentRecord plantillas en celda para formatear condicionalmente que se basa en el archivo padre del SubGrid.
Obligatorio. Nombre lógico de la columna; Soporta notación de puntos para columnas de entidades enlazadas con aliasing.
TableName
Opcional. Nombre lógico de la tabla cuyos metadatos describen esta columna. Hereda la cuadrícula TableName cuando se omite.
Width
Longitud CSS opcional para el ancho de la columna.
Align
Anulación opcional de alineación horizontal (Align.Start, Align.Center, Align.End). Vuelve al valor predeterminado basado en metadatos cuando se omite.
Title
Anulación opcional de etiqueta de encabezado. Vuelve al nombre de visualización localizado de la columna.
HeaderTooltip
Descripción emergente opcional de cabecera — útil para explicar columnas calculadas o aliasadas. (Nombrado para evitar la colisión insensible a mayúsculas minúsculas con el parámetro bool heredado Tooltip en TemplateColumn.)
Visible
Opcional. false suprime la columna de la tabla renderizada y de la proyección del servidor incluso cuando hay otras columnas declaradas presentes. Por defecto es true.
IsDefaultSortColumn / InitialSortDirection
Opcional. Marca una columna declarada como la orden inicial de la cuadrícula. La dirección de ordenamiento por defecto es ascendente.
ChildContent
Plantilla opcional por celda que recibe GridRowContext. Se renderiza dentro de cada célula corporal cuando se le suministra; accede a la fila a través @@context.PrimaryRecord de y (en una SubGrid) al padre mediante @@context.ParentRecord.
Parámetro:ColumnName
Descripción:Obligatorio. Nombre lógico de la columna; Soporta notación de puntos para columnas de entidades enlazadas con aliasing.
Parámetro:TableName
Descripción:Opcional. Nombre lógico de la tabla cuyos metadatos describen esta columna. Hereda la cuadrícula TableName cuando se omite.
Parámetro:Width
Descripción:Longitud CSS opcional para el ancho de la columna.
Parámetro:Align
Descripción:Anulación opcional de alineación horizontal (Align.Start, Align.Center, Align.End). Vuelve al valor predeterminado basado en metadatos cuando se omite.
Parámetro:Title
Descripción:Anulación opcional de etiqueta de encabezado. Vuelve al nombre de visualización localizado de la columna.
Parámetro:HeaderTooltip
Descripción:Descripción emergente opcional de cabecera — útil para explicar columnas calculadas o aliasadas. (Nombrado para evitar la colisión insensible a mayúsculas minúsculas con el parámetro bool heredado Tooltip en TemplateColumn.)
Parámetro:Visible
Descripción:Opcional. false suprime la columna de la tabla renderizada y de la proyección del servidor incluso cuando hay otras columnas declaradas presentes. Por defecto es true.
Descripción:Opcional. Marca una columna declarada como la orden inicial de la cuadrícula. La dirección de ordenamiento por defecto es ascendente.
Parámetro:ChildContent
Descripción:Plantilla opcional por celda que recibe GridRowContext. Se renderiza dentro de cada célula corporal cuando se le suministra; accede a la fila a través @@context.PrimaryRecord de y (en una SubGrid) al padre mediante @@context.ParentRecord.
Parámetros de GridTemplateColumn
Parámetro
Descripción
Id
Identificador estable opcional. Cuando se omite, el framework genera automáticamente uno en __template-{index} función de la posición de la columna de la plantilla entre las demás plantillas. Transmite un id explícito cuando tus declaraciones puedan reordenarse dinámicamente.
Title
Etiqueta de cabecera requerida. No hay metadatos de columna acotados a partir de los cuales derivar un valor predeterminado.
DependsOn
Opcional. La columna lógica de Dataverse nombra el renderizador que lee de la fila. El framework fusiona estos en la proyección FetchXML para que los datos caigan en ctx.Row.PrimaryRecord. Omitidos/vacíos para celdas decorativas.
SortBy
Opcional. Nombre lógico de columna para ordenar por cuándo se hace clic en la cabecera. Omitido = encabezado no es sortable.
Width
Longitud CSS opcional para el ancho de la columna.
Align
Anulación opcional de alineación horizontal. Por defecto ( Align.Start no hay un tipo de columna basado en metadatos, ya que no hay un tipo de columna subyacente).
Tooltip
Texto de descripción introductiva opcional.
Visible
Opcional. false suprime la columna de la tabla renderizada Y elimina sus DependsOn entradas de la proyección del servidor. Por defecto es true.
ChildContent
Plantilla requerida por celda para recibir GridTemplateColumnContext. Lee la fila a través ctx.Row.PrimaryRecord de (y en una SubGrid, el padre a través de ctx.Row.ParentRecord); use ctx.DependsOnMetadata[name] para metadatos por columna cuando el renderizador lo necesita.
EditChildContent
Plantilla opcional de edición que recibe GridTemplateColumnEditContext. Se invoca en lugar de ChildContent cuando la cuadrícula está en modo de edición en línea y la fila es mutable. Mismo contexto de fila que la plantilla de lectura más editCtx.SetValue(name, value) para escrituras imperativas. Consulta las Plantillas de Edición en línea arriba para los dos patrones de autor.
Parámetro:Id
Descripción:Identificador estable opcional. Cuando se omite, el framework genera automáticamente uno en __template-{index} función de la posición de la columna de la plantilla entre las demás plantillas. Transmite un id explícito cuando tus declaraciones puedan reordenarse dinámicamente.
Parámetro:Title
Descripción:Etiqueta de cabecera requerida. No hay metadatos de columna acotados a partir de los cuales derivar un valor predeterminado.
Parámetro:DependsOn
Descripción:Opcional. La columna lógica de Dataverse nombra el renderizador que lee de la fila. El framework fusiona estos en la proyección FetchXML para que los datos caigan en ctx.Row.PrimaryRecord. Omitidos/vacíos para celdas decorativas.
Parámetro:SortBy
Descripción:Opcional. Nombre lógico de columna para ordenar por cuándo se hace clic en la cabecera. Omitido = encabezado no es sortable.
Parámetro:Width
Descripción:Longitud CSS opcional para el ancho de la columna.
Parámetro:Align
Descripción:Anulación opcional de alineación horizontal. Por defecto ( Align.Start no hay un tipo de columna basado en metadatos, ya que no hay un tipo de columna subyacente).
Parámetro:Tooltip
Descripción:Texto de descripción introductiva opcional.
Parámetro:Visible
Descripción:Opcional. false suprime la columna de la tabla renderizada Y elimina sus DependsOn entradas de la proyección del servidor. Por defecto es true.
Parámetro:ChildContent
Descripción:Plantilla requerida por celda para recibir GridTemplateColumnContext. Lee la fila a través ctx.Row.PrimaryRecord de (y en una SubGrid, el padre a través de ctx.Row.ParentRecord); use ctx.DependsOnMetadata[name] para metadatos por columna cuando el renderizador lo necesita.
Parámetro:EditChildContent
Descripción:Plantilla opcional de edición que recibe GridTemplateColumnEditContext. Se invoca en lugar de ChildContent cuando la cuadrícula está en modo de edición en línea y la fila es mutable. Mismo contexto de fila que la plantilla de lectura más editCtx.SetValue(name, value) para escrituras imperativas. Consulta las Plantillas de Edición en línea arriba para los dos patrones de autor.
Apply comienza con un filtro en las siguientes columnas:
Correo electrónico Nombre completo Teléfono
Apply comienza con un filtro en las siguientes columnas:
Correo electrónico Nombre completo Teléfono
Apply comienza con un filtro en las siguientes columnas:
Correo electrónico Nombre completo Teléfono
Utiliza comparaciones numéricas en las siguientes columnas:
Edad
Utiliza comparaciones de fechas o años en las siguientes columnas:
Cumpleaños
Apply comienza con un filtro en las siguientes columnas:
Correo electrónico Nombre completo Teléfono
Utiliza comparaciones numéricas en las siguientes columnas:
Edad
Utiliza comparaciones de fechas o años en las siguientes columnas: