Nome completo | |
|---|---|
| Nenhum registro encontrado. |
Por padrão, MainGrid e SubGrid renderize qualquer conjunto de colunas que a visualização ativa do Dataverse retorne. O GridColumn componente permite que você assuma controle explícito: quando um ou mais GridColumn filhos são declarados, a grade renderiza apenas essas colunas, na ordem declarada, e a projeção do lado do servidor é reescrita para buscar exatamente o conjunto declarado. Use isso para reduzir a grade até as colunas que importam para uma página específica, reordená-las, personalizar a largura/alinhamento, fornecer templates por célula ou colunas de superfície que não estejam na visualização subjacente — sem editar a visualização do Dataverse em si.
A MainGrid sobre a contact tabela misturando a GridTemplateColumn com quatro filhos regularesGridColumn. A primeira célula é sintética — compõe um avatar inicial mais um nome em negrito a partir de valores brutos firstname + lastname puxados para a projeção via DependsOn. Os três seguintes demonstram modelos por célula em colunas encadernadas: um mailto: link, um número de telefone com ícone inline e um crachá de idade codificado por cores que lê o via GetValueOrDefault<T>() bruto DecimalValue para a comparação de limiar. O último, Aniversário, não tem modelo, então a célula de data embutida o renderiz. Clique no ícone de engrenagem e ative Editável para ver as colunas EditChildContent do modelo em ação — a célula do Nome Completo troca do renderizado avatar para dois editores lado a TextEdit lado vinculados a firstname + lastname.
Nome completo | |
|---|---|
| Nenhum registro encontrado. |
Coloque GridColumn componentes dentro de uma GridColumns capa sob a grade. Nomes de colunas declaradas sobrescrevem a projeção do <attribute> FetchXML — o servidor busca as colunas declaradas mesmo que elas não estejam na seleção de colunas da visualização ativa. O TableName parâmetro é opcional no modo declarado: quando omitido, o próprio TableName da grade é usado (não é necessário repeti-lo em cada coluna).
<MainGrid tableName="contact">
<GridColumns>
<GridColumn columnName="firstname" />
<GridColumn columnName="lastname" />
<GridColumn columnName="emailaddress1" />
</GridColumns>
</MainGrid><MainGrid TableName="contact">
<GridColumns>
<GridColumn ColumnName="firstname" />
<GridColumn ColumnName="lastname" />
<GridColumn ColumnName="emailaddress1" />
</GridColumns>
</MainGrid>Substituir, não aditivo
Declarar qualquer
GridColumnfilho muda a grade para o modo de substituição: colunas declaradas são o conjunto inteiro de colunas renderizado E todo o conjunto de colunas buscadas. Colunas de visualização não declaradas aqui são removidas tanto da renderização quanto da projeção do servidor. Se quiser a maioria das colunas de visualização com um ou dois ajustes, abandone completamente o wrapper ou construa uma visualização personalizada viaCustomViewDefinitions.
Cada GridColumn declaração leva:
ColumnName — Obrigatório. Nome lógico da coluna a projetar. Suporta notação pontual para colunas de entidades vinculadas aliasadas (primarycontactid.emailaddress1); o alias já deve existir como a <link-entity> no FetchXML da visualização ativa.TableName — Opcional. Nome lógico da tabela cujos metadados descrevem esta coluna. Quando omitido, recorre à grade TableName — útil para manter a margem do consumidor curta em grades de tabela única.Use Width para sobrescrever a largura armazenada da visualização. Aceita qualquer comprimento CSS — pixels ("150px"), porcentagens ("20%"), ou "auto". Sem uma largura explícita, a grade volta ao padrão derivado dos metadados e à distribuição natural da tabela.
<GridColumns>
<GridColumn columnName="firstname" width="150px" />
<GridColumn columnName="lastname" width="150px" />
<GridColumn columnName="emailaddress1" width="250px" />
</GridColumns><GridColumns>
<GridColumn ColumnName="firstname" Width="150px" />
<GridColumn ColumnName="lastname" Width="150px" />
<GridColumn ColumnName="emailaddress1" Width="250px" />
</GridColumns>Use Align para sobrescrever o alinhamento horizontal tanto do cabeçalho quanto das células do corpo. Colunas numéricas e de dinheiro têm por padrão ( Align.End alinhadas à direita) via o recurso de respaldo orientado por metadados; colunas booleanas têm por padrão . Align.Center Defina explicitamente quando quiser um alinhamento não padrão, ou para alinhar uma célula com template personalizado de forma consistente.
{/* Colunas numérica e monetária já se alinham ao final via
Recurso de retenção orientado por metadados. Defina alinhamento explicitamente quando você
Quero um alinhamento não padrão. */}
<GridColumns>
<GridColumn columnName="firstname" />
<GridColumn columnName="creditlimit" align="end" />
<GridColumn columnName="donotemail" align="center" />
</GridColumns><!-- Colunas numérica e monetária já se alinham ao final via
Recurso de retenção orientado por metadados. Defina Alinhar explicitamente quando você
Quero um alinhamento não padrão. -->
<GridColumns>
<GridColumn ColumnName="firstname" />
<GridColumn ColumnName="creditlimit" Align="DataGridCellAlignment.End" />
<GridColumn ColumnName="donotemail" Align="DataGridCellAlignment.Center" />
</GridColumns>Colunas de entidades ligadas com aliasings usam notação de pontos que corresponde ao que o FetchXML da visualização as aliasiza. O alias já deve estar definido como a <link-entity> na visualização ativa. Definido TableName para a tabela de origem para que o alias aponte para que a resolução dos metadados caia na entidade correta. O servidor retorna essas colunas com seu nome de exibição localizado qualificado pela tabela pai (por exemplo, "Email (Contato Primário)") — sem necessidade de humanização do lado do cliente.
<MainGrid tableName="account">
<GridColumns>
<GridColumn columnName="name" />
{/* Coluna de entidade ligada com aliasing: a notação de pontos corresponde
como a coluna aparece no alias FetchXML da visualização.
O servidor resolve automaticamente os metadados da entidade de link
do FetchXML — não é necessário um prop separado de tableName. */}
<GridColumn columnName="primarycontactid.emailaddress1" />
</GridColumns>
</MainGrid><MainGrid TableName="account">
<GridColumns>
<GridColumn ColumnName="name" />
<!-- Coluna de entidade ligada com aliasing: a notação de pontos corresponde
como a coluna aparece no alias FetchXML da visualização.
TableName deve apontar para a tabela da LINK-ENTITY então
os metadados são resolvidos contra a entidade correta. -->
<GridColumn ColumnName="primarycontactid.emailaddress1"
TableName="contact" />
</GridColumns>
</MainGrid>Forneça ChildContent para renderizar cada célula com marcação personalizada. O template recebe GridRowContext — sua PrimaryRecord propriedade expõe a linha completa TableRecord (valores de colunas digitadas, valores formatados, permissões, tudo). Útil para formatação condicional (texto vermelho acima de um limite), ícones, distintivos, links ou qualquer outra coisa que você possa construir a partir do registro da linha.
<GridColumns>
<GridColumn columnName="fullname" />
<GridColumn
columnName="creditlimit"
cellRenderer={({ record }) => {
// O TableRecord da linha — brutos + valores formatados disponíveis.
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>ChildContent recebe a linha, que todas as células nela compartilham, então não pode saber qual coluna está renderizando — ou qual a busca da grade correspondeu nela. Quando a célula precisar saber, fornece CellTemplate em vez disso. Ela recebe um GridColumnCellContext: a Rowcélula ColumnName, Metadata e digitada Value, a DisplayValue célula embutida mostraria, e Highlight(text), que marca exatamente o que a busca correspondeu como as células embutidas — o termo de busca nas colunas de texto, busca e escolha, e o valor total de uma coluna de número ou data cuja comparação vale. Ela tem precedência sobre ChildContent quando ambas são definidas. No React a cellRenderer já recebe o texto da valuecélula , metadata e searchText: passe searchText para <Highlighter> para texto, e para uma coluna numérica ou dinheiro verifique com parseNumericSearch e matchesNumericSearch, e para uma coluna de data com parseDateSearch e matchesDateSearch — que pega o texto formatado da célula em vez de seu valor, já que o dia em que uma data cai depende do fuso horário em que é mostrado e da localidade de useLocale() — marcando o valor com <HighlightFull> quando correspondem.
<GridColumn
columnName="emailaddress1"
cellRenderer={({ record, searchText }) => {
// Marque o que a busca da grade correspondeu, como as células embutidas.
const email = resolveColumnDisplayValue(record, 'emailaddress1') ?? '';
return (
<a href={`mailto:${email}`}>
<Highlighter text={email} searchText={searchText ?? null} />
</a>
);
}}
/><GridColumn ColumnName="emailaddress1">
<CellTemplate Context="cell">
<!-- Marque o que a busca da grade correspondeu, como as células embutidas. -->
<a href="mailto:@cell.DisplayValue">@cell.Highlight(cell.DisplayValue)</a>
</CellTemplate>
</GridColumn>Quando a grade é montada como um SubGrid, GridRowContext.ParentRecord expõe o registro de 's ao redor RecordContext(o pai da SubGrade). Procure dentro de um ChildContent modelo quando a formatação condicional precisar comparar a coluna de uma linha com a do pai — por exemplo, destacar contatos que industrycode não correspondam à conta do pai, ou rotular linhas pertencentes ao dono do pai. null em um registro independente MainGrid onde não há registro pai.
<SubGrid relationshipName="contact_customer_accounts">
<GridColumns>
<GridColumn columnName="fullname" />
<GridColumn
columnName="industrycode"
cellRenderer={({ record, parentRecord }) => {
// Compare o setor desse contato com o da conta 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>Paridade de reação
O lado React tem a mesma superfície que
cellRendereroparentRecordprop de '.CellRendererProps.parentRecord
Use GridTemplateColumn quando uma coluna não mapeia para uma única coluna do Dataverse — combine vários valores brutos em uma célula, renderize um distintivo de status com chave em vários campos ou emita uma célula de ações puramente decorativas sem dependência de dados. Diferente de GridColumn, uma coluna template não ColumnNametem : declare as colunas pelas quais o renderer lê DependsOn e o framework as funde na projeção FetchXML, para que os dados cheguem quando ctx.Row.PrimaryRecord seu template roda. Ele ChildContent recebe um GridTemplateColumnContext (use o Context="ctx" atributo para nomear) que carrega a linha, o pai SubGrid opcional e uma consulta pré-construída DependsOnMetadata com base nos nomes das colunas que você declarou.
<MainGrid tableName="contact">
<GridColumns>
{/* Combine primeiro nome + sobrenome em um único "Nome Completo"
cela. dependsOn informa ao framework quais colunas são as
Template lê para que eles sejam projetados no fetch.
SortBy aponta para o cabeçalho Digitar no sobrenome.
searchBy coloca ambos na busca da grade; O marcador marca a correspondência. */}
<GridTemplateColumn
displayName="Nome 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>
<!-- Combine primeiro nome + sobrenome em um único "Nome Completo"
cela. DependsOn informa ao framework quais colunas são as
Template lê para que eles sejam projetados no fetch.
SortBy aponta para o cabeçalho, ordenar no sobrenome.
SearchBy coloca ambos na busca da grade; O destaque marca a correspondência. -->
<GridTemplateColumn Title="Nome 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>Uma coluna modelo não faz parte da busca da grade, a menos que você diga por qual ser buscada. SearchBy (searchBy no React) nomeia as colunas: elas são buscadas automaticamente, correspondidas pelas regras usuais da grade para seu tipo (o texto começa com a busca, ou o contém após um início *; uma coluna de número ou data é comparada) e listadas na caixa de busca sob o título da coluna do modelo. As colunas em DependsOn são apenas buscadas, nunca pesquisadas — um código de status atrás de um distintivo não deveria corresponder ao que alguém digita. Para marcar o que a busca correspondeu do jeito que as células embutidas, renderize o texto da célula no ctx.Highlight(text) Blazor, ou passe o do renderizador searchText para <Highlighter> no React; ambos ficam vazios para uma coluna sem SearchBy.
Coluna modelo vs. GridColumn ChildContent
GridColumn ChildContentAinda personaliza uma coluna limitada — ordenação, despacho de edição e o cabeçalho da coluna todos são dados de seu únicoColumnName. Alcance apenasGridTemplateColumnquando não houver uma única coluna subjacente para vincular (células compostas, células decorativas de ação, crachás de status combinando múltiplos campos). Misturar os dois é aceitável — eles se entrelaçam em ordem declarada ao longo do conjunto de colunas da grade.
Pule DependsOn completamente quando a célula renderiza conteúdo puramente decorativo, como botões ou ícones inline. A estrutura ainda monta a coluna na posição correta da tabela renderizada; Nada é adicionado à projeção do servidor para essa coluna.
{/* Coluna de modelo puramente decorativo: no dependsOn, o renderizador
Não lê da fileira. Útil para botões de ação / ícones. */}
<GridTemplateColumn
displayName=""
width="80px"
cellRenderer={({ record }) => (
<Button
icon={<MoreHorizontal16Regular />}
onClick={() => openContextMenu(record.id)}
/>
)}
/><!-- Coluna de modelo de decoração pura: no DependsOn, o renderizador
Não lê da fileira. Útil para botões de ação / ícones. -->
<GridTemplateColumn Title="" Width="80px">
<ChildContent Context="ctx">
<FluentButton IconStart="@(new Icons.Regular.Size16.MoreHorizontal())"
OnClick="@(() => OpenContextMenu(ctx.Row.PrimaryRecord.Id))" />
</ChildContent>
</GridTemplateColumn>Combine o modo ChildContent de leitura de a GridTemplateColumncom um EditChildContent para tornar a coluna editável quando a opção de Editável da grade estiver ativada. O modelo de edição recebe — GridTemplateColumnEditContext o mesmo contexto de linha do modelo de leitura (editCtx.Row.PrimaryRecord, o opcional editCtx.Row.ParentRecord em um SubGrade, a editCtx.DependsOnMetadata consulta) mais um auxiliar imperativoeditCtx.SetValue(columnName, value).
EditChildContent dispara quando a grade é editável (AllowEdit="true" na grade mais o usuário já virou o botão Editável no menu de engrenagens da barra de ferramentas), a linha não está pendente-deletação, e a própria coluna declara um modelo de edição. Colunas de modelo decorativas que não EditChildContent permitem permanecer em modo somente leitura mesmo no modo de edição — úteis para colunas de ações que sempre devem renderizar os mesmos botões.
O caso mais comum: a célula é composta por múltiplas colunas vinculadas, e você quer deixar o usuário editar cada uma. Coloque os editores correspondentes <TextEdit> / <ColumnEdit> <NumberEdit> / dentro EditChildContent — o framework cascata o registro primário e o matching EditContextValidator da linha para esse escopo, para que os editores se registrem automaticamente para rastreamento sujo e validação exatamente como fazem sob um bound <GridColumn>.ChildContent Não é necessário fiação extra.
<GridTemplateColumn
displayName="Nome completo"
dependsOn={['firstname', 'lastname']}
sortBy="lastname"
// Modelo somente leitura (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>;
}}
// Modelo de edição: dispara quando a opção de alavanca editável da grade está ligada
// E a linha é mutável. Elimine dois <TextEdit>editores
// ao lado e eles fazem auto-wire para rastreamento sujo e validação
// Exatamente como fazem sob um amarramento '<GridColumn>'.
editRenderer={() => (
<div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>
<TextEdit columnName="firstname" displayLabelWhenAvailable={false} />
<TextEdit columnName="lastname" displayLabelWhenAvailable={false} />
</div>
)}
/><GridTemplateColumn Title="Nome completo"
DependsOn="@(new[] { "firstname", "lastname" })"
SortBy="lastname">
<!-- Modelo somente leitura (existente). -->
<ChildContent Context="ctx">
<strong>
@(ctx.Row.PrimaryRecord.GetValueOrDefault<StringValue>("firstname")?.Value)
@(ctx.Row.PrimaryRecord.GetValueOrDefault<StringValue>("lastname")?.Value)
</strong>
</ChildContent>
<!-- Modelo de edição: dispara quando a opção Editável da grade está ativada
E a linha é mutável. Elimine dois <TextEdit>editores
ao lado e eles fazem auto-wire para rastreamento sujo e validação
Exatamente como fazem sob um amarramento '<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>Quando a superfície do editor não mapeia 1:1 para uma coluna do Dataverse — uma única caixa de texto "Primeiro Último" que se divide em duas colunas, um controle deslizante vinculado a múltiplos campos percentuais, um seletor personalizado por intervalo de datas escrevendo início e fim — renderize sua própria entrada e chame editCtx.SetValue(columnName, value) para cada coluna afetada. A framework roteia a escrita para o endereço correto AliasedTableRecord (lidando com os nomes das colunas link-entity da notação ponto) e dispara o evento do ValueChanged registro para que o dirty-tracking e a fila de atualização pendente da linha detectem a alteração.
<GridTemplateColumn
displayName="Nome 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 ?? '';
// Divida no primeiro espaço — tudo depois cai no sobrenome.
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="Nome 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 =>
{
// Divida no primeiro espaço — tudo depois cai no sobrenome.
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>Validação no caminho imperativo
Editores padrão se registravam
EditChildContentautomaticamente com asEditContextValidatorlinhas e participavam do portão de validação antes do save do framework. OeditCtx.SetValuecaminho contorna esse pipeline — o framework não pode validar valores que não vieram de um editor registrado. Se seu widget personalizado precisar impor restrições, execute-as dentro doValueChangedcallback antes de chamarSetValue, ou volte ao padrão de editor drop-in quando possível.
Tudo que se aplica a MainGrid funciona de forma idêntica em SubGrid. Parear colunas declaradas com botões de barra de ferramentas no Buttons fragmento de renderização para uma experiência de edição inline focada, direcionada à coleção relacionada ao registro pai — e combine com @@context.ParentRecord templates de célula para formatação condicional que se baseia no pai do SubGrid.
<SubGrid relationshipName="contact_customer_accounts">
<GridColumns>
<GridColumn columnName="fullname" />
<GridColumn columnName="emailaddress1" />
<GridColumn columnName="telephone1" />
</GridColumns>
<GridButtons>
<NewRecordGridButton>
<NewContactForm />
</NewRecordGridButton>
<DeleteRecordGridButton />
</GridButtons>
</SubGrid><SubGrid RelationshipName="contact_customer_accounts">
<GridColumns>
<GridColumn ColumnName="fullname" />
<GridColumn ColumnName="emailaddress1" />
<GridColumn ColumnName="telephone1" />
</GridColumns>
<Buttons>
<NewRecordGridButton TForm="NewContactForm" />
<DeleteRecordGridButton />
</Buttons>
</SubGrid>Parâmetro | Descrição |
|---|---|
ColumnName | Obrigatório. Nome lógico da coluna; suporta notação pontuária para colunas de entidades vinculadas com aliasing. |
TableName | Opcional. Nome lógico da tabela cujos metadados descrevem esta coluna. Herda a TableName grade quando omitida. |
Width | Comprimento CSS opcional para a largura da coluna. |
Align | Opcional sobreposição de alinhamento horizontal ( Align.Start, Align.Center, Align.End). Volta ao padrão orientado por metadados quando omitido. |
Title | Opcional substituição do rótulo de cabeçalho. Volta ao nome de exibição localizado da coluna. |
HeaderTooltip | Dica opcional de cabeçalho — útil para explicar colunas computadas ou aliasadas. (Nomeado para evitar a colisão insensível a maiúsculas minúsculas com o parâmetro bool herdado Tooltip em TemplateColumn.) |
Visible | Opcional. false suprime a coluna da tabela renderizada e da projeção do servidor mesmo quando outras colunas declaradas estão presentes. O padrão é .true |
IsDefaultSortColumn / InitialSortDirection | Opcional. Marque uma coluna declarada como a ordenação inicial da grade. A direção de ordenação é padrão ascendente. |
ChildContent | Modelo opcional de recebimento GridRowContextpor célula . Renderiza dentro de cada célula do corpo quando fornecida; acesse a linha via @@context.PrimaryRecord e (em uma SubGrade) o pai via @@context.ParentRecord. |
ColumnNameTableNameTableName grade quando omitida.WidthAlignAlign.Start, Align.Center, Align.End). Volta ao padrão orientado por metadados quando omitido.TitleHeaderTooltipTooltip em TemplateColumn.)Visiblefalse suprime a coluna da tabela renderizada e da projeção do servidor mesmo quando outras colunas declaradas estão presentes. O padrão é .trueIsDefaultSortColumn / InitialSortDirectionChildContentGridRowContextpor célula . Renderiza dentro de cada célula do corpo quando fornecida; acesse a linha via @@context.PrimaryRecord e (em uma SubGrade) o pai via @@context.ParentRecord.Parâmetro | Descrição |
|---|---|
Id | Identificador estável opcional. Quando omitido, o framework gera automaticamente um como __template-{index} baseado na posição da coluna do modelo entre os outros templates. Passe um id explícito quando suas declarações puderem se reordenar dinamicamente. |
Title | Rótulo de cabeçalho obrigatório. Não há metadados de coluna limitada para derivar um padrão. |
DependsOn | Opcional. A coluna lógica do Dataverse nomeia o renderizador que lê da linha. O framework funde esses dados na projeção FetchXML para que os dados caiam em ctx.Row.PrimaryRecord. Omitido/vazio para células decorativas. |
SortBy | Opcional. Nome lógico da coluna para ordenar quando o cabeçalho é clicado. Omitido = cabeçalho não é sortável. |
Width | Comprimento CSS opcional para a largura da coluna. |
Align | Substituição opcional de alinhamento horizontal. Padrão para Align.Start (não há padrão baseado em metadados, já que não há um tipo de coluna subjacente). |
Tooltip | Texto opcional da dica de cabeçalho. |
Visible | Opcional. false suprime a coluna da tabela renderizada E elimina suas DependsOn entradas da projeção do servidor. O padrão é .true |
ChildContent | Recebimento de template GridTemplateColumnContextpor célula requerido. Leia a linha via ctx.Row.PrimaryRecord (e em um SubGrid, o pai via ctx.Row.ParentRecord); use ctx.DependsOnMetadata[name] para metadados por coluna quando o renderizador precisar. |
EditChildContent | Template opcional de edição recebendo GridTemplateColumnEditContext. Invocado em vez de ChildContent quando a grade está em modo de edição inline e a linha é mutável. Mesma linha do modelo de leitura mais editCtx.SetValue(name, value) para escritas imperativas. Veja os Modelos de Edição Inline acima para os dois padrões de autoria. |
Id__template-{index} baseado na posição da coluna do modelo entre os outros templates. Passe um id explícito quando suas declarações puderem se reordenar dinamicamente.TitleDependsOnctx.Row.PrimaryRecord. Omitido/vazio para células decorativas.SortByWidthAlignAlign.Start (não há padrão baseado em metadados, já que não há um tipo de coluna subjacente).TooltipVisiblefalse suprime a coluna da tabela renderizada E elimina suas DependsOn entradas da projeção do servidor. O padrão é .trueChildContentGridTemplateColumnContextpor célula requerido. Leia a linha via ctx.Row.PrimaryRecord (e em um SubGrid, o pai via ctx.Row.ParentRecord); use ctx.DependsOnMetadata[name] para metadados por coluna quando o renderizador precisar.EditChildContentGridTemplateColumnEditContext. Invocado em vez de ChildContent quando a grade está em modo de edição inline e a linha é mutável. Mesma linha do modelo de leitura mais editCtx.SetValue(name, value) para escritas imperativas. Veja os Modelos de Edição Inline acima para os dois padrões de autoria.