Rendere ein Balkendiagramm, indem du es auf der FluentUIChart Komponente einsetztType="bar". Übergebe eine Liste von Kategorielabels und ein oder mehrere ChartDataset Objekte, um die Balken zu definieren. FluentUIChart ist ein thema-bewusster Wrapper um die zugrundeliegende Chart Komponente, der auf Chart.js aufgebaut ist.
Ein Balkendiagramm mit drei ungefärbten Datensätzen – Farben werden aus der aktiven Fluent-Palette ausgefüllt. Klicken Sie auf eine beliebige Leiste, um die Event-Payload zu sehen, und schalten Sie das Seitenthema zwischen Licht und Dunkel um, um das Diagramm neu gestaltet zu sehen.
import { ChartType, type ChartDataset } from '@powerportalspro/react-charts';
import { FluentUIChart } from '@powerportalspro/react-fluent';
const LABELS = ['Jan', 'Feb', 'Mar'];
const DATASETS: ChartDataset[] = [
{
label: 'Sales',
data: [{ value: 65 }, { value: 59 }, { value: 80 }],
},
{
label: 'Returns',
data: [{ value: 12 }, { value: 19 }, { value: 8 }],
},
];
export function MyChart() {
return <FluentUIChart type={ChartType.Bar} labels={LABELS} datasets={DATASETS} />;
}<FluentUIChart Type="ChartType.Bar"
Labels="_labels"
Datasets="_datasets" />
@code {
private List<string> _labels = new() { "Jan", "Feb", "Mar" };
private List<ChartDataset> _datasets = new()
{
new ChartDataset
{
Label = "Sales",
Data = new List<DataPoint>
{
new DataPoint(65), new DataPoint(59), new DataPoint(80),
},
},
new ChartDataset
{
Label = "Returns",
Data = new List<DataPoint>
{
new DataPoint(12), new DataPoint(19), new DataPoint(8),
},
},
};
}Chart.js rendert in HTML <canvas>, sodass CSS nicht in Balken, Achsenbeschriftungen oder Rasterlinien gelangen kann – es sind gerasterte Pixel. FluentUIChart Umgeht dies, indem man die aufgelösten benutzerdefinierten CSS-Eigenschaften zur Renderzeit liest und die Werte in die Chart.js Optionen colorals , scale.ticks.color, und scale.grid.colorschiebt. Es abonniert ThemeService.ThemeChanged die Palette und legt die Palette neu an, wann immer sich das Thema ändert.
Datensätze, die verlassen BackgroundColor oder BorderColor null sind, werden automatisch aus einer von Fluent abgeleiteten Serienpalette ausgefüllt, beginnend mit der aktuellen Akzentfarbe. Datensätze, die explizite Farben liefern, werden unverändert durchgereicht.
Abonnieren Sie OnElementClick , um benachrichtigt zu werden, wenn der Nutzer auf eine Leiste (oder ein beliebiges gerendertes Element) klickt. Der Callback erhält eine ChartClickEventArgs mit dem Datensatzindex, dem Datenindex, dem Label, dem Wert, dem Datensatzlabel und der ursprünglichen IDataPoint Instanz. Unterklasse DataPoint , um anruferdefinierten Kontext (Datensatz-ID, Region, Kategorie usw.) und Musterabgleich mit deiner Unterklasse im Click-Handler zu verbinden, um sie wiederherzustellen. Klicks auf den Diagramm-Hintergrund werden ignoriert.
import {
ChartType,
type BaseDataPoint,
type ChartClickEventArgs,
type ChartDataset,
} from '@powerportalspro/react-charts';
import { FluentUIChart } from '@powerportalspro/react-fluent';
// BaseDataPoint erweitern, um aufruferdefinierten Kontext (Region, Datensatz-ID),
// Kategorie usw.). Parametrisierung <FluentUIChart> mit diesem Typ unten</FluentUIChart>
// Lässt es zu args.dataPoint weitergeleitet – keine Casts erforderlich.
interface SalesDataPoint extends BaseDataPoint {
region: string;
}
const DATASETS: ChartDataset<SalesDataPoint>[] = [/* ... */];
function onBarClicked(args: ChartClickEventArgs<SalesDataPoint>) {
const region = args.dataPoint?.region ?? '';
console.log(`${args.label}: ${args.value} (${region})`);
}
export function MyChart() {
return (
<FluentUIChart<SalesDataPoint>
type={ChartType.Bar}
labels={LABELS}
datasets={DATASETS}
onElementClick={onBarClicked}
/>
);
}<FluentUIChart Type="ChartType.Bar"
Labels="_labels"
Datasets="_datasets"
OnElementClick="OnBarClicked" />
@code {
private class SalesDataPoint : DataPoint
{
public SalesDataPoint(double value) : base(value) { }
public string Region { get; set; } = string.Empty;
}
private void OnBarClicked(ChartClickEventArgs args)
{
// Pattern-Match-Args. DataPoint, um jeglichen vom Anrufer definierten Kontext wiederherzustellen.
if (args.DataPoint is SalesDataPoint sdp)
{
Console.WriteLine($"{args.Label}: {sdp.Value} ({sdp.Region})");
}
}
}Stellen Sie ein, Title dass eine Überschrift über der Tabelle angezeigt wird. Der Titel wird von Chart.js innerhalb der Leinwand gerendert und verwendet die Textfarbe des aktuellen Themas.
<DataverseChart dataSource={source}
type={ChartType.Bar}
title="Einnahmen nach Jahr" /><DataverseChart Source="_source"
Type="ChartType.Bar"
Title="Einnahmen nach Jahr" />Setzen Sie die Datensätze so ein, Stacked="true" dass sie übereinander stapeln, anstatt nebeneinander. Dies ist nützlich für Balkendiagramme und Liniendiagramme mit mehreren Serien, bei denen die Gesamtsumme über alle Reihen hinweg sinnvoll ist (z. B. Gesamtumsatz = gewonnen + verloren).
<DataverseChart dataSource={source}
type={ChartType.Bar}
stacked /><DataverseChart Source="_source"
Type="ChartType.Bar"
Stacked="true" />Stellen Sie ein, LegendPosition um zu steuern, wo die Legende erscheint: "top" (Standard), "bottom", , "left""right", , oder "hidden" um sie vollständig auszublenden.
// Position: Oben (Standard), Unten, Links, Rechts
<DataverseChart dataSource={source}
legendPosition={ChartLegendPosition.Bottom} />
// Verstecke die Legende vollständig
<DataverseChart dataSource={source}
legendPosition={ChartLegendPosition.Hidden} /><!-- Position: Oben (Standard), Unten, Links, Rechts -->
<DataverseChart Source="_source"
LegendPosition="ChartLegendPosition.Bottom" />
<!-- Verstecke die Legende vollständig -->
<DataverseChart Source="_source"
LegendPosition="ChartLegendPosition.Hidden" />Ich nutze AggregateDataverseChartDataSource es, um ein Diagramm aus Dataverse einzuspeisen, ohne rohes FetchXML zu schreiben. Setze TableName, GroupByColumn, AggregateColumn, und Aggregate. Optional füge ein für SeriesColumn Mehrserien, ein für GroupByDateGrouping Datums-Bucketing, ein Zusammenführen ViewId der Filterbedingungen einer gespeicherten Ansicht oder ein FilterXml Fragment für Inline-Bedingungen hinzu.
import {
AggregateDataverseChartDataSource,
AggregateType,
ChartDateGrouping,
ChartType,
type ChartClickEventArgs,
} from '@powerportalspro/react-charts';
import { DataverseChart } from '@powerportalspro/react-fluent';
import { useMemo } from 'react';
export function MyChart() {
// useMemo hält die Identität der Quelle stabil, sodass das Diagramm das nicht tut
// Neu-Abruf bei jedem Rendering – Änderungen an der Konfiguration werden beim Mount angewendet.
const source = useMemo(
() =>
new AggregateDataverseChartDataSource({
tableName: 'opportunity',
groupByColumn: 'actualclosedate',
groupByDateGrouping: ChartDateGrouping.Year,
aggregateColumn: 'estimatedvalue',
aggregate: AggregateType.Sum,
seriesColumn: 'statecode',
filterXml:
"<filter><condition attribute='statecode' operator='ne' value='0' /></filter>",
}),
[],
);
const onBarClicked = (args: ChartClickEventArgs) => {
// args.datasetLabel, args.label, args.value, args.dataPoint
};
return (
<DataverseChart
dataSource={source}
type={ChartType.Bar}
title="Estimated Revenue by Year (Stacked)"
stacked
yAxisPrefix="$"
onElementClick={onBarClicked}
/>
);
}<DataverseChart Source="_source"
Type="ChartType.Bar"
Title="Estimated Revenue by Year (Stacked)"
Stacked="true"
YAxisPrefix="$"
OnElementClick="OnBarClicked" />
@code {
private readonly AggregateDataverseChartDataSource _source = new()
{
TableName = "opportunity",
GroupByColumn = "actualclosedate",
GroupByDateGrouping = ChartDateGrouping.Year,
AggregateColumn = "estimatedvalue",
Aggregate = AggregateType.Sum,
SeriesColumn = "statecode",
FilterXml = "<filter><condition attribute='statecode' operator='ne' value='0' /></filter>",
};
private void OnBarClicked(ChartClickEventArgs args)
{
// ARGS. DatasetLabel, Args. Label, Args. Value, Args. DataPoint
}
}Geschätzte Chancenumsätze nach Jahr, aufgeteilt nach Status (Gewonnen vs. Verloren) und gestapelt – aus Dataverse AggregateDataverseChartDataSourceüber geladen. Klicken Sie auf eine Leiste, um das Jahr, den Status und den Umsatz zu sehen.
Weiter, ViewIds DefaultViewId DataverseChart um ein Ansichts-Dropdown-Menü über der Grafik anzuzeigen. Wenn der Benutzer die Ansicht wechselt, werden die Filterbedingungen der ausgewählten Ansicht in die aggregierte Abfrage eingegliedert und das Diagramm wird neu geladen. Die ViewId Quelle ist nicht direkt eingestellt – DataverseChart sie verwaltet sie. Die Ansicht bestimmt , welche Datensätze enthalten sind; Die aggregierte Konfiguration bestimmt, wie sie gruppiert und zusammengefasst werden.
import {
AggregateDataverseChartDataSource,
AggregateType,
ChartDateGrouping,
ChartType,
} from '@powerportalspro/react-charts';
import { DataverseChart } from '@powerportalspro/react-fluent';
import { useMemo } from 'react';
const VIEW_IDS = [
'...', // Gewonnene Chancen
'...', // Alle Möglichkeiten
];
const DEFAULT_VIEW_ID = VIEW_IDS[0];
export function MyChart() {
const source = useMemo(
() =>
new AggregateDataverseChartDataSource({
tableName: 'opportunity',
groupByColumn: 'actualclosedate',
groupByDateGrouping: ChartDateGrouping.MonthAndYear,
aggregateColumn: 'estimatedvalue',
aggregate: AggregateType.Sum,
}),
[],
);
return (
<DataverseChart
dataSource={source}
type={ChartType.Bar}
viewIds={VIEW_IDS}
defaultViewId={DEFAULT_VIEW_ID}
yAxisPrefix="$"
/>
);
}<DataverseChart Source="_source"
Type="ChartType.Bar"
ViewIds="_viewIds"
DefaultViewId="@_defaultViewId"
YAxisPrefix="$" />
@code {
private static readonly List<Guid> _viewIds = new()
{
new Guid("..."), // Gewonnene Chancen
new Guid("..."), // Alle Möglichkeiten
};
private static readonly Guid _defaultViewId = _viewIds[0];
private readonly AggregateDataverseChartDataSource _source = new()
{
TableName = "opportunity",
GroupByColumn = "actualclosedate",
GroupByDateGrouping = ChartDateGrouping.MonthAndYear,
AggregateColumn = "estimatedvalue",
Aggregate = AggregateType.Sum,
};
}Geschätzter Umsatz nach Monat mit einem Aufrufauswahl-Dropdown. Wechsle zwischen den Ansichten, um zu sehen, wie das Diagramm mit verschiedenen Filterkriterien neu geladen wird.
Setze GroupByLinkedEntity (oder SeriesLinkedEntity) auf Gruppierung oder Spaltung durch eine Spalte in einer zugehörigen Tabelle. Der Builder erstellt einen <link-entity> Join und platziert das Attribut groupby darin. Unterstützt unbegrenztes Nesting ChartLinkedEntity.LinkedEntity für Multi-Hop-Joins.
import {
AggregateDataverseChartDataSource,
AggregateType,
ChartType,
} from '@powerportalspro/react-charts';
import { DataverseChart } from '@powerportalspro/react-fluent';
import { useMemo } from 'react';
export function MyChart() {
const source = useMemo(
() =>
new AggregateDataverseChartDataSource({
tableName: 'opportunity',
groupByColumn: 'industrycode',
groupByLinkedEntity: {
tableName: 'account',
from: 'accountid',
to: 'customerid',
},
aggregateColumn: 'estimatedvalue',
aggregate: AggregateType.Sum,
}),
[],
);
return (
<DataverseChart
dataSource={source}
type={ChartType.Bar}
title="Einnahmen nach Industrie"
yAxisPrefix="$"
/>
);
}<DataverseChart Source="_source"
Type="ChartType.Bar"
Title="Einnahmen nach Industrie"
YAxisPrefix="$" />
@code {
private readonly AggregateDataverseChartDataSource _source = new()
{
TableName = "opportunity",
GroupByColumn = "industrycode",
GroupByLinkedEntity = new ChartLinkedEntity
{
TableName = "account",
From = "accountid",
To = "customerid",
},
AggregateColumn = "estimatedvalue",
Aggregate = AggregateType.Sum,
};
}Die obige Konfiguration erzeugt folgendes FetchXML:
<fetch aggregate="true">
<entity name="opportunity">
<attribute name="estimatedvalue" alias="estimatedvalue" aggregate="sum" />
<link-entity name="account" from="accountid" to="customerid" link-type="inner">
<attribute name="industrycode" alias="industrycode" groupby="true" />
<order alias="industrycode" />
</link-entity>
</entity>
</fetch>
Gesamtgeschätzte Opportunity Revenue, gruppiert nach der Branche des Mutterkontos – die Spalte industrycode befindet sich auf der account Tabelle, verbunden über customerid.
Siehe auch
Chart API Reference — vollständige Dokumentation für alle Chartklassen, Enums und Datenquellen.