最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c# - Blazor: SortIndex Not Reset After Reloading Grid on DropDown Value Change - Stack Overflow

programmeradmin0浏览0评论

I want to reload the grid when the dropdown value changes. However, the SortIndex here:

<span class="mud-sort-index mud-text-disabled">1</span>

is not cleared after reloading, even though the SortDefinitions are being cleared in the OnCategoryChange method.

What I have tried

Clearing the sorting definitions before reloading the data.

dataGrid?.SortDefinitions.Clear();

Please note I have applied sorting only for Number column.

Code:

private Task OnCategoryChange(string category)
{
    selectedCategory = category;
    dataGrid?.SortDefinitions.Clear();
    return dataGrid?.ReloadServerData() ?? Task.CompletedTask;
}

Full markup and code:

<MudDataGrid @ref="dataGrid" T="Element" ServerData="ServerReload" Filterable="false">
    <ToolBarContent>
        <MudText Typo="Typo.h6">Periodic Elements</MudText>
        <MudSpacer />
        
       <MudSelect T="string" Label="Select Category" Value="selectedCategory" ValueChanged="OnCategoryChange">
    <MudSelectItem Value="All">All</MudSelectItem>
    <MudSelectItem Value="Nonmetal">Nonmetal</MudSelectItem>
    <MudSelectItem Value="NobleGas">Noble Gas</MudSelectItem>
    <MudSelectItem Value="AlkaliMetal">Alkali Metal</MudSelectItem>
    <MudSelectItem Value="AlkalineEarthMetal">Alkaline Earth Metal</MudSelectItem>
    <MudSelectItem Value="Metalloid">Metalloid</MudSelectItem>
</MudSelect>

        <MudTextField T="string" ValueChanged="@(s => OnSearch(s))" Placeholder="Search" Adornment="Adornment.Start"
                      AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" Class="mt-0"></MudTextField>
    </ToolBarContent>
    <Columns>
        <TemplateColumn Title="Nr" Sortable="true" SortBy="@(_ => _.Number)">
            <CellTemplate>
                @context.Item.Number
            </CellTemplate>
        </TemplateColumn>

        <TemplateColumn Title="Sign" Sortable="true" SortBy="@(_ => _.Sign)">
            <CellTemplate>
                @context.Item.Sign
            </CellTemplate>
        </TemplateColumn>

        <TemplateColumn Title="Name" Sortable="true" SortBy="@(_ => _.Name)">
            <CellTemplate>
                @context.Item.Name
            </CellTemplate>
        </TemplateColumn>

        <TemplateColumn Title="Position" Sortable="true" SortBy="@(_ => _.Position)">
            <CellTemplate>
                @context.Item.Position
            </CellTemplate>
        </TemplateColumn>

        <TemplateColumn Title="Molar mass" Sortable="true" SortBy="@(_ => _.Molar)">
            <CellTemplate>
                @context.Item.Molar
            </CellTemplate>
        </TemplateColumn>

        <TemplateColumn Title="Category" Sortable="true" SortBy="@(_ => _.Group)">
            <CellTemplate>
                @context.Item.Group
            </CellTemplate>
        </TemplateColumn>
    </Columns>
    <PagerContent>
        <MudDataGridPager T="Element" />
    </PagerContent>
</MudDataGrid>

