我想知道是否可以使用 Blazor 中的 C# 删除用户在输入文本控件中输入的所有内容,但没有绑定控件。
我有几个文本输入但没有@bind,所以我无法删除与@bind 关联的变量
是否可以通过控件执行“for”之类的操作,并询问是否为输入文本类型以删除其内容?
谢谢!
因此,在您使用扩展的这种情况下,最好查看扩展的实现方式并从那里制定解决方案。如果您检查源代码,您将看到要清除的过滤器的文本框绑定到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
块中定义的类。