Par défaut, MainGrid et SubGrid affichez la colonne que la vue active du Dataverse revient. Le GridColumn composant vous permet de prendre un contrôle explicite : lorsqu’un ou plusieurs GridColumn enfants sont déclarés, la grille ne rend que ces colonnes, dans l’ordre déclaré, et la projection côté serveur est réécrite pour récupérer exactement l’ensemble déclaré. Utilisez cela pour affiner une grille aux colonnes qui comptent pour une page spécifique, les réorganiser, personnaliser la largeur / l’alignement, fournir des modèles par cellule ou des colonnes de surface qui ne sont pas dans la vue sous-jacente — sans modifier la vue Dataverse elle-même.
Démo live
Un A au-dessus de MainGrid la contact table en mélangeant un A GridTemplateColumn avec trois enfants ordinairesGridColumn. La première cellule est synthétique — compose un avatar initiale plus un nom gras issu de valeurs brutes firstname + lastname tirées dans la projection via DependsOn. Les trois autres présentent des modèles par cellule ChildContent sur des colonnes liées : un mailto: lien, un numéro de téléphone avec une icône en ligne, et un badge d’âge codé par couleur qui lit le via GetValueOrDefault<T>() brut IntValue pour la comparaison de seuil. Cliquez sur l’icône d’engrenage et activez Modifiable pour voir les colonnes EditChildContent du modèle en action — la cellule du nom complet passe du rendu avatar à deux éditeurs côte TextEdit à côte liés à firstname +lastname.
Exemple de réaction
Exemple de Blazor
Tout le monde peut consulter les contacts dans la grille ci-dessous. Connectez-vous pour créer, consulter et mettre à jour vos propres contacts.
Tous les contacts
Tous les contacts
Taille de la page
102050100
Editable
Nom complet
Email
Téléphone
Âge
AMAbagail Miller
-
-
-
APAbdul Pollich
-
-
-
APAbel Parisian
-
-
-
AKAbigale Kuvalis
-
-
-
APAdell Paucek
-
-
-
ARAdella Roob
-
-
-
AWAdolf Weber
-
-
-
ATAdonis Torphy
-
-
-
AGAgustin Goyette
-
-
-
ARAgustin Rau
-
-
-
React TypeScript
Razor
Usage de base
Laissez tomber GridColumn des composants à l’intérieur d’un GridColumns wrapper sous la grille. Les noms de colonnes déclarés supplantent la projection du <attribute> FetchXML — le serveur récupère les colonnes déclarées même si elles ne sont pas dans la sélection de colonnes de la vue active. Le TableName paramètre est optionnel en mode déclaré : lorsqu’il est omis, celui de TableName la grille est utilisé (inutile de le répéter à chaque colonne).
Déclarer un GridColumn enfant passe la grille en mode remplacement : les colonnes déclarées sont l’ensemble des colonnes rendues ET l’ensemble entier des colonnes récupérées. Les colonnes de vue non déclarées ici sont supprimées à la fois du rendu et de la projection du serveur. Si vous voulez la plupart des colonnes de vues avec un ou deux ajustements, supprimez complètement l’enveloppe ou créez une vue personnalisée via CustomViewDefinitions.
Paramètres requis
Chaque GridColumn déclaration comprend :
ColumnName — Obligatoire. Nom logique de la colonne à projeter. Prend en charge la notation par points pour les colonnes d’entités liées aliasées (primarycontactid.emailaddress1) ; l’alias doit déjà exister en tant que a <link-entity> dans le FetchXML de la vue active.
TableName — Optionnel. Nom logique du tableau dont les métadonnées décrivent cette colonne. Lorsqu’elle est omise, elle revient à la grille TableName — pratique pour maintenir la marge des consommateurs brève sur les grilles à table unique.
Largeur de colonne
À utiliser Width pour remplacer la largeur stockée de la vue. Accepte toute longueur CSS — pixels ("150px"), pourcentages ("20%"), ou "auto". Sans largeur explicite, la grille revient à la base par défaut dérivée des métadonnées et à la distribution naturelle de la table.
À utiliser Align pour remplacer l’alignement horizontal à la fois pour le tête et les cellules du corps. Les colonnes numériques et monétaires sont par défaut ( Align.End alignées à droite) via le plan de rechange basé sur les métadonnées ; les colonnes booléennes sont par défaut . Align.Center Définissez-le explicitement lorsque vous voulez un alignement non par défaut, ou pour aligner une cellule personnalisée de manière cohérente.
React
{/* Les colonnes numériques et monétaires s’alignent déjà en fin via le
Un repli basé sur les métadonnées. Définir aligner explicitement lorsque vous
Je veux un alignement non par défaut. */}
<GridColumns>
<GridColumn columnName="firstname" />
<GridColumn columnName="creditlimit" align="end" />
<GridColumn columnName="donotemail" align="center" />
</GridColumns>Blazor
<!-- Les colonnes numériques et monétaires s’alignent déjà en fin via le
Un repli basé sur les métadonnées. Définissez explicitement Align lorsque vous
Je veux un alignement non par défaut. -->
<GridColumns>
<GridColumn ColumnName="firstname" />
<GridColumn ColumnName="creditlimit" Align="Align.End" />
<GridColumn ColumnName="donotemail" Align="Align.Center" />
</GridColumns>
Colonnes d’entités liées
Les colonnes à entités liées aliasées utilisent la notation par points correspondant à la façon dont les aliase FetchXML de la vue. L’alias doit déjà être défini comme a <link-entity> dans la vue active. En posant TableName sur la table source , l’alias pointe pour que la résolution des métadonnées tombe sur la bonne entité. Le serveur renvoie ces colonnes avec leur nom d’affichage localisé qualifié par table parente (par exemple « Email (Contact principal) ») — aucune humanisation côté client n’est requise.
React
<MainGrid tableName="account">
<GridColumns>
<GridColumn columnName="name" />
{/* Colonne entité liée aliasée : la notation des points correspond
comment la colonne apparaît dans l’alias FetchXML de la vue.
Le serveur résout automatiquement les métadonnées de l’entité de lien
à partir du FetchXML — aucun prop séparé de tableName n’est requis. */}
<GridColumn columnName="primarycontactid.emailaddress1" />
</GridColumns>
</MainGrid>Blazor
<MainGrid TableName="account">
<GridColumns>
<GridColumn ColumnName="name" />
<!-- Colonne entité liée aliasée : la notation des points correspond
comment la colonne apparaît dans l’alias FetchXML de la vue.
TableName doit pointer vers la table de la LINK-ENTITY donc
Les métadonnées se résolvent contre la bonne entité. -->
<GridColumn ColumnName="primarycontactid.emailaddress1"
TableName="contact" />
</GridColumns>
</MainGrid>
Modèles par cellule
Fournir ChildContent pour afficher chaque cellule avec un balisage personnalisé. Le modèle reçoit GridRowContext — sa PrimaryRecord propriété expose la totalité TableRecord de la ligne (valeurs de colonnes tapées, valeurs formatées, permissions, tout). Utile pour la mise en forme conditionnelle (texte rouge au-dessus d’un seuil), les icônes, badges, liens, ou tout ce que vous pouvez construire à partir de l’enregistrement de la ligne.
React
<GridColumns>
<GridColumn columnName="fullname" />
<GridColumn
columnName="creditlimit"
cellRenderer={({ record }) => {
// Le TableRecord de la ligne — valeurs brutes + formatées 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(--error-fill-rest)' : 'inherit' }}>
{formatted}
</span>
);
}}
/>
</GridColumns>Blazor
<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(--error-fill-rest)" : "inherit")">
@(context.PrimaryRecord.FormattedValues["creditlimit"] ?? "-")
</span>
</ChildContent>
</GridColumn>
</GridColumns>
Enregistrement parent dans les sous-grilles
Lorsque la grille est montée en SubGridtant que , GridRowContext.ParentRecord expose l’enregistrement de l’environnement RecordContext(le parent du SubGrid). Cherchez-la dans un ChildContent modèle lorsque la mise en forme conditionnelle doit comparer la colonne d’une ligne à celle du parent — par exemple, surlignez les contacts qui industrycode ne correspondent pas à celui du compte parent, ou étiquetez les lignes appartenant au propriétaire du parent. null Sur un document autonome MainGrid où il n’y a pas d’enregistrement parent.
React
<SubGrid relationshipName="contact_customer_accounts">
<GridColumns>
<GridColumn columnName="fullname" />
<GridColumn
columnName="industrycode"
cellRenderer={({ record, parentRecord }) => {
// Comparez le secteur de ce contact à celui du compte parent
const rowIndustry = record.formattedValues?.industrycode;
const parentIndustry = parentRecord?.formattedValues?.industrycode;
const mismatch =
parentIndustry != null && rowIndustry != null && rowIndustry !== parentIndustry;
return (
<span style={{ color: mismatch ? 'var(--error-fill-rest)' : 'inherit' }}>
{rowIndustry ?? '-'}
</span>
);
}}
/>
</GridColumns>
</SubGrid>Blazor
<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(--error-fill-rest)" : "inherit")">
@(rowIndustry ?? "-")
</span>
</ChildContent>
</GridColumn>
</GridColumns>
</SubGrid>
Parité de réaction
Le côté Réacte fait surface à la même surface que cellRendererla parentRecord propulsion de '(CellRendererProps.parentRecord).
GridTemplateColumn
Utilisez GridTemplateColumn lorsqu’une colonne ne correspond pas à une seule colonne Dataverse — combinez plusieurs valeurs brutes dans une seule cellule, affichez un badge de statut sur plusieurs champs, ou émettez une cellule d’actions purement décorative sans aucune dépendance aux données. Contrairement à , une colonne modèle n’a pas ColumnName: déclare les colonnes que le moteur de rendu lit DependsOn et le framework les fusionne dans la projection FetchXML, de sorte que les données arrivent GridColumnctx.Row.PrimaryRecord lorsque ton modèle s’exécute. Il ChildContent reçoit un GridTemplateColumnContext (utilisez l’attribut Context="ctx" pour le nommer) qui porte la ligne, le parent SubGrid optionnel, et une recherche préconstruite DependsOnMetadata indexée par les noms de colonnes que vous avez déclarés.
React
<MainGrid tableName="contact">
<GridColumns>
{/* Combinez prénom + nom de famille en un seul « Nom complet »
Cellule. dépendsOn indique au framework quelles colonnes le
Le modèle se lit pour qu’ils soient projetés dans le rapport.
sortBy pointe l’en-tête de trier par nom. */}
<GridTemplateColumn
displayName="Nom complet"
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>;
}}
/>
<GridColumn columnName="emailaddress1" />
</GridColumns>
</MainGrid>Blazor
<MainGrid TableName="contact">
<Columns>
<GridColumns>
<!-- Combinez prénom + nom de famille en un seul « Nom complet »
Cellule. DependsOn indique au cadre quelles colonnes le
Le modèle se lit pour qu’ils soient projetés dans le rapport.
SortBy pointe l’en-tête de trier au nom de famille. -->
<GridTemplateColumn Title="Nom complet"
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>
</GridTemplateColumn>
<GridColumn ColumnName="emailaddress1" />
</GridColumns>
</Columns>
</MainGrid>
Colonne modèle vs. Contenu enfant de la colonne de grille
GridColumn ChildContent On personnalise toujours une colonne liée — trier, éditer dispatch et l’en-tête de colonne tout clé à partir de son unique ColumnName. Atteignez GridTemplateColumn uniquement lorsqu’il n’y a pas de colonne sous-jacente unique à laquelle vous lier (cellules composites, cellules d’action décoratives, badges de statut combinant plusieurs champs). Mélanger les deux est acceptable — ils s’entrelacent dans l’ordre déclaré à travers l’ensemble de colonnes de la grille.
Colonnes décoratives (sans dépendance aux données)
Passez DependsOn complètement lorsque la cellule affiche du contenu purement décoratif comme des boutons ou des icônes en ligne. La structure monte toujours la colonne à la bonne position dans la table rendue ; Rien n’est ajouté à la projection serveur pour cette colonne.
React
{/* Colonne modèle de décoration pure : no dependsOn, le moteur de rendu
ne lit pas la rangée. Utile pour les boutons d’action / icônes. */}
<GridTemplateColumn
displayName=""
width="80px"
cellRenderer={({ record }) => (
<Button
icon={<MoreHorizontal16Regular />}
onClick={() => openContextMenu(record.id)}
/>
)}
/>Blazor
<!-- Colonne modèle de décoration pure : no DependsOn, le moteur de rendu
ne lit pas la rangée. Utile pour les boutons d’action / icônes. -->
<GridTemplateColumn Title="" Width="80px">
<ChildContent Context="ctx">
<FluentButton IconStart="@(new Icons.Regular.Size16.MoreHorizontal())"
OnClick="@(() => OpenContextMenu(ctx.Row.PrimaryRecord.Id))" />
</ChildContent>
</GridTemplateColumn>
Modèles d’édition en ligne
Associez le mode ChildContent lecture de a GridTemplateColumnà un EditChildContent pour rendre la colonne modifiable lorsque le bouton Modification de la grille est activé. Le modèle d’édition reçoit un GridTemplateColumnEditContext — même contexte de ligne que le modèle de lecture (editCtx.Row.PrimaryRecord, l’optionnel editCtx.Row.ParentRecord dans une sous-grille, la editCtx.DependsOnMetadata recherche) plus un assistant impératifeditCtx.SetValue(columnName, value).
EditChildContent se déclenche lorsque la grille est modifiable (AllowEdit="true" sur la grille plus l’utilisateur a basculé l’interrupteur Modifiable dans le menu d’engrenages de la barre d’outils), la ligne n’est pas en attente-supprimer, et la colonne elle-même déclare un modèle d’édition. Les colonnes modèles décoratives qui omettent EditChildContent restent en lecture seule même en mode édition — utiles pour les colonnes d’actions qui devraient toujours afficher les mêmes boutons.
Motif 1 — Éditeurs standards à intégrer directement
Le cas le plus courant : la cellule est composée de plusieurs colonnes liées, et vous voulez laisser l’utilisateur modifier chacune d’elles. Supprimez les <TextEdit> éditeurs correspondants / <ColumnEdit><NumberEdit> / à l’intérieur EditChildContent — le framework cascade l’enregistrement principal et du raccordement EditContextValidator de la ligne dans ce champ, de sorte que les éditeurs s’auto-enregistrent pour le dirty-tracking et la validation exactement comme ils le font sous un binôme .ChildContent<GridColumn> Aucun câblage supplémentaire n’est nécessaire.
React
<GridTemplateColumn
displayName="Nom complet"
dependsOn={['firstname', 'lastname']}
sortBy="lastname"
// Modèle en lecture seule (existant).
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>;
}}
// Modèle d’édition : s’active lorsque le bouton d’édition de la grille est activé
// ET la ligne est changeable. Laisse tomber deux « <TextEdit>côté éditeurs</TextEdit> »
// en parallèle et ils s’auto-câblent vers le suivi sale et la validation
// Exactement comme ils le font sous une <GridColumn>lié ».</GridColumn>
editRenderer={() => (
<div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>
<TextEdit columnName="firstname" displayLabelWhenAvailable={false} />
<TextEdit columnName="lastname" displayLabelWhenAvailable={false} />
</div>
)}
/>Blazor
<GridTemplateColumn Title="Nom complet"
DependsOn="@(new[] { "firstname", "lastname" })"
SortBy="lastname">
<!-- Modèle en lecture seule (existant). -->
<ChildContent Context="ctx">
<strong>
@(ctx.Row.PrimaryRecord.GetValueOrDefault<StringValue>("firstname")?.Value)
@(ctx.Row.PrimaryRecord.GetValueOrDefault<StringValue>("lastname")?.Value)
</strong>
</ChildContent>
<!-- Modèle d’édition : s’active lorsque le bouton Modification de la grille est activé
ET la ligne est changeable. Laisse tomber deux « <TextEdit>côté éditeurs</TextEdit> »
en parallèle et ils s’auto-câblent vers le suivi sale et la validation
Exactement comme ils le font sous une <GridColumn>lié ».</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>
Motif 2 — Widget personnalisé avec SetValue
Lorsque la surface de l’éditeur ne correspond pas en 1:1 à une colonne Dataverse — une seule boîte de texte « Premier dernier » qui se divise en deux colonnes, un curseur lié à plusieurs champs de pourcentage, un sélecteur personnalisé par plage de dates écrivant début + fin — affichez votre propre entrée et appelez editCtx.SetValue(columnName, value) chaque colonne affectée. Le framework aroute l’écriture vers la bonne AliasedTableRecord adresse (en gérant les noms de colonnes des entités de lien en notation point) et lance l’événement de ValueChanged l’enregistrement pour que le dirty-tracking et la file d’attente de mise à jour de la ligne récupèrent la modification.
React
<GridTemplateColumn
displayName="Nom complet"
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 ?? '';
// Divisez sur la première case — tout ce qui est après finit dans le nom de famille.
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 });
}}
/>
);
}}
/>Blazor
<GridTemplateColumn Title="Nom complet"
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 ?? "");
}
<FluentTextField Value="@combined.Trim()" ValueChanged="@(next =>
{
// Divisez sur la première case — tout ce qui est après finit dans le nom de famille.
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>
Validation sur le chemin impératif
Les éditeurs standards s’enregistraient EditChildContent automatiquement avec les EditContextValidator lignes et participaient à la porte de validation avant la sauvegarde du framework. Le editCtx.SetValue chemin contourne ce pipeline — le framework ne peut pas valider des valeurs qui ne proviennent pas d’un éditeur enregistré. Si votre widget personnalisé doit imposer des contraintes, exécutez-les dans le ValueChanged rappel avant d’appeler SetValue, ou revenez au modèle d’éditeur à insertion directe quand c’est possible.
Dans une sous-grille
Tout ce qui s’applique à MainGrid fonctionne de la même manière sur SubGrid. Associez les colonnes déclarées aux boutons de la barre d’outils dans le Buttons fragment de rendu pour une expérience d’édition en ligne ciblée à la collection associée à l’enregistrement parent — et combinez avec @@context.ParentRecord des modèles en cellule pour un formatage conditionnel qui touche à la version parent du SubGrid.
Obligatoire. Nom logique de la colonne ; Prend en charge la notation en points pour les colonnes d’entités liées sous alias.
TableName
Optionnel. Nom logique du tableau dont les métadonnées décrivent cette colonne. Il hérite de la grille TableName lorsqu’il est omis.
Width
Longueur CSS optionnelle pour la largeur de la colonne.
Align
Option optionnelle pour l’alignement horizontal (Align.Start, Align.Center, Align.End). Il revient au par défaut basé sur les métadonnées lorsqu’il est omis.
Title
Option optionnelle pour l’étiquette d’en-tête. Cela revient au nom d’affichage localisé de la colonne.
HeaderTooltip
Infobulle optionnelle d’en-tête — utile pour expliquer les colonnes calculées ou aliasées. (Nommé pour éviter la collision insensible à la casse avec le paramètre bool hérité Tooltip sur TemplateColumn.)
Visible
Optionnel. false supprime la colonne de la table rendue et de la projection serveur même lorsque d’autres colonnes déclarées sont présentes. Par défaut, .true
IsDefaultSortColumn / InitialSortDirection
Optionnel. Marquez une colonne déclarée comme tri initial de la grille. La direction de tri est par défaut ascendante.
ChildContent
Modèle optionnel par cellule réception GridRowContext. Se rend à l’intérieur de chaque cellule corporelle lorsqu’elle est fournie ; accédez à la ligne via @@context.PrimaryRecord et (dans une sous-grille) au parent via @@context.ParentRecord.
Paramètre:ColumnName
Description:Obligatoire. Nom logique de la colonne ; Prend en charge la notation en points pour les colonnes d’entités liées sous alias.
Paramètre:TableName
Description:Optionnel. Nom logique du tableau dont les métadonnées décrivent cette colonne. Il hérite de la grille TableName lorsqu’il est omis.
Paramètre:Width
Description:Longueur CSS optionnelle pour la largeur de la colonne.
Paramètre:Align
Description:Option optionnelle pour l’alignement horizontal (Align.Start, Align.Center, Align.End). Il revient au par défaut basé sur les métadonnées lorsqu’il est omis.
Paramètre:Title
Description:Option optionnelle pour l’étiquette d’en-tête. Cela revient au nom d’affichage localisé de la colonne.
Paramètre:HeaderTooltip
Description:Infobulle optionnelle d’en-tête — utile pour expliquer les colonnes calculées ou aliasées. (Nommé pour éviter la collision insensible à la casse avec le paramètre bool hérité Tooltip sur TemplateColumn.)
Paramètre:Visible
Description:Optionnel. false supprime la colonne de la table rendue et de la projection serveur même lorsque d’autres colonnes déclarées sont présentes. Par défaut, .true
Description:Optionnel. Marquez une colonne déclarée comme tri initial de la grille. La direction de tri est par défaut ascendante.
Paramètre:ChildContent
Description:Modèle optionnel par cellule réception GridRowContext. Se rend à l’intérieur de chaque cellule corporelle lorsqu’elle est fournie ; accédez à la ligne via @@context.PrimaryRecord et (dans une sous-grille) au parent via @@context.ParentRecord.
Paramètres GridTemplateColumn
Paramètre
Description
Id
Identifiant stable optionnel. Lorsqu’il est omis, le framework en génère automatiquement un en fonction __template-{index} de la position de la colonne du modèle parmi les autres modèles. Transmets un id explicite quand tes déclarations peuvent être réordonnées dynamiquement.
Title
Étiquette d’en-tête requise. Aucune métadonnée de colonne limitée à partir de laquelle dériver un défaut.
DependsOn
Optionnel. La colonne logique Dataverse nomme le moteur de rendu lu à partir de la ligne. Le framework fusionne ces données dans la projection FetchXML afin que les données atterrissent dans ctx.Row.PrimaryRecord. Omis/vide pour les cellules décoratives.
SortBy
Optionnel. Nom logique de colonne à trier lorsque l’en-tête est cliqué. Omis = tête n’est pas triable.
Width
Longueur CSS optionnelle pour la largeur de la colonne.
Align
Option optionnelle pour l’alignement horizontal. Par défaut ( Align.Start pas de type par défaut basé sur les métadonnées puisqu’il n’y a pas de type de colonne sous-jacent).
Tooltip
Texte optionnel de l’infobulle de l’en-tête.
Visible
Optionnel. false supprime la colonne de la table rendue ET supprime ses DependsOn entrées de la projection serveur. Par défaut, .true
ChildContent
Réception GridTemplateColumnContextdu modèle par cellule requis . Lisez la ligne via ctx.Row.PrimaryRecord (et dans une sous-grille, le parent via ctx.Row.ParentRecord) ; utilisez ctx.DependsOnMetadata[name] pour les métadonnées par colonne lorsque le moteur de rendu en a besoin.
EditChildContent
Modèle optionnel de mode d’édition réceptionnant GridTemplateColumnEditContext. Invoqué au lieu de ChildContent lorsque la grille est en mode édition en ligne et que la ligne est mutable. Même contexte de ligne que le modèle de lecture plus editCtx.SetValue(name, value) pour les écritures impératives. Voir les modèles d’édition en ligne ci-dessus pour les deux patrons d’auteur.
Paramètre:Id
Description:Identifiant stable optionnel. Lorsqu’il est omis, le framework en génère automatiquement un en fonction __template-{index} de la position de la colonne du modèle parmi les autres modèles. Transmets un id explicite quand tes déclarations peuvent être réordonnées dynamiquement.
Paramètre:Title
Description:Étiquette d’en-tête requise. Aucune métadonnée de colonne limitée à partir de laquelle dériver un défaut.
Paramètre:DependsOn
Description:Optionnel. La colonne logique Dataverse nomme le moteur de rendu lu à partir de la ligne. Le framework fusionne ces données dans la projection FetchXML afin que les données atterrissent dans ctx.Row.PrimaryRecord. Omis/vide pour les cellules décoratives.
Paramètre:SortBy
Description:Optionnel. Nom logique de colonne à trier lorsque l’en-tête est cliqué. Omis = tête n’est pas triable.
Paramètre:Width
Description:Longueur CSS optionnelle pour la largeur de la colonne.
Paramètre:Align
Description:Option optionnelle pour l’alignement horizontal. Par défaut ( Align.Start pas de type par défaut basé sur les métadonnées puisqu’il n’y a pas de type de colonne sous-jacent).
Paramètre:Tooltip
Description:Texte optionnel de l’infobulle de l’en-tête.
Paramètre:Visible
Description:Optionnel. false supprime la colonne de la table rendue ET supprime ses DependsOn entrées de la projection serveur. Par défaut, .true
Paramètre:ChildContent
Description:Réception GridTemplateColumnContextdu modèle par cellule requis . Lisez la ligne via ctx.Row.PrimaryRecord (et dans une sous-grille, le parent via ctx.Row.ParentRecord) ; utilisez ctx.DependsOnMetadata[name] pour les métadonnées par colonne lorsque le moteur de rendu en a besoin.
Paramètre:EditChildContent
Description:Modèle optionnel de mode d’édition réceptionnant GridTemplateColumnEditContext. Invoqué au lieu de ChildContent lorsque la grille est en mode édition en ligne et que la ligne est mutable. Même contexte de ligne que le modèle de lecture plus editCtx.SetValue(name, value) pour les écritures impératives. Voir les modèles d’édition en ligne ci-dessus pour les deux patrons d’auteur.
Apply commence par un filtre sur les colonnes suivantes :
Email Téléphone
Apply commence par un filtre sur les colonnes suivantes :
Email Téléphone
Utilise des comparaisons de nombres sur les colonnes suivantes :