@code {
    public class Element
    {
        public int Number { get; set; } = 0;
        public string Sign { get; set; } = string.Empty;
        public string Name { get; set; } = string.Empty;
        public int Position { get; set; } = 0;
        public double Molar { get; set; } = 0.0;
        public string Group { get; set; } = string.Empty;
    
        // Constructor to initialize properties
        public Element(int number, string sign, string name, int position, double molar, string group)
        {
            Number = number;
            Sign = sign;
            Name = name;
            Position = position;
            Molar = molar;
            Group = group;
        }
    
        // Default constructor
        public Element() { }
    }

    MudDataGrid<Element>? dataGrid;
    string searchString = string.Empty;
    string selectedCategory = "All";

    private const string NobleGas = "Noble Gas";
    private const string AlkaliMetal = "Alkali Metal";
    private const string AlkalineEarthMetal = "Alkaline Earth Metal";

    private const string All = "All";
    private const string Nonmetal = "Nonmetal";
    private const string Metalloid = "Metalloid";

    private async Task<GridData<Element>> ServerReload(GridState<Element> state)
    {
       IEnumerable<Element> data = new List<Element>
    {
        new Element(1, "H", "Hydrogen", 1, 1.008, "Nonmetal"),
        new Element(2, "He", "Helium", 18, 4.0026, "Noble Gas"),
        new Element(3, "Li", "Lithium", 1, 6.94, "Alkali Metal"),
        new Element(4, "Be", "Beryllium", 2, 9.0122, "Alkaline Earth Metal"),
        new Element(5, "B", "Boron", 13, 10.81, "Metalloid"),
        new Element(6, "C", "Carbon", 14, 12.011, "Nonmetal"),
        new Element(7, "N", "Nitrogen", 15, 14.007, "Nonmetal"),
        new Element(8, "O", "Oxygen", 16, 15.999, "Nonmetal"),
        new Element(9, "F", "Fluorine", 17, 18.998, "Halogen"),
        new Element(10, "Ne", "Neon", 18, 20.180, "Noble Gas"),
        new Element(11, "Na", "Sodium", 1, 22.990, "Alkali Metal"),
        new Element(12, "Mg", "Magnesium", 2, 24.305, "Alkaline Earth Metal"),
        new Element(13, "Al", "Aluminum", 13, 26.982, "Post-transition Metal"),
        new Element(14, "Si", "Silicon", 14, 28.085, "Metalloid"),
        new Element(15, "P", "Phosphorus", 15, 30.974, "Nonmetal"),
        new Element(16, "S", "Sulfur", 16, 32.06, "Nonmetal"),
        new Element(17, "Cl", "Chlorine", 17, 35.45, "Halogen"),
        new Element(18, "Ar", "Argon", 18, 39.948, "Noble Gas"),
        new Element(19, "K", "Potassium", 1, 39.098, "Alkali Metal"),
        new Element(20, "Ca", "Calcium", 2, 40.078, "Alkaline Earth Metal"),
        new Element(21, "Sc", "Scandium", 3, 44.956, "Transition Metal"),
        new Element(22, "Ti", "Titanium", 4, 47.867, "Transition Metal"),
        new Element(23, "V", "Vanadium", 5, 50.942, "Transition Metal"),
        new Element(24, "Cr", "Chromium", 6, 51.996, "Transition Metal"),
        new Element(25, "Mn", "Manganese", 7, 54.938, "Transition Metal"),
        new Element(26, "Fe", "Iron", 8, 55.845, "Transition Metal"),
        new Element(27, "Co", "Cobalt", 9, 58.933, "Transition Metal"),
        new Element(28, "Ni", "Nickel", 10, 58.693, "Transition Metal"),
        new Element(29, "Cu", "Copper", 11, 63.546, "Transition Metal")
    };
        await Task.Delay(300); // Simulating API delay

        // Apply filtering
        data = data.Where(element =>
            (string.IsNullOrWhiteSpace(searchString) ||
             element.Sign.Contains(searchString, StringComparison.OrdinalIgnoreCase) ||
             element.Name.Contains(searchString, StringComparison.OrdinalIgnoreCase) ||
             $"{element.Number} {element.Position} {element.Molar}".Contains(searchString)) &&
            (selectedCategory == "All" || element.Group == selectedCategory)
        );

    // Apply sorting logic
    var sortDefinition = state.SortDefinitions.FirstOrDefault();

    if (sortDefinition != null)
    {
        var sortBy = "Number";

        switch (sortBy)
        {
            case nameof(Element.Number):
                data = data.OrderByDirection(sortDefinition.Descending ? SortDirection.Descending : SortDirection.Ascending, o => o.Number);
                break;

            case nameof(Element.Sign):
                data = data.OrderByDirection(sortDefinition.Descending ? SortDirection.Descending : SortDirection.Ascending, o => o.Sign);
                break;

            case nameof(Element.Name):
                data = data.OrderByDirection(sortDefinition.Descending ? SortDirection.Descending : SortDirection.Ascending, o => o.Name);
                break;

            case nameof(Element.Position):
                data = data.OrderByDirection(sortDefinition.Descending ? SortDirection.Descending : SortDirection.Ascending, o =>  o.Position);
                break;

        case nameof(Element.Molar):
                data = data.OrderByDirection(sortDefinition.Descending ? SortDirection.Descending : SortDirection.Ascending, o => o.Molar);
                break;
        }
    }
        var totalItems = data.Count();
        var pagedData = data.Skip(state.Page * state.PageSize).Take(state.PageSize).ToArray();

        return new GridData<Element>
        {
            TotalItems = totalItems,
            Items = pagedData
        };
    }

    private Task OnSearch(string text)
    {
        searchString = text;
        return dataGrid?.ReloadServerData() ?? Task.CompletedTask;
    }

    private Task OnCategoryChange(string category)
    {
        selectedCategory = category;
        dataGrid?.SortDefinitions.Clear();
        return dataGrid?.ReloadServerData() ?? Task.CompletedTask;
    }
}

Here is the snippet:

I want to reload the grid when the dropdown value changes. However, the SortIndex here:

<span class="mud-sort-index mud-text-disabled">1</span>

is not cleared after reloading, even though the SortDefinitions are being cleared in the OnCategoryChange method.

What I have tried

Clearing the sorting definitions before reloading the data.

