evento
Campeonato Mundial do Power BI DataViz
14/02, 16 - 31/03, 16
Com 4 chances de participar, você pode ganhar um pacote de conferência e chegar ao LIVE Grand Finale em Las Vegas
Mais informaçõesEste browser já não é suportado.
Atualize para o Microsoft Edge para tirar partido das mais recentes funcionalidades, atualizações de segurança e de suporte técnico.
QuickGrid
Nota
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.
Importante
Estas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.
Para a versão atual, consulte a versão .NET 9 deste artigo.
O componente QuickGrid
é um componente Razor para exibir dados de forma rápida e eficiente em forma de tabela.
QuickGrid fornece um componente de grade de dados simples e conveniente para cenários comuns de renderização de grade e serve como uma arquitetura de referência e linha de base de desempenho para a criação de componentes de grade de dados.
QuickGrid é altamente otimizado e usa técnicas avançadas para alcançar um desempenho de renderização ideal.
Adicione uma referência de pacote para o pacote Microsoft.AspNetCore.Components.QuickGrid
.
Nota
Para obter orientação sobre como adicionar pacotes a aplicativos .NET, consulte os artigos em Instalar e gerenciar pacotes em Fluxo de trabalho de consumo de pacotes (documentação do NuGet). Confirme as versões corretas do pacote em NuGet.org.
Para várias demonstrações QuickGrid, veja o QuickGrid para a aplicação de exemplo Blazor. O site de demonstração está hospedado nas páginas do GitHub. O site carrega rapidamente graças à pré-renderização estática usando o projeto BlazorWasmPrerendering.Build
GitHub mantido pela comunidade.
Para implementar um componente QuickGrid
:
QuickGrid
na marcação Razor (<QuickGrid>...</QuickGrid>
).IQueryable<TGridItem>
anulável , onde TGridItem
é o tipo de dados representado por cada linha na grade.class
da tabela renderizada.default
). Isso afeta quais regras de estilo correspondem à tabela.@key
em cada linha renderizada. Normalmente, isso é usado para especificar um identificador exclusivo, como um valor de chave primária, para cada item de dados. Isso permite que a grade preserve a associação entre elementos de linha e itens de dados com base em seus identificadores exclusivos, mesmo quando as instâncias TGridItem
são substituídas por novas cópias (por exemplo, após uma nova consulta no armazenamento de dados subjacente). Se não estiver definido, a instância @key
é a TGridItem
.TGridItem
a um modelo PaginationState, fazendo com que a grade busque e renderize apenas a página atual de dados. Isso normalmente é usado em conjunto com um componente Paginator ou alguma outra lógica de interface do usuário que exibe e atualiza a instância de PaginationState fornecida.TGridItem
colunas cujas células exibem valores: TProp
implemente IFormattable.true
.QuickGrid
na marcação Razor (<QuickGrid>...</QuickGrid>
).IQueryable<TGridItem>
anulável , onde TGridItem
é o tipo de dados representado por cada linha na grade.class
da tabela renderizada.default
). Isso afeta quais regras de estilo correspondem à tabela.@key
em cada linha renderizada. Normalmente, isso é usado para especificar um identificador exclusivo, como um valor de chave primária, para cada item de dados. Isso permite que a grade preserve a associação entre elementos de linha e itens de dados com base em seus identificadores exclusivos, mesmo quando as instâncias TGridItem
são substituídas por novas cópias (por exemplo, após uma nova consulta no armazenamento de dados subjacente). Se não estiver definido, a instância @key
é a TGridItem
.TGridItem
a um modelo PaginationState, fazendo com que a grade busque e renderize apenas a página atual de dados. Isso normalmente é usado em conjunto com um componente Paginator ou alguma outra lógica de interface do usuário que exibe e atualiza a instância de PaginationState fornecida.TGridItem
colunas cujas células exibem valores: TProp
implemente IFormattable.true
.Por exemplo, adicione o seguinte componente para renderizar uma grade.
Para Blazor Web Apps, o componente QuickGrid
deve adotar um modo de renderização interativo para habilitar recursos interativos, como paginação e classificação.
PromotionGrid.razor
:
@page "/promotion-grid"
@using Microsoft.AspNetCore.Components.QuickGrid
<PageTitle>Promotion Grid</PageTitle>
<h1>Promotion Grid Example</h1>
<QuickGrid Items="people">
<PropertyColumn Property="@(p => p.PersonId)" Sortable="true" />
<PropertyColumn Property="@(p => p.Name)" Sortable="true" />
<PropertyColumn Property="@(p => p.PromotionDate)" Format="yyyy-MM-dd" Sortable="true" />
</QuickGrid>
@code {
private record Person(int PersonId, string Name, DateOnly PromotionDate);
private IQueryable<Person> people = new[]
{
new Person(10895, "Jean Martin", new DateOnly(1985, 3, 16)),
new Person(10944, "António Langa", new DateOnly(1991, 12, 1)),
new Person(11203, "Julie Smith", new DateOnly(1958, 10, 10)),
new Person(11205, "Nur Sari", new DateOnly(1922, 4, 27)),
new Person(11898, "Jose Hernandez", new DateOnly(2011, 5, 3)),
new Person(12130, "Kenji Sato", new DateOnly(2004, 1, 9)),
}.AsQueryable();
}
@page "/promotion-grid"
@using Microsoft.AspNetCore.Components.QuickGrid
<PageTitle>Promotion Grid</PageTitle>
<h1>Promotion Grid Example</h1>
<QuickGrid Items="people">
<PropertyColumn Property="@(p => p.PersonId)" Sortable="true" />
<PropertyColumn Property="@(p => p.Name)" Sortable="true" />
<PropertyColumn Property="@(p => p.PromotionDate)" Format="yyyy-MM-dd" Sortable="true" />
</QuickGrid>
@code {
private record Person(int PersonId, string Name, DateOnly PromotionDate);
private IQueryable<Person> people = new[]
{
new Person(10895, "Jean Martin", new DateOnly(1985, 3, 16)),
new Person(10944, "António Langa", new DateOnly(1991, 12, 1)),
new Person(11203, "Julie Smith", new DateOnly(1958, 10, 10)),
new Person(11205, "Nur Sari", new DateOnly(1922, 4, 27)),
new Person(11898, "Jose Hernandez", new DateOnly(2011, 5, 3)),
new Person(12130, "Kenji Sato", new DateOnly(2004, 1, 9)),
}.AsQueryable();
}
Aceda ao componente num browser no caminho relativo /promotion-grid
.
Atualmente, não há planos para expandir o QuickGrid com funcionalidades que as grelhas comerciais completas tendem a oferecer, como por exemplo, linhas hierárquicas, colunas que podem ser arrastadas para reordenar ou seleções de intervalo tipo Excel. Se você precisar de recursos avançados que não deseja desenvolver por conta própria, continue usando grades de terceiros.
O componente QuickGrid
pode classificar itens por colunas. No Blazor Web Apps, a classificação requer que o componente adote um modo de renderização interativo .
Adicione Sortable="true"
(Sortable) à tag PropertyColumn<TGridItem,TProp>:
<PropertyColumn Property="..." Sortable="true" />
No aplicativo em execução, classifique a coluna QuickGrid selecionando o título da coluna renderizada.
O componente QuickGrid
pode paginar dados da fonte de dados. Em Blazor Web Apps, a paginação requer que o componente adote um modo de renderização interativo.
Adicione uma instância PaginationState ao bloco @code
do componente. Defina o ItemsPerPage para o número de itens a serem exibidos por página. No exemplo a seguir, a instância é nomeada pagination
e dez itens por página são definidos:
PaginationState pagination = new PaginationState { ItemsPerPage = 10 };
Defina a propriedade QuickGrid
do componente Pagination como pagination
:
<QuickGrid Items="..." Pagination="pagination">
Para fornecer uma interface do usuário para paginação, adicione um componente Paginator
acima ou abaixo do componente QuickGrid
. Defina o Paginator.State para pagination
:
<Paginator State="pagination" />
No aplicativo em execução, percorra os itens usando um componente Paginator
renderizado.
QuickGrid renderiza linhas vazias adicionais para preencher a página final de dados quando usado com um componente Paginator
. No .NET 9 ou posterior, células de dados vazias (<td></td>
) são adicionadas às linhas vazias. As linhas vazias destinam-se a facilitar a renderização do QuickGrid com altura e estilo de linha estáveis em todas as páginas.
Aplique estilos às linhas usando isolamento CSS, o que pode incluir estilizar linhas vazias para QuickGrid
componentes que paginam dados com um componente Paginator
.
Envolva o componente QuickGrid
num elemento de bloco de invólucro, como por exemplo um <div>
:
+ <div>
<QuickGrid ...>
...
</QuickGrid>
+ </div>
Aplique um estilo de linha usando o ::deep
pseudo-elemento. No exemplo a seguir, a altura da linha é definida como 2em
, inclusive para linhas de dados vazias.
{COMPONENT}.razor.css
:
::deep tr {
height: 2em;
}
Como alternativa, use a seguinte abordagem de estilo CSS:
{COMPONENT}.razor.css
:
::deep tr:has(> td:not(:empty)) > td {
display: table-cell;
}
::deep td:empty {
display: none;
}
Para obter mais informações sobre como usar ::deep
pseudoelementos com isolamento CSS, consulte ASP.NET Core Blazor CSS isolation.
QuickGrid também suporta a passagem de atributos personalizados e classes de estilo (Class) para o elemento de tabela renderizada:
<QuickGrid Items="..." custom-attribute="value" Class="custom-class">
Aplique uma classe de folha de estilo a uma linha da grade com base no item de linha usando o parâmetro RowClass
.
No exemplo a seguir:
Person
. O registro Person
inclui uma propriedade FirstName
.GetRowCssClass
aplica os estilos de classe highlight-row
a qualquer linha em que o primeiro nome da pessoa seja "Julie
".<QuickGrid ... RowClass="GetRowCssClass">
...
</QuickGrid>
@code {
private record Person(int PersonId, string FirstName, string LastName);
private string GetRowCssClass(Person person) =>
person.FirstName == "Julie" ? "highlight-row" : null;
}
Use o padrão de fábrica para resolver um contexto de banco de dados EF Core que fornece dados para um componente QuickGrid
. Para obter mais informações sobre por que o padrão de fábrica é recomendado, consulte ASP.NET Core Blazor com o Entity Framework Core (EF Core).
Uma fábrica de contexto de banco de dados (IDbContextFactory<TContext>) é injetada no componente com a diretiva @inject
. A abordagem de fábrica requer o descarte do contexto do banco de dados, de modo que o componente implementa a interface IAsyncDisposable com a diretiva @implements
. O fornecedor de itens para o componente QuickGrid
é um DbSet<T>
obtido do contexto de base de dados criado (CreateDbContext) da fábrica de contexto de base de dados injetada.
QuickGrid reconhece instâncias de IQueryable fornecidas pelo EF e sabe como resolver consultas de forma assíncrona para obter eficiência.
Adicione uma referência de pacote para o pacote NuGet Microsoft.AspNetCore.Components.QuickGrid.EntityFrameworkAdapter
.
Nota
Para obter orientação sobre como adicionar pacotes a aplicativos .NET, consulte os artigos em Instalar e gerenciar pacotes em Fluxo de trabalho de consumo de pacotes (documentação do NuGet). Confirme as versões corretas do pacote em NuGet.org.
Chame AddQuickGridEntityFrameworkAdapter na coleção de serviços dentro do ficheiro Program
para registar uma implementação de IAsyncQueryExecutor compatível com EF.
builder.Services.AddQuickGridEntityFrameworkAdapter();
O exemplo a seguir usa um ExampleTable
DbSet<TEntity> (tabela) de um contexto de banco de dados AppDbContext
(context
) como a fonte de dados para um componente QuickGrid
:
@using Microsoft.AspNetCore.Components.QuickGrid
@using Microsoft.EntityFrameworkCore
@implements IAsyncDisposable
@inject IDbContextFactory<AppDbContext> DbFactory
...
<QuickGrid ... Items="context.ExampleTable" ...>
...
</QuickGrid>
@code {
private AppDbContext context = default!;
protected override void OnInitialized()
{
context = DbFactory.CreateDbContext();
}
public async ValueTask DisposeAsync() => await context.DisposeAsync();
}
No bloco de código (@code
) do exemplo anterior:
context
contém o contexto do banco de dados, digitado como um AppDbContext
.OnInitialized
atribui um novo contexto de banco de dados (CreateDbContext) ao campo context
da fábrica injetada (DbFactory
).DisposeAsync
assíncrono descarta o contexto do banco de dados quando o componente é descartado.Você também pode usar qualquer operador LINQ suportado pelo EF para filtrar os dados antes de passá-los para o parâmetro Items.
O exemplo a seguir filtra filmes por um título de filme inserido em uma caixa de pesquisa. O contexto do banco de dados é BlazorWebAppMoviesContext
e o modelo é Movie
. A propriedade Title
do filme é utilizada na operação de filtragem.
@using Microsoft.AspNetCore.Components.QuickGrid
@using Microsoft.EntityFrameworkCore
@implements IAsyncDisposable
@inject IDbContextFactory<BlazorWebAppMoviesContext> DbFactory
...
<p>
<input type="search" @bind="titleFilter" @bind:event="oninput" />
</p>
<QuickGrid ... Items="FilteredMovies" ...>
...
</QuickGrid>
@code {
private string titleFilter = string.Empty;
private BlazorWebAppMoviesContext context = default!;
protected override void OnInitialized()
{
context = DbFactory.CreateDbContext();
}
private IQueryable<Movie> FilteredMovies =>
context.Movie.Where(m => m.Title!.Contains(titleFilter));
public async ValueTask DisposeAsync() => await context.DisposeAsync();
}
Para obter um exemplo prático, consulte os seguintes recursos:
BlazorWebAppMovies
.Um título de coluna pode ser atribuído usando ColumnBase<TGridItem>.Title na tag do PropertyColumn<TGridItem,TProp>. No exemplo de filme a seguir, a coluna recebe o nome "Release Date
" para os dados de data de lançamento do filme.
<PropertyColumn Property="movie => movie.ReleaseDate" Title="Release Date" />
No entanto, gerir os títulos (nomes) das colunas a partir de propriedades de modelo associado geralmente é uma escolha melhor para a manutenção de uma aplicação. Um modelo pode controlar o nome de exibição de uma propriedade com o atributo [Display]
. No exemplo a seguir, o modelo especifica um nome de exibição de data de lançamento do filme de "Release Date
" para sua propriedade ReleaseDate
:
[Display(Name = "Release Date")]
public DateTime ReleaseDate { get; set; }
Para permitir que o componente QuickGrid
use a propriedade DisplayAttribute.Name, subclasse PropertyColumn<TGridItem,TProp>, no componente ou em uma classe separada. Chame o método GetName para retornar o valor DisplayAttribute.Name localizado caso um DisplayName não localizado (atributo[DisplayName]
) não possua o valor:
public class DisplayNameColumn<TGridItem, TProp> : PropertyColumn<TGridItem, TProp>
{
protected override void OnParametersSet()
{
if (Title is null && Property.Body is MemberExpression memberExpression)
{
var memberInfo = memberExpression.Member;
Title =
memberInfo.GetCustomAttribute<DisplayNameAttribute>().DisplayName ??
memberInfo.GetCustomAttribute<DisplayAttribute>().GetName() ??
memberInfo.Name;
}
base.OnParametersSet();
}
}
Utilize a subclasse no componente QuickGrid
. No exemplo a seguir, o DisplayNameColumn
anterior é usado. O nome "Release Date
" é fornecido pelo atributo [Display]
no modelo, portanto, não há necessidade de especificar uma Title:
<DisplayNameColumn Property="movie => movie.ReleaseDate" />
O atributo [DisplayName]
também é suportado:
[DisplayName("Release Date")]
public DateTime ReleaseDate { get; set; }
No entanto, o atributo [Display]
é recomendado porque disponibiliza propriedades adicionais. Por exemplo, o atributo [Display]
oferece a capacidade de atribuir um tipo de recurso para localização.
Em aplicativos Blazor WebAssembly, buscar dados de uma API da Web baseada em JSON em um servidor é um requisito comum. Para buscar apenas os dados necessários para a página/viewport de dados atual e aplicar regras de classificação ou filtragem no servidor, use o parâmetro ItemsProvider.
ItemsProvider também pode ser usado numa aplicação Blazor no lado do servidor se a aplicação precisar consultar um ponto de extremidade externo ou noutros casos em que os requisitos não são abrangidos por um IQueryable.
Forneça um callback correspondente ao tipo de delegado GridItemsProvider<TGridItem>, onde TGridItem
é o tipo de dados exibidos na grelha. O retorno de chamada recebe um parâmetro do tipo GridItemsProviderRequest<TGridItem>, que especifica o índice inicial, a contagem máxima de linhas e a ordem de classificação dos dados a serem retornados. Além de retornar os itens correspondentes, uma contagem total de itens (totalItemCount
) também é necessária para que a paginação e a virtualização funcionem corretamente.
O exemplo a seguir obtém dados da base de dados pública OpenFDA Food Enforcement.
O GridItemsProvider<TGridItem> converte o GridItemsProviderRequest<TGridItem> em uma consulta no banco de dados OpenFDA. Os parâmetros de consulta são convertidos para o formato de URL específico suportado pela API JSON externa. Só é possível realizar a classificação e filtragem por meio da classificação e filtragem suportadas pela API externa. O endpoint OpenFDA não suporta ordenação, portanto, nenhuma coluna está marcada como ordenável. No entanto, ele suporta ignorar registros (parâmetroskip
) e limitar o retorno de registros (parâmetrolimit
), para que o componente possa habilitar a virtualização e percorrer rapidamente dezenas de milhares de registros.
FoodRecalls.razor
:
@page "/food-recalls"
@inject HttpClient Http
@inject NavigationManager Navigation
<PageTitle>Food Recalls</PageTitle>
<h1>OpenFDA Food Recalls</h1>
<div class="grid" tabindex="-1">
<QuickGrid ItemsProvider="@foodRecallProvider" Virtualize="true">
<PropertyColumn Title="ID" Property="@(c => c.Event_Id)" />
<PropertyColumn Property="@(c => c.State)" />
<PropertyColumn Property="@(c => c.City)" />
<PropertyColumn Title="Company" Property="@(c => c.Recalling_Firm)" />
<PropertyColumn Property="@(c => c.Status)" />
</QuickGrid>
</div>
<p>Total: <strong>@numResults results found</strong></p>
@code {
private GridItemsProvider<FoodRecall>? foodRecallProvider;
private int numResults;
protected override async Task OnInitializedAsync()
{
foodRecallProvider = async req =>
{
var url = Navigation.GetUriWithQueryParameters(
"https://api.fda.gov/food/enforcement.json",
new Dictionary<string, object?>
{
{ "skip", req.StartIndex },
{ "limit", req.Count },
});
var response = await Http.GetFromJsonAsync<FoodRecallQueryResult>(
url, req.CancellationToken);
return GridItemsProviderResult.From(
items: response!.Results,
totalItemCount: response!.Meta.Results.Total);
};
numResults = (await Http.GetFromJsonAsync<FoodRecallQueryResult>(
"https://api.fda.gov/food/enforcement.json"))!.Meta.Results.Total;
}
}
Para obter mais informações sobre como chamar APIs da Web, consulte Chamar uma API da Web de um aplicativo ASP.NET Core Blazor.
O QuickGrid scaffolder estrutura os componentes Razor com QuickGrid a fim de mostrar dados de uma base de dados.
A ferramenta scaffolder gera páginas básicas de Criar, Consultar, Atualizar e Remover (CRUD) com base num modelo de dados do Entity Framework Core. Você pode criar um andaime em páginas individuais ou em todas as páginas CRUD. Selecione a classe de modelo e o DbContext
, criando opcionalmente um novo DbContext
se necessário.
Os componentes estruturados Razor são adicionados ao projeto numa pasta gerada com o nome da classe de modelo. O componente Index
gerado usa um componente QuickGrid
para exibir os dados. Personalize os componentes gerados conforme necessário e habilite a interatividade para aproveitar os recursos interativos, como de paginação, de classificação e filtragem.
Os componentes produzidos pelo scaffolder requerem renderização do lado do servidor (SSR), portanto, eles não são suportados quando executados no WebAssembly.
Clique com o botão direito do rato na pasta Components/Pages
e selecione Adicionar>Novo Item Scaffolded.
Com a caixa de diálogo Adicionar Novo Item de Andaime aberta em Instalada>Comum, selecione Componente, depois escolha Componentes usando o Entity Framework para CRUD. Selecione o botão Adicionar.
CRUD é um acrônimo para Create, Read, Update e Delete. O scaffolder produz componentes de criação, edição, exclusão, detalhes e índice para o aplicativo.
Complete a caixa de diálogo Adicionar componentes Razor usando o Entity Framework (CRUD):
Movie
, a pasta será automaticamente nomeada MoviePages
).Para obter um exemplo de uso do gerador de estrutura QuickGrid, consulte Criar uma aplicação de base de dados de filmes Blazor (Visão Geral).
Várias consultas EF Core simultâneas podem acionar o seguinte System.InvalidOperationException:
System.InvalidOperationException: Uma segunda operação foi iniciada nesta instância de contexto antes da conclusão de uma operação anterior. Isso geralmente é causado por threads diferentes usando simultaneamente a mesma instância de DbContext. Para obter mais informações sobre como evitar problemas de threading com DbContext, consulte https://go.microsoft.com/fwlink/?linkid=2097913.
Este cenário está programado para melhorias em uma próxima versão do ASP.NET Core. Para obter mais informações, consulte [Blazor] Melhorar a experiência com QuickGrid e EF Core (dotnet/aspnetcore
#58716).
Enquanto isso, podes abordar o problema usando um ItemsProvider com um token de cancelamento. O token de cancelamento impede consultas simultâneas cancelando a solicitação anterior quando uma nova solicitação é emitida.
Considere o exemplo a seguir, que se baseia no componente de Index
banco de dados de filmes para o tutorial Criar um aplicativo de banco de dados de filmes Blazor (Visão geral). A versão mais simples estruturada no aplicativo pode ser vista no exemplo de aplicativo do artigo. O componente Index
estruturado na aplicação é substituído pelo componente seguinte.
Components/Pages/MoviePages/Index.razor
:
@page "/movies"
@rendermode InteractiveServer
@using Microsoft.EntityFrameworkCore
@using Microsoft.AspNetCore.Components.QuickGrid
@using BlazorWebAppMovies.Models
@using BlazorWebAppMovies.Data
@inject IDbContextFactory<BlazorWebAppMovies.Data.BlazorWebAppMoviesContext> DbFactory
<PageTitle>Index</PageTitle>
<h1>Index</h1>
<div>
<input type="search" @bind="titleFilter" @bind:event="oninput" />
</div>
<p>
<a href="movies/create">Create New</a>
</p>
<div>
<QuickGrid Class="table" TGridItem="Movie" ItemsProvider="GetMovies"
ItemKey="(x => x.Id)" Pagination="pagination">
<PropertyColumn Property="movie => movie.Title" Sortable="true" />
<PropertyColumn Property="movie => movie.ReleaseDate" Title="Release Date" />
<PropertyColumn Property="movie => movie.Genre" />
<PropertyColumn Property="movie => movie.Price" />
<PropertyColumn Property="movie => movie.Rating" />
<TemplateColumn Context="movie">
<a href="@($"movies/edit?id={movie.Id}")">Edit</a> |
<a href="@($"movies/details?id={movie.Id}")">Details</a> |
<a href="@($"movies/delete?id={movie.Id}")">Delete</a>
</TemplateColumn>
</QuickGrid>
</div>
<Paginator State="pagination" />
@code {
private BlazorWebAppMoviesContext context = default!;
private PaginationState pagination = new PaginationState { ItemsPerPage = 5 };
private string titleFilter = string.Empty;
public async ValueTask<GridItemsProviderResult<Movie>> GetMovies(GridItemsProviderRequest<Movie> request)
{
using var context = DbFactory.CreateDbContext();
var totalCount = await context.Movie.CountAsync(request.CancellationToken);
IQueryable<Movie> query = context.Movie.OrderBy(x => x.Id);
query = request.ApplySorting(query).Skip(request.StartIndex);
if (request.Count.HasValue)
{
query = query.Take(request.Count.Value);
}
var items = await query.ToArrayAsync(request.CancellationToken);
var result = new GridItemsProviderResult<Movie>
{
Items = items,
TotalItemCount = totalCount
};
return result;
}
}
Comentários do ASP.NET Core
O ASP.NET Core é um projeto código aberto. Selecione um link para fornecer comentários:
evento
Campeonato Mundial do Power BI DataViz
14/02, 16 - 31/03, 16
Com 4 chances de participar, você pode ganhar um pacote de conferência e chegar ao LIVE Grand Finale em Las Vegas
Mais informaçõesFormação
Módulo
Interaja com dados em aplicativos Web Blazor - Training
Saiba como criar uma interface gráfica do usuário em um aplicativo Web Blazor criando e montando componentes Blazor. Aceda aos dados e partilhe-os para apresentação em várias páginas da sua aplicação.