Taille de la page
Nom complet | |
|---|---|
| Aucun document trouvé. |
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.
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.
Taille de la page
Nom complet | |
|---|---|
| Aucun document trouvé. |
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).
<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>Remplacez, non additif
Déclarer un
GridColumnenfant 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 viaCustomViewDefinitions.
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.À 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.
<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>À 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.
{/* 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><!-- 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>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.
<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><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>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.
<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><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>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.
<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><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
cellRendererlaparentRecordpropulsion de '(CellRendererProps.parentRecord).
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.
<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><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 ChildContentOn personnalise toujours une colonne liée — trier, éditer dispatch et l’en-tête de colonne tout clé à partir de son uniqueColumnName. AtteignezGridTemplateColumnuniquement 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.
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.
{/* 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)}
/>
)}
/><!-- 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>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.
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.
<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>
)}
/><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>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.
<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 });
}}
/>
);
}}
/><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
EditChildContentautomatiquement avec lesEditContextValidatorlignes et participaient à la porte de validation avant la sauvegarde du framework. LeeditCtx.SetValuechemin 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 leValueChangedrappel avant d’appelerSetValue, ou revenez au modèle d’éditeur à insertion directe quand c’est possible.
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.
<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>Paramètre | Description |
|---|---|
ColumnName | 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. |
ColumnNameTableNameTableName lorsqu’il est omis.WidthAlignAlign.Start, Align.Center, Align.End). Il revient au par défaut basé sur les métadonnées lorsqu’il est omis.TitleHeaderTooltipTooltip sur TemplateColumn.)Visiblefalse 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, .trueIsDefaultSortColumn / InitialSortDirectionChildContentGridRowContext. 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 | 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. |
Id__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.TitleDependsOnctx.Row.PrimaryRecord. Omis/vide pour les cellules décoratives.SortByWidthAlignAlign.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).TooltipVisiblefalse supprime la colonne de la table rendue ET supprime ses DependsOn entrées de la projection serveur. Par défaut, .trueChildContentGridTemplateColumnContextdu 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.EditChildContentGridTemplateColumnEditContext. 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.