dataGrid?.SortDefinitions.Clear();

Please note I have applied sorting only for Number column.

Code:

private Task OnCategoryChange(string category)
{
    selectedCategory = category;
    dataGrid?.SortDefinitions.Clear();
    return dataGrid?.ReloadServerData() ?? Task.CompletedTask;
}

Full markup and code:

<MudDataGrid @ref="dataGrid" T="Element" ServerData="ServerReload" Filterable="false">
    <ToolBarContent>
        <MudText Typo="Typo.h6">Periodic Elements</MudText>
        <MudSpacer />
        
       <MudSelect T="string" Label="Select Category" Value="selectedCategory" ValueChanged="OnCategoryChange">
    <MudSelectItem Value="All">All</MudSelectItem>
    <MudSelectItem Value="Nonmetal">Nonmetal</MudSelectItem>
    <MudSelectItem Value="NobleGas">Noble Gas</MudSelectItem>
    <MudSelectItem Value="AlkaliMetal">Alkali Metal</MudSelectItem>
    <MudSelectItem Value="AlkalineEarthMetal">Alkaline Earth Metal</MudSelectItem>
    <MudSelectItem Value="Metalloid">Metalloid</MudSelectItem>
</MudSelect>

        <MudTextField T="string" ValueChanged="@(s => OnSearch(s))" Placeholder="Search" Adornment="Adornment.Start"
                      AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" Class="mt-0"></MudTextField>
    </ToolBarContent>
    <Columns>
        <TemplateColumn Title="Nr" Sortable="true" SortBy="@(_ => _.Number)">
            <CellTemplate>
                @context.Item.Number
            </CellTemplate>
        </TemplateColumn>

        <TemplateColumn Title="Sign" Sortable="true" SortBy="@(_ => _.Sign)">
            <CellTemplate>
                @context.Item.Sign
            </CellTemplate>
        </TemplateColumn>

        <TemplateColumn Title="Name" Sortable="true" SortBy="@(_ => _.Name)">
            <CellTemplate>
                @context.Item.Name
            </CellTemplate>
        </TemplateColumn>

        <TemplateColumn Title="Position" Sortable="true" SortBy="@(_ => _.Position)">
            <CellTemplate>
                @context.Item.Position
            </CellTemplate>
        </TemplateColumn>

        <TemplateColumn Title="Molar mass" Sortable="true" SortBy="@(_ => _.Molar)">
            <CellTemplate>
                @context.Item.Molar
            </CellTemplate>
        </TemplateColumn>

        <TemplateColumn Title="Category" Sortable="true" SortBy="@(_ => _.Group)">
            <CellTemplate>
                @context.Item.Group
            </CellTemplate>
        </TemplateColumn>
    </Columns>
    <PagerContent>
        <MudDataGridPager T="Element" />
    </PagerContent>
</MudDataGrid>

