0

我想知道是否可以使用 Blazor 中的 C# 删除用户在输入文本控件中输入的所有内容,但没有绑定控件。

我有几个文本输入但没有@bind,所以我无法删除与@bind 关联的变量

是否可以通过控件执行“for”之类的操作,并询问是否为输入文本类型以删除其内容?

谢谢!

4

1 回答 1

1

因此,在您使用扩展的这种情况下,最好查看扩展的实现方式并从那里制定解决方案。如果您检查源代码,您将看到要清除的过滤器的文本框绑定到column.Filter.SearchValue

<TextEdit Text="@column.Filter.SearchValue" TextChanged="@(async (newValue) => await OnFilterChanged(column, newValue))" />

从那里开始,只需能够在 C#中清除该属性即可。不幸的是,Blazorise 不支持对其DisplayableColumns属性的公共访问——您需要它来操作SearchValue. 一个 hacky 解决方法是子类化DataGrid,因为属性是protected

public class MyDataGrid<TItem> : DataGrid<TItem>
{
    public IEnumerable<DataGridColumn<TItem>> MyColumns => DisplayableColumns;
}

有了这个,实现一个“清除过滤器”按钮来清除所有过滤器是微不足道的。

<input type="button" value="Clear Filters" @onclick="ClearFilters" />

实现为:

private void ClearFilters() 
{
    foreach (var column in dataGrid.MyColumns)
    {
        column.Filter.SearchValue = null;
    }
}

您还需要在字段中捕获 DataGrid:

private MyDataGrid<Person> dataGrid;

要设置该字段,您需要添加@ref="dataGrid"到网格中。

现在,说了这么多,很明显,必须创建一个子类是次优的。我冒昧地在他们的 GitHub 存储库中打开了一个问题,并将这个答案作为一种解决方法。

没有子类的完整示例是:

<MyDataGrid TItem="Person" Data="@persons" Filterable="true" @ref="dataGrid">
    <DataGridColumn TItem="Person" Field="@nameof(Person.Name)" />
</MyDataGrid>

<input type="button" value="Clear Filters" @onclick="ClearFilters" />

@code {
    private MyDataGrid<Person> dataGrid;

    private void ClearFilters() 
    {
        foreach (var column in dataGrid.MyColumns)
        {
            column.Filter.SearchValue = null;
        }
    }

    private Person[] persons = new[]
    {
        new Person { Name = "John Doe" },
        new Person { Name = "Jane Down" }
    };

    public class Person 
    {
        public string Name { get; set; }
    }
}

请注意,由于 Blazor 中的明显限制,您需要MyDataGrid在单独的文件中声明,而不是作为在@code块中定义的类。

于 2021-02-24T19:50:43.070 回答