Visão geral e configuração do Blazor Grid

    O componente Grade de Dados Blazor é usado para exibir grandes volumes de dados. Grades modernas e mais complexas garantem uma experiência do usuário suave e trazem uma variedade de recursos para manipular dados tabulares. Há uma API intuitiva, temas, branding, filtragem, classificação, seleção de dados, filtragem no estilo Excel e muito mais.

    A Tabela de Dados/Grade de Dados Ignite UI for Blazor é um componente de grade de Blazor tabular que permite vincular e exibir rapidamente seus dados com pouca codificação ou configuração. Os recursos da grade de dados Blazor em nossa caixa de ferramentas incluem filtragem, classificação, modelos, seleção de linhas, agrupamento de linhas, fixação de linhas, colunas móveis, virtualização, Master-Detail e muito mais.

    As tabelas Blazor são otimizadas para velocidade e desempenho, com a capacidade de lidar com milhões de linhas e colunas e atualizações em tempo real em um instante, tornando o Ignite UI for Blazor Data Grid o melhor Data Grid Blazor do mercado.

    Blazor Grade de Dados

    Blazor Data Grid Example

    Neste exemplo de Ignite UI for Blazor Grid, você pode ver como os usuários podem fazer filtragem básica e no estilo do Excel, classificação de dados em tempo real e usar resumos de grade, bem como modelos de célula. A demonstração também inclui um conjunto de paginação para exibir 10 itens por página.

    Getting Started with Blazor Data Grid

    Dependencies

    To get started with the Blazor Data Grid, first you need to install the IgniteUI.Blazor package.

    Consulte estes tópicos sobre como adicionar o pacote IgniteUI.Blazor:

    Você também precisa incluir o seguinte link CSS no arquivo index.html do seu aplicativo para fornecer os estilos necessários para a grade:

    <link href="_content/IgniteUI.Blazor/themes/grid/light/bootstrap.css" rel="stylesheet" />
    

    Depois, você pode começar a implementar o controle adicionando os seguintes namespaces:

    @using IgniteUI.Blazor.Controls
    

    Component Modules

    The DataGrid requires the following modules:

    // in Program.cs file
    
    builder.Services.AddIgniteUIBlazor(typeof(IgbGridModule));
    

    Usage

    Agora que temos os pacotes de grade importados, vamos começar com a configuração básica e vincular aos dados locais:

    <IgbGrid Id="grid1" Data="data" AutoGenerate="true"></IgbGrid>
    

    The Id property is a string value and is the unique identifier of the grid which will be auto-generated if not provided, while data binds the grid, in this case to local data.

    The AutoGenerate property tells the grid to auto generate the grid's IgbColumn components based on the data source fields. It will also try to deduce the appropriate data type for the column if possible. Otherwise, the developer needs to explicitly define the columns and the mapping to the data source fields.

    Editable Blazor Grid

    Cada operação para edição de grade inclui operações em lote, o que significa que a API oferece a opção de agrupar edições em uma única chamada de servidor, ou você pode executar operações de edição/atualização de grade conforme elas ocorrem com interações de grade. Juntamente com uma ótima experiência de desenvolvedor como uma grade editável com operações CRUD, a grade inclui navegação por teclado semelhante ao Excel. A navegação em grade padrão comum está incluída, além da opção de substituir qualquer opção de navegação para atender às necessidades de seus clientes. Uma grade editável com um ótimo esquema de navegação é fundamental para qualquer aplicativo moderno de linha de negócios, com a grade Ignite UI facilitamos.

    Seguindo este tópico, você aprenderá mais sobre o modelo de célula e o modelo de edição e edição de célula.

    Grid Column Configuration

    IgbColumn is used to define the grid's columns collection and to enable features per column like sorting and filtering. Cell, header, and footer templates are also available.

    Defining Columns

    Vamos desligar aAutoGenerate propriedade e definir a coleção de colunas na marcação:

    <IgbGrid AutoGenerate=false AllowFiltering=true>
        <IgbColumn Field="Name" Sortable=true />
        <IgbColumn Field="AthleteNumber" Sortable=true Header="Athlete Number" Filterable=false/>
        <IgbColumn Field="TrackProgress" Header="Track Progress" Filterable=false />
    </IgbGrid>
    

    Header Template

    O modelo de cabeçalho pode ser definido para modificar os cabeçalhos de coluna. Os snippets abaixo mostram como formatar o texto do cabeçalho em maiúsculas.

    <IgbColumn Field="Name" HeaderTemplateScript="UpperCaseTemplate" />
    
    //In JavaScript:
    igRegisterScript("UpperCaseTemplate", (ctx) => {
    
        var html = window.igTemplating.html;
    
        return html`${this.formatUppercase(ctx.column.field)}`;
    
    }, false)
    
    function formatUppercase(value) {
        return value.toUpperCase();
    }
    

    Cell Template

    Quando o modelo de célula é definido, ele altera todas as células da coluna. O objeto de contexto fornecido no modelo consiste no valor da célula fornecido implicitamente e no próprio objeto de célula. Ele pode ser usado para definir um modelo onde o texto das células pode ser formatado, por exemplo, como maiúsculas e minúsculas.

    <IgbColumn Field="Name" BodyTemplateScript="NameCellTemplate"/>
    
    //In JavaScript:
    igRegisterScript("NameCellTemplate", (ctx) => {
        var html = window.igTemplating.html;
    
        return html`${this.formatTitleCase(ctx.implicit)}`;
    }, false);
    
    function formatTitleCase(value) {
        return value.toUpperCase();
    }
    

    In the snippet above we take a reference to the implicitly provided cell value. This is sufficient if you just want to present some data and maybe apply some custom styling or pipe transforms over the value of the cell. However even more useful is to take the Cell instance itself as shown below:

    <IgbGrid Id="grid" AutoGenerate=false>
        <IgbColumn Field="Name" BodyTemplateScript="NameCellTemplate" />
        <IgbColumn Field="Subscription" BodyTemplateScript="SubscriptionCellTemplate" />
    </IgbGrid>
    
    //In JavaScript:
    igRegisterScript("NameCellTemplate", (ctx) => {
           var html = window.igTemplating.html;
        return html`
            <span tabindex="0" @keyup=${(e) => this.deleteRow(e, ctx.cell.id.rowIndex)}> ${this.formatTitleCase(ctx.cell.value)}</span >
        `;
    }, false);
    
    igRegisterScript("SubscriptionCellTemplate", (ctx) => {
        var html = window.igTemplating.html;
         if (ctx.cell.value) {
                return html` <input type="checkbox" checked /> `;
        } else {
                return html` <input type="checkbox"/> `;
        }
    }, false);
    
    function deleteRow(e, rowIndex) {
        if (e.code === "Delete") {
            this.grid.deleteRow(rowIndex);
        }
    }
    
    function formatTitleCase(value) {
        return value.toUpperCase();
    }
    

    Note: The grid exposes a default handling for number, string, date and boolean column types. For example, the column will display check or close icon, instead of true/false by default, for boolean column type.

    Quando implementado corretamente, o modelo de edição de células também garante que as célulasEditValue passarão corretamente pelo ciclo de eventos de edição em grade.

    Cell Editing Template

    The column also accepts one last template that will be used when a cell is in edit mode. As with the other column templates, the provided context object is again the cell value and the cell object itself. Of course in order to make the edit-mode template accessible to end users, you need to set the Editable property of the column to true.

    <IgbColumn Field="Price" Editable=true DataType="GridColumnDataType.Number" InlineEditorTemplateScript="PriceCellTemplate" />
    
    //In JavaScript:
    igRegisterScript("PriceCellTemplate", (ctx) => {
        var html = window.igTemplating.html;
    
        return html`
            <label>
                Enter the new price tag
            </label>
            <input name="price" type="number" value="${ctx.cell.value}"
            @change=${(e) => this.updateValue(e, ctx.cell.value)} />
        `;
    }, false);
    
    function updateValue(event, value) {
    }
    

    Make sure to check the API for the Cell in order to get accustomed with the provided properties you can use in your templates.

    Column Template API

    Cada um dos modelos de coluna pode ser alterado programaticamente a qualquer momento através doIgbColumn próprio objeto. Por exemplo, no código abaixo, declaramos dois modelos para nossos dados de usuário. No nosso código TypeScript, obteremos referências aos próprios templates e, com base em alguma condição, renderizaremos o template apropriado para a coluna em nossa aplicação.

    <IgbGrid ColumnInit=OnColumnInit />
    
    @code {
        public void OnColumnInit(IgbColumnComponentEventArgs args)
        {
            IgbColumn column = args.Detail;
            // Return the appropriate template based on some condition.
            // For example saved user settings, viewport size, etc.
            column.BodyTemplateScript = "NormalViewTemplate";
        }
    }
    
    //In JavaScript:
    igRegisterScript("NormalViewTemplate", (ctx) => {
        var html = window.igTemplating.html;
        return html`
            <div class="user-details">${ctx.cell.value}</div>
            <user-details-component></user-details-component>
        `;
    }, false);
    
    igRegisterScript("SmallViewTemplate", (ctx) => {
        var html = window.igTemplating.html;
        return html`
            <div class="user-details-small" style="color: blue">${ctx.cell.value}</div>
        `;
    }, false);
    

    Column properties can also be set in code in the ColumnInit event which is emitted when the columns are initialized in the grid.

    <IgbGrid ColumnInit=OnColumnInit />
    
    @code {
        public void OnColumnInit(IgbColumnComponentEventArgs args)
        {
            IgbColumn column = args.Detail;
            if (column.Field == "ProductName") {
                column.Sortable = true;
                column.Editable = true;
            }
        }
    }
    

    O código acima tornará a coluna ProductName classificável e editável e instanciará a interface do usuário dos recursos correspondentes (como entradas para edição etc.).

    Custom Display Format

    Há parâmetros opcionais para formatação:

    • Format - determines what date/time parts are displayed, defaults to 'mediumDate', equivalent to 'MMM d, y'
    • Timezone - the timezone offset for dates. By default uses the end-user's local system timezone
    • DigitsInfo - decimal representation objects. Default to 1.0-3

    To allow customizing the display format by these parameters, the PipeArgs input is exposed. A column will respect only the corresponding properties for its data type, if PipeArgs is set. Example:

    <IgbColumn Field="OrderDate"
               DataType=GridColumnDataType.Date
               PipeArgs=@(new IgbColumnPipeArgs() { Timezone="UTC+0", DigitsInfo="1.2-2", Format = "longDate" }) />
    
    <IgbColumn Field="UnitPrice"
               DataType=GridColumnDataType.Date
               PipeArgs=@(new IgbColumnPipeArgs() { Timezone="UTC+0", DigitsInfo="1.2-2", Format = "longDate" }) />
    

    The OrderDate column will respect only the Format and Timezone properties, while the UnitPrice will only respect the DigitsInfo.

    Todos os tipos de dados de coluna disponíveis podem ser encontrados no tópico oficial Tipos de coluna.

    Complex Data Binding

    A vinculação de dados complexos permite uma interação perfeita com dados de vários níveis, conjuntos de dados complexos do mundo real, módulos de dados orientados a objetos, etc. Usando nosso Blazor Data Grid, você pode facilmente associar a objetos complexos (incluindo estruturas de dados que se aninham mais profundamente do que um nível). Isso acontece por meio de um caminho de propriedades no registro de dados.

    Dê uma olhada no seguinte modelo de dados:

    public class AminoAcid
    {
        public string Name { get; set; }
        public AminoAbbreviation Abbreviation { get; set; }
        public AminoWeight Weight { get; set; }
    }
    
    public class AminoAbbreviation
    {
        public string Short { get; set; }
        public string Long { get; set; }
    }
    
    public class AminoWeight
    {
        public double Molecular { get; set; }
        public double Residue { get; set; }
    }
    

    Por exemplo, para exibir os pesos de um determinado aminoácido na grade, o seguinte trecho será suficiente

    <IgbColumn Field="Weight.Molecular" />
    <IgbColumn Field="Weight.Residue" />
    

    An alternative way to bind complex data, or to visualize composite data (from more than one column) in the IgbGrid is to use a custom body template for the column. Generally, one can:

    • use the value of the cell, that contains the nested data
    <IgbColumn Field="Abbreviation.Long" BodyTemplateScript="AbbreviationLongCellTemplate"/>
    
    //In JavaScript:
    igRegisterScript("AbbreviationLongCellTemplate", (ctx) => {
        var html = window.igTemplating.html;
        return html`
            <div>
                <div>
                    ${ctx.cell.value}
                    ${this.GetName(ctx.cell.id.rowIndex)}
                    ${this.GetWeight(ctx.cell.id.rowIndex)}
                </div>
            </div>
        `;
    }, false);
    
    function GetName(rowIndex) {
        return this.grid.getRowByIndex(rowIndex).data["Name"];
    
    }
    
    function GetWeight(rowIndex) {
        return this.grid.getRowByIndex(rowIndex).data["Weight"]["Molecular"];
    }
    

    Aqui está um exemplo de como o modelo de corpo é usado para exibir dados complexos. Abaixo estão os dados que vamos usar:

    public class EmployeesNestedData : List<EmployeesNestedDataItem>
    {
        public EmployeesNestedData()
        {
            this.Add(new EmployeesNestedDataItem()
            {
                Age = 55,
                Employees = new List<EmployeesNestedDataItem_EmployeesItem>()
                {
                    new EmployeesNestedDataItem_EmployeesItem()
                    {
                        Age = 43,
                        Salary = 70000,
                        Productivity = 80,
                        City = @"Hamburg",
                        Country = @"Germany",
                        Phone = @"609-444-555",
                        HireDate = @"2011, 6, 3",
                        ID = 3,
                        Name = @"Michael Burke",
                        Title = @"Senior Software Developer"
                    },
                    new EmployeesNestedDataItem_EmployeesItem()
                    {
                        Age = 29,
                        Salary = 60000,
                        Productivity = 80,
                        City = @"Munich",
                        Country = @"Germany",
                        Phone = @"609-333-444",
                        HireDate = @"2009, 6, 19",
                        ID = 2,
                        Name = @"Thomas Anderson",
                        Title = @"Senior Software Developer"
                    },
                    new EmployeesNestedDataItem_EmployeesItem()
                    {
                        Age = 31,
                        Salary = 90000,
                        Productivity = 80,
                        City = @"Warasw",
                        Country = @"Poland",
                        Phone = @"609-222-205",
                        HireDate = @"2014, 8, 18",
                        ID = 11,
                        Name = @"Monica Reyes",
                        Title = @"Software Development Team Lead"
                    },
                    new EmployeesNestedDataItem_EmployeesItem()
                    {
                        Age = 35,
                        Salary = 70000,
                        Productivity = 70,
                        City = @"Koln",
                        Country = @"Germany",
                        Phone = @"609-502-525",
                        HireDate = @"2015, 9, 17",
                        ID = 6,
                        Name = @"Roland Mendel",
                        Title = @"Senior Software Developer"
                    }}
                });
            }
        }
    }
    

    O modelo personalizado para a coluna, que renderizará os dados aninhados:

    <IgbColumn Header="Employees" Field="Employees" BodyTemplateScript="WebGridNestedDataCellTemplate" />
    
    //In JavaScript:
    igRegisterScript("WebGridNestedDataCellTemplate", (ctx) => {
        var html = window.igTemplating.html;
        window.keyUpHandler = function() {
            ctx.cell.row.data[window.event.target.id] = window.event.target.value;
        }
        const people = ctx.cell.value;
        if (people != null) {
            if (people.length === 0) return html``;
            const person = people[0];
            return html`
        <igc-expansion-panel>
            <h3 slot="title">
            ${person.Name}
            </h3>
            <div class="description">
                <div>
                    <label for="title">Title</label>
                    <input id='Title' type="text" name="title" value="${person.Title}" style="text-overflow: ellipsis;" />
                </div>
                <div>
                    <label for="age">Age</label>
                    <input id='Age' type="text" name="title" value="${person.Age}" style="text-overflow: ellipsis;" />
                </div>
            </div>
        </igc-expansion-panel>
            `;
        }
    }, false);
    

    E o resultado dessa configuração é:

    Working with Flat Data Overview

    The flat data binding approach is similar to the one that we already described above, but instead of cell value we are going to use the Data property of the IgbGridRow.

    Since the Blazor grid is a component for rendering, manipulating and preserving data records, having access to every data record gives you the opportunity to customize the approach of handling it. The data property provides you this opportunity.

    Abaixo estão os dados que vamos usar:

    public class CustomersData : List<CustomersDataItem>
    {
        public CustomersData()
        {
            this.Add(new CustomersDataItem()
            {
                ID = "ALFKI",
                CompanyName = "Alfreds Futterkiste",
                ContactName = "Maria Anders",
                ContactTitle = "Sales Representative",
                Address = "Obere Str. 57",
                City = "Berlin",
                Region = "East",
                PostalCode = "12209",
                Country = "Germany",
                Phone = "030-0074321",
                Fax = "030-0076545"
            });
        }
    }
    

    O modelo personalizado:

    <IgbColumn Header="Address" Field="Address"
               Editable="true"
               BodyTemplateScript="AddressCellTemplate" />
    
    //In JavaScript:
    igRegisterScript("AddressCellTemplate", (ctx) => {
        var html = window.igTemplating.html;
        return html`<div class="address-container">
        <div class="country-city">
            <span><strong>Country:</strong> ${ctx.cell.row.data.Country}</span>
            <br>
            <span><strong>City:</strong> ${ctx.cell.row.data.City}</span>
        </div>
        <div class="phone-pscode">
            <span><strong>Postal Code:</strong> ${ctx.cell.row.data.PostalCode}</span>
            <br>
            <span><strong>Phone:</strong> ${ctx.cell.row.data.Phone}</span>
        </div>
        <br />
    </div>`;
    }, false);
    

    Lembre-se de que, com o modelo definido acima, você não poderá fazer operações de edição, portanto, precisamos de um modelo de editor.

    <IgbColumn Header="Address" Field="Address"
               Editable="true"
               InlineEditorTemplateScript="AddressEditCellTemplate" />
    
    //In JavaScript:
    igRegisterScript("AddressEditCellTemplate", (ctx) => {
        var html = window.igTemplating.html;
        window.keyUpHandler = function() {
            ctx.cell.row.data[window.event.target.id] = window.event.target.value;
        }
    
        return html`<div class="address-container--edit">
        <div>
            <span><strong>Country:</strong></span>
            <input id='Country' onkeyup='keyUpHandler()' value="${ctx.cell.row.data.Country}"></input>
            <br>
            <span><strong>City:</strong></span>
            <input id='City' onkeyup='keyUpHandler()' value="${ctx.cell.row.data.City}"></input>
        </div>
        <div>
            <span><strong>Postal Code:</strong></span>
            <input id='PostalCode' onkeyup='keyUpHandler()' value="${ctx.cell.row.data.PostalCode}"></input>
            <br>
            <span><strong>Selected:</strong></span>
            <input id='Phone' onkeyup='keyUpHandler()' value="${ctx.cell.row.data.Phone}"></input>
        </div>
        <br>
    </div>`;
    }, false);
    

    Working with Flat Data Example

    Using code snippets from previous section will result in the following example of IgbGrid

    Keyboard Navigation

    Keyboard navigation of the IgbGrid provides a rich variety of keyboard interactions for the user. It enhances accessibility and allows intuitive navigation through any type of elements inside (cell, row, column header, toolbar, footer, etc.).

    Styling Blazor Grid

    Nota: A grade usa o layout de grade css, que não é suportado no IE sem prefixação, conseqüentemente não será renderizado corretamente.

     <IgbGrid Class="grid"></IgbGrid>
    

    Then set the --header-background and --header-text-color CSS properties for that class:

    .grid {
        --header-background: #494949;
        --header-text-color: #FFF;
    }
    

    Known Limitations

    Limitação Descrição
    As larguras das colunas definidas empercentage epx Atualmente, não oferecemos suporte à mistura de larguras de coluna com% epx.
    Ao tentar filtrar uma coluna do tiponumber Se um valor diferente do inseridonumber na entradaNaN de filtragem for retornado devido a uma conversão incorreta.
    A gradewidth não depende das larguras das colunas Owidth de todas as colunas não determina a abrangência da grade em si. Ele é determinado pelas dimensões do contêiner pai ou pela grade definida.width
    Grade aninhada no contêiner pai Quando awidth grade não está definida e é colocada em um contêiner pai com dimensões definidas, a grade se estende até esse contêiner.
    As colunas têm uma largura mínima permitida. Dependendo da--ig-size variável CSS, eles são os seguintes:
    "pequeno": 56px
    "médio": 64px
    "grande": 80px
    Se a largura for menor que o mínimo permitido for definida, isso não afetará os elementos renderizados. Eles serão renderizados com a largura mínima permitida para o correspondente--ig-size. Isso pode levar a um comportamento inesperado com a virtualização horizontal e, portanto, não é suportado.
    A altura da linha não é afetada pela altura das células que não estão renderizadas no momento. Devido à virtualização, uma coluna com um modelo personalizado (que altera a altura da célula) que não está no modo de exibição não afetará a altura da linha. A altura da linha será afetada somente enquanto a coluna relacionada for rolada na exibição.

    API References

    Additional Resources

    Nossa comunidade é ativa e sempre acolhedora para novas ideias.