@code {
    public class Element
    {
        public int Number { get; set; } = 0;
        public string Sign { get; set; } = string.Empty;
        public string Name { get; set; } = string.Empty;
        public int Position { get; set; } = 0;
        public double Molar { get; set; } = 0.0;
        public string Group { get; set; } = string.Empty;
    
        // Constructor to initialize properties
        public Element(int number, string sign, string name, int position, double molar, string group)
        {
            Number = number;
            Sign = sign;
            Name = name;
            Position = position;
            Molar = molar;
            Group = group;
        }
    
        // Default constructor
        public Element() { }
    }

    MudDataGrid<Element>? dataGrid;
    string searchString = string.Empty;
    string selectedCategory = "All";

    private const string NobleGas = "Noble Gas";
    private const string AlkaliMetal = "Alkali Metal";
    private const string AlkalineEarthMetal = "Alkaline Earth Metal";

    private const string All = "All";
    private const string Nonmetal = "Nonmetal";
    private const string Metalloid = "Metalloid";

    private async Task<GridData<Element>> ServerReload(GridState<Element> state)
    {
       IEnumerable<Element> data = new List<Element>
    {
        new Element(1, "H", "Hydrogen", 1, 1.008, "Nonmetal"),
        new Element(2, "He", "Helium", 18, 4.0026, "Noble Gas"),
        new Element(3, "Li", "Lithium", 1, 6.94, "Alkali Metal"),
        new Element(4, "Be", "Beryllium", 2, 9.0122, "Alkaline Earth Metal"),
        new Element(5, "B", "Boron", 13, 10.81, "Metalloid"),
        new Element(6, "C", "Carbon", 14, 12.011, "Nonmetal"),
        new Element(7, "N", "Nitrogen", 15, 14.007, "Nonmetal"),
        new Element(8, "O", "Oxygen", 16, 15.999, "Nonmetal"),
        new Element(9, "F", "Fluorine", 17, 18.998, "Halogen"),
        new Element(10, "Ne", "Neon", 18, 20.180, "Noble Gas"),
        new Element(11, "Na", "Sodium", 1, 22.990, "Alkali Metal"),
        new Element(12, "Mg", "Magnesium", 2, 24.305, "Alkaline Earth Metal"),
        new Element(13, "Al", "Aluminum", 13, 26.982, "Post-transition Metal"),
        new Element(14, "Si", "Silicon", 14, 28.085, "Metalloid"),
        new Element(15, "P", "Phosphorus", 15, 30.974, "Nonmetal"),
        new Element(16, "S", "Sulfur", 16, 32.06, "Nonmetal"),
        new Element(17, "Cl", "Chlorine", 17, 35.45, "Halogen"),
        new Element(18, "Ar", "Argon", 18, 39.948, "Noble Gas"),
        new Element(19, "K", "Potassium", 1, 39.098, "Alkali Metal"),
        new Element(20, "Ca", "Calcium", 2, 40.078, "Alkaline Earth Metal"),
        new Element(21, "Sc", "Scandium", 3, 44.956, "Transition Metal"),
        new Element(22, "Ti", "Titanium", 4, 47.867, "Transition Metal"),
        new Element(23, "V", "Vanadium", 5, 50.942, "Transition Metal"),
        new Element(24, "Cr", "Chromium", 6, 51.996, "Transition Metal"),
        new Element(25, "Mn", "Manganese", 7, 54.938, "Transition Metal"),
        new Element(26, "Fe", "Iron", 8, 55.845, "Transition Metal"),
        new Element(27, "Co", "Cobalt", 9, 58.933, "Transition Metal"),
        new Element(28, "Ni", "Nickel", 10, 58.693, "Transition Metal"),
        new Element(29, "Cu", "Copper", 11, 63.546, "Transition Metal")
    };
        await Task.Delay(300); // Simulating API delay

        // Apply filtering
        data = data.Where(element =>
            (string.IsNullOrWhiteSpace(searchString) ||
             element.Sign.Contains(searchString, StringComparison.OrdinalIgnoreCase) ||
             element.Name.Contains(searchString, StringComparison.OrdinalIgnoreCase) ||
             $"{element.Number} {element.Position} {element.Molar}".Contains(searchString)) &&
            (selectedCategory == "All" || element.Group == selectedCategory)
        );

    // Apply sorting logic
    var sortDefinition = state.SortDefinitions.FirstOrDefault();

    if (sortDefinition != null)
    {
        var sortBy = "Number";

        switch (sortBy)
        {
            case nameof(Element.Number):
                data = data.OrderByDirection(sortDefinition.Descending ? SortDirection.Descending : SortDirection.Ascending, o => o.Number);
                break;

            case nameof(Element.Sign):
                data = data.OrderByDirection(sortDefinition.Descending ? SortDirection.Descending : SortDirection.Ascending, o => o.Sign);
                break;

            case nameof(Element.Name):
                data = data.OrderByDirection(sortDefinition.Descending ? SortDirection.Descending : SortDirection.Ascending, o => o.Name);
                break;

            case nameof(Element.Position):
                data = data.OrderByDirection(sortDefinition.Descending ? SortDirection.Descending : SortDirection.Ascending, o =>  o.Position);
                break;

        case nameof(Element.Molar):
                data = data.OrderByDirection(sortDefinition.Descending ? SortDirection.Descending : SortDirection.Ascending, o => o.Molar);
                break;
        }
    }
        var totalItems = data.Count();
        var pagedData = data.Skip(state.Page * state.PageSize).Take(state.PageSize).ToArray();

        return new GridData<Element>
        {
            TotalItems = totalItems,
            Items = pagedData
        };
    }

    private Task OnSearch(string text)
    {
        searchString = text;
        return dataGrid?.ReloadServerData() ?? Task.CompletedTask;
    }

    private Task OnCategoryChange(string category)
    {
        selectedCategory = category;
        dataGrid?.SortDefinitions.Clear();
        return dataGrid?.ReloadServerData() ?? Task.CompletedTask;
    }
}

Here is the snippet:

https://try.mudblazor/snippet/GamTuxYnwmIPseoh

Share Improve this question edited Mar 3 at 6:54 marc_s 757k184 gold badges1.4k silver badges1.5k bronze badges asked Mar 3 at 6:34 AishhAishh 213 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 0

Try adding @key [@key="selectedCategory"]in your code.

<MudDataGrid @ref="dataGrid" @key="selectedCategory" T="Element" ServerData="ServerReload" Filterable="false">..

The Key parameter in Blazor is used to help the rendering engine identify components uniquely. When you set a Key on a component like , it forces Blazor to treat it as a new instance whenever the key changes, which can be useful for ensuring a fresh re-render.

发布评论

评论列表(0)

  1. 暂无评论