+ @if (ShowColumnListSelectExtension)
+ {
+
+ }
@foreach (var item in _visibleColumns)
{
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
index 13173cd502a..61540c15448 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
@@ -173,4 +173,34 @@ private async Task OnToggleColumnVisible(string columnName, bool visible)
await OnColumnVisibleChanged(columnName, visible);
}
}
+
+ ///
+ /// 当前所有列的是否全都显示/全都不显示/部分显示状态计算
+ ///
+ private CheckboxState VisibleColumnsCurrentSelectedResult
+ => _visibleColumns.All(r => r.Visible)
+ ? CheckboxState.Checked
+ : _visibleColumns.All(r => !r.Visible)
+ ? CheckboxState.UnChecked
+ : CheckboxState.Indeterminate;
+
+ private async Task OnToggleAllColumnsVisibleState(CheckboxState state, string _)
+ {
+ if (state == CheckboxState.Checked)
+ foreach (var column in _visibleColumns)
+ {
+ column.Visible = true;
+ await OnToggleColumnVisible(column.Name, true);
+ }
+ else if (state == CheckboxState.UnChecked)
+ {
+ await ShowToastAsync("提示", "表格需要至少有一列显示,点击全不选时默认第一列维持显示状态", ToastCategory.Warning);
+ foreach (var column in _visibleColumns.Skip(1).ToList())
+ {
+ column.Visible = false;
+ await OnToggleColumnVisible(column.Name, false);
+ }
+ }
+ await InvokeAsync(StateHasChanged);
+ }
}
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs
index 4a12cd01653..99d74173000 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs
@@ -310,6 +310,12 @@ public Func
? ShowDeleteButtonCallback
[Parameter]
public bool ShowColumnList { get; set; }
+ ///
+ /// 获得/设置 列选择下拉框中是否显示扩展的选择功能默认为 false 不显示
+ ///
+ [Parameter]
+ public bool ShowColumnListSelectExtension { get; set; }
+
///
/// 获得/设置 列选择下拉框图标
///
From 6e214a79b7424fd646beef65e24c0d65c29208cc Mon Sep 17 00:00:00 2001
From: momiji-gz302ea <2648863351@qq.com>
Date: Tue, 16 Dec 2025 19:05:42 +0800
Subject: [PATCH 02/14] feat(Table): add search col.Name and InverseSelected in
ColumnListSelectExtension
---
.../Components/Table/Table.razor | 17 +++++---
.../Components/Table/Table.razor.Checkbox.cs | 43 ++++++++++++++++++-
.../Components/Table/Table.razor.scss | 9 ++++
3 files changed, 63 insertions(+), 6 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor b/src/BootstrapBlazor/Components/Table/Table.razor
index 3023c009204..ca1de52668e 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor
+++ b/src/BootstrapBlazor/Components/Table/Table.razor
@@ -120,14 +120,21 @@
@if (ShowColumnListSelectExtension)
{
-
-
-
+
+
+
+
+
+
+
}
- @foreach (var item in _visibleColumns)
+ @foreach (var item in ShowColumnListSelectExtension ? VisibleColumnsSearchResult : _visibleColumns)
{
+ /// 获得/设置 各列是否显示状态集合
+ ///
+ private List VisibleColumnsSearchResult
+ => string.IsNullOrWhiteSpace(_visibleColumnsSearchKey)
+ ? _visibleColumns : _visibleColumnsSearchResult;
+
+ ///
+ /// 获得/设置 各列是否显示状态集合
+ ///
+ private List _visibleColumnsSearchResult = [];
+
+ private async Task SearchVisibleColumns(string searchKey)
+ {
+ _visibleColumnsSearchKey = searchKey;
+ _visibleColumnsSearchResult = _visibleColumns
+ .Where(r =>
+ string.IsNullOrWhiteSpace(_visibleColumnsSearchKey) ||
+ (r.DisplayName ?? r.Name).Contains(_visibleColumnsSearchKey))
+ .ToList();
+ await InvokeAsync(StateHasChanged);
+ }
+
+ private async Task InverseSelected()
+ {
+ foreach (var column in _visibleColumns)
+ {
+ column.Visible = !column.Visible;
+ await OnToggleColumnVisible(column.Name, column.Visible);
+ }
+
+ if (VisibleColumnsCurrentSelectedResult == CheckboxState.UnChecked && _visibleColumns.Any())
+ {
+ await ShowToastAsync("提示", "表格需要至少有一列显示,全不选时默认第一列维持显示状态", ToastCategory.Warning);
+ _visibleColumns[0].Visible = true;
+ }
+ await InvokeAsync(StateHasChanged);
+ }
+
private async Task OnToggleAllColumnsVisibleState(CheckboxState state, string _)
{
if (state == CheckboxState.Checked)
@@ -194,7 +235,7 @@ private async Task OnToggleAllColumnsVisibleState(CheckboxState state, string _)
}
else if (state == CheckboxState.UnChecked)
{
- await ShowToastAsync("提示", "表格需要至少有一列显示,点击全不选时默认第一列维持显示状态", ToastCategory.Warning);
+ await ShowToastAsync("提示", "表格需要至少有一列显示,全不选时默认第一列维持显示状态", ToastCategory.Warning);
foreach (var column in _visibleColumns.Skip(1).ToList())
{
column.Visible = false;
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.scss b/src/BootstrapBlazor/Components/Table/Table.razor.scss
index 58c26e0d243..5a8a363669e 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.scss
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.scss
@@ -975,3 +975,12 @@ form .table .table-cell > textarea {
margin-inline-end: .25rem;
}
}
+
+.column-list-select-extension {
+ min-width: 250px;
+}
+
+.column-list-select-extension > .input-group > .form-check {
+ flex-grow: 0;
+ width: 40px;
+}
From 5d38ff7107499cf65625138816347a1b24af3153 Mon Sep 17 00:00:00 2001
From: momiji-gz302ea <2648863351@qq.com>
Date: Tue, 16 Dec 2025 19:15:33 +0800
Subject: [PATCH 03/14] style(Table): add ColumnListSelectExtension i18n cfg
---
.../Components/Table/Table.razor.Checkbox.cs | 8 ++++++--
.../Components/Table/Table.razor.Localization.cs | 16 ++++++++++++++++
src/BootstrapBlazor/Locales/en.json | 4 +++-
src/BootstrapBlazor/Locales/zh.json | 4 +++-
4 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
index ef213e43dc4..3cd11c90f95 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
@@ -219,7 +219,9 @@ private async Task InverseSelected()
if (VisibleColumnsCurrentSelectedResult == CheckboxState.UnChecked && _visibleColumns.Any())
{
- await ShowToastAsync("提示", "表格需要至少有一列显示,全不选时默认第一列维持显示状态", ToastCategory.Warning);
+ await ShowToastAsync(
+ ColumnGroupSelectButtonWarnToastTitle,
+ ColumnGroupSelectButtonWarnToastContent, ToastCategory.Warning);
_visibleColumns[0].Visible = true;
}
await InvokeAsync(StateHasChanged);
@@ -235,7 +237,9 @@ private async Task OnToggleAllColumnsVisibleState(CheckboxState state, string _)
}
else if (state == CheckboxState.UnChecked)
{
- await ShowToastAsync("提示", "表格需要至少有一列显示,全不选时默认第一列维持显示状态", ToastCategory.Warning);
+ await ShowToastAsync(
+ ColumnGroupSelectButtonWarnToastTitle,
+ ColumnGroupSelectButtonWarnToastContent, ToastCategory.Warning);
foreach (var column in _visibleColumns.Skip(1).ToList())
{
column.Visible = false;
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Localization.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Localization.cs
index 5cb1b6f42a7..1e6b836bc17 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.Localization.cs
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.Localization.cs
@@ -364,6 +364,20 @@ public partial class Table
[NotNull]
public string? AdvancedSortModalTitle { get; set; }
+ ///
+ /// 获得/设置 编辑按钮 Toast 提示 Title 文字
+ ///
+ [Parameter]
+ [NotNull]
+ public string? ColumnGroupSelectButtonWarnToastTitle { get; set; }
+
+ ///
+ /// 获得/设置 编辑按钮 Toast 未选择时提示 Content 文字
+ ///
+ [Parameter]
+ [NotNull]
+ public string? ColumnGroupSelectButtonWarnToastContent { get; set; }
+
[Inject]
[NotNull]
private IStringLocalizer>? Localizer { get; set; }
@@ -438,5 +452,7 @@ private void OnInitLocalization()
AlignCenterTooltipText ??= Localizer[nameof(AlignCenterTooltipText)];
AlignRightText ??= Localizer[nameof(AlignRightText)];
AlignRightTooltipText ??= Localizer[nameof(AlignRightTooltipText)];
+ ColumnGroupSelectButtonWarnToastTitle ??= Localizer[nameof(ColumnGroupSelectButtonWarnToastTitle)];
+ ColumnGroupSelectButtonWarnToastContent ??= Localizer[nameof(ColumnGroupSelectButtonWarnToastContent)];
}
}
diff --git a/src/BootstrapBlazor/Locales/en.json b/src/BootstrapBlazor/Locales/en.json
index 61dab3f09ff..bf14fb51b94 100644
--- a/src/BootstrapBlazor/Locales/en.json
+++ b/src/BootstrapBlazor/Locales/en.json
@@ -254,7 +254,9 @@
"AlignCenterText": "Center",
"AlignCenterTooltipText": "Click to align text in this column to the center",
"AlignRightText": "Right",
- "AlignRightTooltipText": "Click to align text in this column to the right"
+ "AlignRightTooltipText": "Click to align text in this column to the right",
+ "ColumnGroupSelectButtonWarnToastTitle": "Warning",
+ "ColumnGroupSelectButtonWarnToastContent": "Table must have at least one column displayed. When none are selected, the first column will remain visible by default."
},
"BootstrapBlazor.Components.EditDialog": {
"CloseButtonText": "Close",
diff --git a/src/BootstrapBlazor/Locales/zh.json b/src/BootstrapBlazor/Locales/zh.json
index d2fee6af068..f8c6cb0318b 100644
--- a/src/BootstrapBlazor/Locales/zh.json
+++ b/src/BootstrapBlazor/Locales/zh.json
@@ -254,7 +254,9 @@
"AlignCenterText": "居中",
"AlignCenterTooltipText": "点击后本列文本居中对齐",
"AlignRightText": "右对齐",
- "AlignRightTooltipText": "点击后本列文本右对齐"
+ "AlignRightTooltipText": "点击后本列文本右对齐",
+ "ColumnGroupSelectButtonWarnToastTitle": "提示",
+ "ColumnGroupSelectButtonWarnToastContent": "表格需要至少有一列显示,全不选时默认第一列维持显示状态"
},
"BootstrapBlazor.Components.EditDialog": {
"CloseButtonText": "关闭",
From 83ed976f1ae96f20537271a9612b5ec5db6d3c8f Mon Sep 17 00:00:00 2001
From: momiji-gz302ea <2648863351@qq.com>
Date: Tue, 16 Dec 2025 19:26:17 +0800
Subject: [PATCH 04/14] style(Table): add InverseSelectedButtonText i18n cfg
---
src/BootstrapBlazor/Components/Table/Table.razor | 2 +-
.../Components/Table/Table.razor.Localization.cs | 14 +++++++++++---
src/BootstrapBlazor/Locales/en.json | 1 +
src/BootstrapBlazor/Locales/zh.json | 1 +
4 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor b/src/BootstrapBlazor/Components/Table/Table.razor
index ca1de52668e..9c4899ad7f9 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor
+++ b/src/BootstrapBlazor/Components/Table/Table.razor
@@ -127,7 +127,7 @@
-
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Localization.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Localization.cs
index 1e6b836bc17..f9b7d8eb8c9 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.Localization.cs
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.Localization.cs
@@ -8,7 +8,7 @@
namespace BootstrapBlazor.Components;
///
-///
+///
///
///
public partial class Table
@@ -365,14 +365,21 @@ public partial class Table
public string? AdvancedSortModalTitle { get; set; }
///
- /// 获得/设置 编辑按钮 Toast 提示 Title 文字
+ /// 获得/设置 反选按钮文字信息
+ ///
+ [Parameter]
+ [NotNull]
+ public string? InverseSelectedButtonText { get; set; }
+
+ ///
+ /// 获得/设置 列选择增强警告标题
///
[Parameter]
[NotNull]
public string? ColumnGroupSelectButtonWarnToastTitle { get; set; }
///
- /// 获得/设置 编辑按钮 Toast 未选择时提示 Content 文字
+ /// 获得/设置 列选择增强警告内容
///
[Parameter]
[NotNull]
@@ -452,6 +459,7 @@ private void OnInitLocalization()
AlignCenterTooltipText ??= Localizer[nameof(AlignCenterTooltipText)];
AlignRightText ??= Localizer[nameof(AlignRightText)];
AlignRightTooltipText ??= Localizer[nameof(AlignRightTooltipText)];
+ InverseSelectedButtonText ??= Localizer[nameof(InverseSelectedButtonText)];
ColumnGroupSelectButtonWarnToastTitle ??= Localizer[nameof(ColumnGroupSelectButtonWarnToastTitle)];
ColumnGroupSelectButtonWarnToastContent ??= Localizer[nameof(ColumnGroupSelectButtonWarnToastContent)];
}
diff --git a/src/BootstrapBlazor/Locales/en.json b/src/BootstrapBlazor/Locales/en.json
index bf14fb51b94..24534398de5 100644
--- a/src/BootstrapBlazor/Locales/en.json
+++ b/src/BootstrapBlazor/Locales/en.json
@@ -255,6 +255,7 @@
"AlignCenterTooltipText": "Click to align text in this column to the center",
"AlignRightText": "Right",
"AlignRightTooltipText": "Click to align text in this column to the right",
+ "InverseSelectedButtonText": "Toggle the visibility of the current column.",
"ColumnGroupSelectButtonWarnToastTitle": "Warning",
"ColumnGroupSelectButtonWarnToastContent": "Table must have at least one column displayed. When none are selected, the first column will remain visible by default."
},
diff --git a/src/BootstrapBlazor/Locales/zh.json b/src/BootstrapBlazor/Locales/zh.json
index f8c6cb0318b..483b61d1b04 100644
--- a/src/BootstrapBlazor/Locales/zh.json
+++ b/src/BootstrapBlazor/Locales/zh.json
@@ -255,6 +255,7 @@
"AlignCenterTooltipText": "点击后本列文本居中对齐",
"AlignRightText": "右对齐",
"AlignRightTooltipText": "点击后本列文本右对齐",
+ "InverseSelectedButtonText": "反选当前列显示",
"ColumnGroupSelectButtonWarnToastTitle": "提示",
"ColumnGroupSelectButtonWarnToastContent": "表格需要至少有一列显示,全不选时默认第一列维持显示状态"
},
From a981fc3b9905d892626eb1f8a8b7bfa7d664c97b Mon Sep 17 00:00:00 2001
From: momiji-gz302ea <2648863351@qq.com>
Date: Tue, 16 Dec 2025 19:48:33 +0800
Subject: [PATCH 05/14] fix(Table): Consider invoking await
OnToggleColumnVisible after updating first visible.
---
src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
index 3cd11c90f95..6e625af01ec 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
@@ -223,6 +223,7 @@ await ShowToastAsync(
ColumnGroupSelectButtonWarnToastTitle,
ColumnGroupSelectButtonWarnToastContent, ToastCategory.Warning);
_visibleColumns[0].Visible = true;
+ await OnToggleColumnVisible(_visibleColumns[0].Name, true);
}
await InvokeAsync(StateHasChanged);
}
From b58e993d8d3c36248ed02c819b507dcc21cc2ed3 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Sun, 21 Dec 2025 13:02:00 +0800
Subject: [PATCH 06/14] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Components/Table/Table.razor | 30 +++++++++----------
.../Components/Table/Table.razor.scss | 26 ++++++++++++----
2 files changed, 34 insertions(+), 22 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor b/src/BootstrapBlazor/Components/Table/Table.razor
index 9c4899ad7f9..851355828c7 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor
+++ b/src/BootstrapBlazor/Components/Table/Table.razor
@@ -1,4 +1,4 @@
-@namespace BootstrapBlazor.Components
+@namespace BootstrapBlazor.Components
@using Microsoft.AspNetCore.Components.Web.Virtualization
@typeparam TItem
@inherits BootstrapModuleComponentBase
@@ -14,7 +14,7 @@
{
}
- else if(ShowLoadingInFirstRender)
+ else if (ShowLoadingInFirstRender)
{
@if (LoadingTemplate is not null)
@@ -120,21 +120,19 @@
@if (ShowColumnListSelectExtension)
{
-
-
-
-
-
-
-
+
-
+
}
- @foreach (var item in ShowColumnListSelectExtension ? VisibleColumnsSearchResult : _visibleColumns)
+ @foreach (var item in _visibleColumns)
{
textarea {
}
}
-.column-list-select-extension {
- min-width: 250px;
-}
+.dropdown-menu {
+ .column-list-controls {
+ display: flex;
+ flex-wrap: nowrap;
+ padding: 0 var(--bs-dropdown-item-padding-x);
+ margin-block-end: .5rem;
+
+ .column-list-controls-item {
+ display: flex;
+ justify-items: center;
+ flex-wrap: nowrap;
+
+ span {
+ margin-inline-end: .25rem;
+ }
+ }
-.column-list-select-extension > .input-group > .form-check {
- flex-grow: 0;
- width: 40px;
+ .column-list-controls-item:not(:last-child) {
+ margin-inline-end: .5rem;
+ }
+ }
}
From 039237ae7ed1764196989d92e65c6570cb99cd78 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Sun, 21 Dec 2025 13:04:46 +0800
Subject: [PATCH 07/14] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Components/Table/Table.razor.Checkbox.cs | 78 +------------------
1 file changed, 1 insertion(+), 77 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
index 6e625af01ec..5cc59d08164 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone
@@ -173,80 +173,4 @@ private async Task OnToggleColumnVisible(string columnName, bool visible)
await OnColumnVisibleChanged(columnName, visible);
}
}
-
- ///
- /// 当前所有列的是否全都显示/全都不显示/部分显示状态计算
- ///
- private CheckboxState VisibleColumnsCurrentSelectedResult
- => _visibleColumns.All(r => r.Visible)
- ? CheckboxState.Checked
- : _visibleColumns.All(r => !r.Visible)
- ? CheckboxState.UnChecked
- : CheckboxState.Indeterminate;
-
- private string _visibleColumnsSearchKey = "";
-
- ///
- /// 获得/设置 各列是否显示状态集合
- ///
- private List VisibleColumnsSearchResult
- => string.IsNullOrWhiteSpace(_visibleColumnsSearchKey)
- ? _visibleColumns : _visibleColumnsSearchResult;
-
- ///
- /// 获得/设置 各列是否显示状态集合
- ///
- private List _visibleColumnsSearchResult = [];
-
- private async Task SearchVisibleColumns(string searchKey)
- {
- _visibleColumnsSearchKey = searchKey;
- _visibleColumnsSearchResult = _visibleColumns
- .Where(r =>
- string.IsNullOrWhiteSpace(_visibleColumnsSearchKey) ||
- (r.DisplayName ?? r.Name).Contains(_visibleColumnsSearchKey))
- .ToList();
- await InvokeAsync(StateHasChanged);
- }
-
- private async Task InverseSelected()
- {
- foreach (var column in _visibleColumns)
- {
- column.Visible = !column.Visible;
- await OnToggleColumnVisible(column.Name, column.Visible);
- }
-
- if (VisibleColumnsCurrentSelectedResult == CheckboxState.UnChecked && _visibleColumns.Any())
- {
- await ShowToastAsync(
- ColumnGroupSelectButtonWarnToastTitle,
- ColumnGroupSelectButtonWarnToastContent, ToastCategory.Warning);
- _visibleColumns[0].Visible = true;
- await OnToggleColumnVisible(_visibleColumns[0].Name, true);
- }
- await InvokeAsync(StateHasChanged);
- }
-
- private async Task OnToggleAllColumnsVisibleState(CheckboxState state, string _)
- {
- if (state == CheckboxState.Checked)
- foreach (var column in _visibleColumns)
- {
- column.Visible = true;
- await OnToggleColumnVisible(column.Name, true);
- }
- else if (state == CheckboxState.UnChecked)
- {
- await ShowToastAsync(
- ColumnGroupSelectButtonWarnToastTitle,
- ColumnGroupSelectButtonWarnToastContent, ToastCategory.Warning);
- foreach (var column in _visibleColumns.Skip(1).ToList())
- {
- column.Visible = false;
- await OnToggleColumnVisible(column.Name, false);
- }
- }
- await InvokeAsync(StateHasChanged);
- }
}
From 790b6677c8cc1fb322fe54a7402c6af11579449f Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Sun, 21 Dec 2025 13:06:34 +0800
Subject: [PATCH 08/14] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Table/Table.razor.Localization.cs | 30 +------------------
1 file changed, 1 insertion(+), 29 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Localization.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Localization.cs
index f9b7d8eb8c9..a04091a140c 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.Localization.cs
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.Localization.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone
@@ -7,10 +7,6 @@
namespace BootstrapBlazor.Components;
-///
-///
-///
-///
public partial class Table
{
///
@@ -364,27 +360,6 @@ public partial class Table
[NotNull]
public string? AdvancedSortModalTitle { get; set; }
- ///
- /// 获得/设置 反选按钮文字信息
- ///
- [Parameter]
- [NotNull]
- public string? InverseSelectedButtonText { get; set; }
-
- ///
- /// 获得/设置 列选择增强警告标题
- ///
- [Parameter]
- [NotNull]
- public string? ColumnGroupSelectButtonWarnToastTitle { get; set; }
-
- ///
- /// 获得/设置 列选择增强警告内容
- ///
- [Parameter]
- [NotNull]
- public string? ColumnGroupSelectButtonWarnToastContent { get; set; }
-
[Inject]
[NotNull]
private IStringLocalizer>? Localizer { get; set; }
@@ -459,8 +434,5 @@ private void OnInitLocalization()
AlignCenterTooltipText ??= Localizer[nameof(AlignCenterTooltipText)];
AlignRightText ??= Localizer[nameof(AlignRightText)];
AlignRightTooltipText ??= Localizer[nameof(AlignRightTooltipText)];
- InverseSelectedButtonText ??= Localizer[nameof(InverseSelectedButtonText)];
- ColumnGroupSelectButtonWarnToastTitle ??= Localizer[nameof(ColumnGroupSelectButtonWarnToastTitle)];
- ColumnGroupSelectButtonWarnToastContent ??= Localizer[nameof(ColumnGroupSelectButtonWarnToastContent)];
}
}
From e082c6711d272cad04946935133df551ec39bbca Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Sun, 21 Dec 2025 13:07:34 +0800
Subject: [PATCH 09/14] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/BootstrapBlazor/Locales/en.json | 7 ++-----
src/BootstrapBlazor/Locales/zh.json | 7 ++-----
2 files changed, 4 insertions(+), 10 deletions(-)
diff --git a/src/BootstrapBlazor/Locales/en.json b/src/BootstrapBlazor/Locales/en.json
index 24534398de5..e817ba02757 100644
--- a/src/BootstrapBlazor/Locales/en.json
+++ b/src/BootstrapBlazor/Locales/en.json
@@ -1,4 +1,4 @@
-{
+{
"BootstrapBlazor.Components.AutoComplete": {
"NoDataTip": "No Data",
"PlaceHolder": "Please Input"
@@ -254,10 +254,7 @@
"AlignCenterText": "Center",
"AlignCenterTooltipText": "Click to align text in this column to the center",
"AlignRightText": "Right",
- "AlignRightTooltipText": "Click to align text in this column to the right",
- "InverseSelectedButtonText": "Toggle the visibility of the current column.",
- "ColumnGroupSelectButtonWarnToastTitle": "Warning",
- "ColumnGroupSelectButtonWarnToastContent": "Table must have at least one column displayed. When none are selected, the first column will remain visible by default."
+ "AlignRightTooltipText": "Click to align text in this column to the right"
},
"BootstrapBlazor.Components.EditDialog": {
"CloseButtonText": "Close",
diff --git a/src/BootstrapBlazor/Locales/zh.json b/src/BootstrapBlazor/Locales/zh.json
index 483b61d1b04..76fc9d04c26 100644
--- a/src/BootstrapBlazor/Locales/zh.json
+++ b/src/BootstrapBlazor/Locales/zh.json
@@ -1,4 +1,4 @@
-{
+{
"BootstrapBlazor.Components.AutoComplete": {
"NoDataTip": "无匹配数据",
"PlaceHolder": "请输入"
@@ -254,10 +254,7 @@
"AlignCenterText": "居中",
"AlignCenterTooltipText": "点击后本列文本居中对齐",
"AlignRightText": "右对齐",
- "AlignRightTooltipText": "点击后本列文本右对齐",
- "InverseSelectedButtonText": "反选当前列显示",
- "ColumnGroupSelectButtonWarnToastTitle": "提示",
- "ColumnGroupSelectButtonWarnToastContent": "表格需要至少有一列显示,全不选时默认第一列维持显示状态"
+ "AlignRightTooltipText": "点击后本列文本右对齐"
},
"BootstrapBlazor.Components.EditDialog": {
"CloseButtonText": "关闭",
From c386fa608795d5abe1ac443bd45a3220fe39accc Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Sun, 21 Dec 2025 14:15:16 +0800
Subject: [PATCH 10/14] =?UTF-8?q?doc:=20=E5=A2=9E=E5=8A=A0=E5=A4=9A?=
=?UTF-8?q?=E8=AF=AD=E8=A8=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/BootstrapBlazor/Locales/en.json | 4 +++-
src/BootstrapBlazor/Locales/zh.json | 4 +++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/BootstrapBlazor/Locales/en.json b/src/BootstrapBlazor/Locales/en.json
index e817ba02757..d6db3b4b02e 100644
--- a/src/BootstrapBlazor/Locales/en.json
+++ b/src/BootstrapBlazor/Locales/en.json
@@ -254,7 +254,9 @@
"AlignCenterText": "Center",
"AlignCenterTooltipText": "Click to align text in this column to the center",
"AlignRightText": "Right",
- "AlignRightTooltipText": "Click to align text in this column to the right"
+ "AlignRightTooltipText": "Click to align text in this column to the right",
+ "ColumnListSelectAllText": "All",
+ "ColumnListSelectInvertText": "Invert"
},
"BootstrapBlazor.Components.EditDialog": {
"CloseButtonText": "Close",
diff --git a/src/BootstrapBlazor/Locales/zh.json b/src/BootstrapBlazor/Locales/zh.json
index 76fc9d04c26..9ae5c40ded7 100644
--- a/src/BootstrapBlazor/Locales/zh.json
+++ b/src/BootstrapBlazor/Locales/zh.json
@@ -254,7 +254,9 @@
"AlignCenterText": "居中",
"AlignCenterTooltipText": "点击后本列文本居中对齐",
"AlignRightText": "右对齐",
- "AlignRightTooltipText": "点击后本列文本右对齐"
+ "AlignRightTooltipText": "点击后本列文本右对齐",
+ "ColumnListSelectAllText": "全选",
+ "ColumnListSelectInvertText": "反选"
},
"BootstrapBlazor.Components.EditDialog": {
"CloseButtonText": "关闭",
From 5522952123cc7bac6dffbab87f0549cb35e3c191 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Sun, 21 Dec 2025 14:15:48 +0800
Subject: [PATCH 11/14] feat(Table): add ShowColumnListControls parameter
---
.../Components/Table/Table.razor | 43 +++++++++++--------
.../Components/Table/Table.razor.Checkbox.cs | 21 +++++++++
.../Components/Table/Table.razor.Toolbar.cs | 6 +--
.../Components/Table/Table.razor.cs | 6 ++-
4 files changed, 54 insertions(+), 22 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor b/src/BootstrapBlazor/Components/Table/Table.razor
index 851355828c7..842cd253635 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor
+++ b/src/BootstrapBlazor/Components/Table/Table.razor
@@ -117,30 +117,29 @@
@ColumnButtonText
-
- @if (ShowColumnListSelectExtension)
+
+ @if (ShowColumnListControls)
{
-
- 全选
-
-
-
- 反选
-
-
+
+
+
+ @foreach (var item in _visibleColumns)
+ {
+ @RenderColumnListItem(item)
+ }
+
}
- @foreach (var item in _visibleColumns)
+ else
{
-
-
-
-
+ @foreach (var item in _visibleColumns)
+ {
+ @RenderColumnListItem(item)
+ }
}
@@ -1145,4 +1144,12 @@
GotoNavigatorLabelText="@GotoNavigatorLabelText"
ShowPageInfo="ShowPageInfo" PageInfoTemplate="InternalPageInfoTemplate"/>;
+ RenderFragment RenderColumnListItem => item =>
+ @
+
+
+
;
}
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
index 5cc59d08164..b9775225493 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs
@@ -173,4 +173,25 @@ private async Task OnToggleColumnVisible(string columnName, bool visible)
await OnColumnVisibleChanged(columnName, visible);
}
}
+
+ private void TriggerSelectAllColumnList()
+ {
+ foreach (var column in _visibleColumns)
+ {
+ column.Visible = true;
+ }
+ }
+
+ private void TriggerSelectInvertColumnList()
+ {
+ foreach (var column in _visibleColumns)
+ {
+ column.Visible = !column.Visible;
+ }
+
+ if (_visibleColumns.All(i => i.Visible == false))
+ {
+ _visibleColumns.First().Visible = true;
+ }
+ }
}
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs
index 99d74173000..e8b4f1699ab 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone
@@ -311,10 +311,10 @@ public Func? ShowDeleteButtonCallback
public bool ShowColumnList { get; set; }
///
- /// 获得/设置 列选择下拉框中是否显示扩展的选择功能默认为 false 不显示
+ /// 获得/设置 列选择下拉框中是否显示控制功能按钮默认为 false 不显示
///
[Parameter]
- public bool ShowColumnListSelectExtension { get; set; }
+ public bool ShowColumnListControls { get; set; }
///
/// 获得/设置 列选择下拉框图标
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.cs b/src/BootstrapBlazor/Components/Table/Table.razor.cs
index fd7ec0cba25..7b85ff48ce4 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.cs
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.cs
@@ -814,6 +814,10 @@ public async Task ExpandDetailRow(TItem item)
private bool _isFilterTrigger;
+ private string? DropdownListClassString => CssBuilder.Default("dropdown-menu dropdown-menu-end shadow")
+ .AddClass("dropdown-menu-controls", ShowColumnListControls)
+ .Build();
+
///
/// OnInitialized 方法
///
@@ -1044,7 +1048,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
if (_resetColDragListener)
{
- _resetColDragListener= false;
+ _resetColDragListener = false;
await InvokeVoidAsync("resetColDragListener", Id);
}
From b262ea304765a280e0782a4df57de1eaf00484be Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Sun, 21 Dec 2025 14:15:58 +0800
Subject: [PATCH 12/14] =?UTF-8?q?style:=20=E6=9B=B4=E6=96=B0=E6=BB=9A?=
=?UTF-8?q?=E5=8A=A8=E6=9D=A1=E6=A0=B7=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Components/Table/Table.razor.scss | 42 ++++++++-----------
1 file changed, 17 insertions(+), 25 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.scss b/src/BootstrapBlazor/Components/Table/Table.razor.scss
index 5faf59cb618..7591f140041 100644
--- a/src/BootstrapBlazor/Components/Table/Table.razor.scss
+++ b/src/BootstrapBlazor/Components/Table/Table.razor.scss
@@ -308,8 +308,23 @@
}
.table-toolbar .dropdown-column .dropdown-menu {
- max-height: var(--bb-table-columnlist-max-height);
- overflow: auto;
+
+ &:not(.dropdown-menu-controls) {
+ max-height: var(--bb-table-columnlist-max-height);
+ overflow: auto;
+ }
+
+ .column-list-controls {
+ display: flex;
+ flex-wrap: nowrap;
+ padding: 0 var(--bs-dropdown-item-padding-x);
+ margin-block-end: .5rem;
+ }
+
+ .column-list-items {
+ max-height: var(--bb-table-columnlist-max-height);
+ overflow: auto;
+ }
}
.table-toolbar .dropdown-menu .dropdown-item span {
@@ -975,26 +990,3 @@ form .table .table-cell > textarea {
margin-inline-end: .25rem;
}
}
-
-.dropdown-menu {
- .column-list-controls {
- display: flex;
- flex-wrap: nowrap;
- padding: 0 var(--bs-dropdown-item-padding-x);
- margin-block-end: .5rem;
-
- .column-list-controls-item {
- display: flex;
- justify-items: center;
- flex-wrap: nowrap;
-
- span {
- margin-inline-end: .25rem;
- }
- }
-
- .column-list-controls-item:not(:last-child) {
- margin-inline-end: .5rem;
- }
- }
-}
From 1a1ed1a2ac45b015a98a619ee1d8ee5fac9cf728 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Sun, 21 Dec 2025 14:22:41 +0800
Subject: [PATCH 13/14] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=E5=8D=95?=
=?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
test/UnitTest/Components/TableTest.cs | 36 +++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/test/UnitTest/Components/TableTest.cs b/test/UnitTest/Components/TableTest.cs
index 84285c06379..b7ed8c9ce07 100644
--- a/test/UnitTest/Components/TableTest.cs
+++ b/test/UnitTest/Components/TableTest.cs
@@ -8871,6 +8871,42 @@ public void Table_ShowMoreButton_Ok(TableRenderMode mode)
cut.Contains("dropdown-item-more-template
>();
+ var cut = Context.Render>(pb =>
+ {
+ pb.AddCascadingValue(new SortableList());
+ pb.Add(a => a.TableColumns, foo => builder =>
+ {
+ builder.OpenComponent>(0);
+ builder.AddAttribute(1, "Field", "Name");
+ builder.AddAttribute(2, "FieldExpression", Utility.GenerateValueExpression(foo, "Name", typeof(string)));
+ builder.CloseComponent();
+
+ builder.OpenComponent>(0);
+ builder.AddAttribute(1, "Field", "Address");
+ builder.AddAttribute(2, "FieldExpression", Utility.GenerateValueExpression(foo, "Address", typeof(string)));
+ builder.CloseComponent();
+ });
+ pb.Add(a => a.RenderMode, TableRenderMode.Table);
+ pb.Add(a => a.Items, Foo.GenerateFoo(localizer));
+ pb.Add(a => a.ShowToolbar, true);
+ pb.Add(a => a.ShowColumnList, true);
+ pb.Add(a => a.ShowColumnListControls, true);
+ });
+
+ cut.Contains("dropdown-menu dropdown-menu-end shadow dropdown-menu-controls");
+ cut.Contains("column-list-items");
+
+ var buttons = cut.FindAll(".column-list-controls button");
+ Assert.Equal(2, buttons.Count);
+
+ await cut.InvokeAsync(() => buttons[1].Click());
+ await cut.InvokeAsync(() => buttons[0].Click());
+ }
+
class SortableList : ISortableList { }
static bool ProhibitEdit(Table @this)
From 45c560d8339a2d45fbc99178b4345e5a6f3d1017 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Sun, 21 Dec 2025 14:29:20 +0800
Subject: [PATCH 14/14] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E7=A4=BA?=
=?UTF-8?q?=E4=BE=8B=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Components/Samples/Table/TablesColumnList.razor | 7 ++++---
src/BootstrapBlazor.Server/Locales/en-US.json | 3 ++-
src/BootstrapBlazor.Server/Locales/zh-CN.json | 3 ++-
3 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/BootstrapBlazor.Server/Components/Samples/Table/TablesColumnList.razor b/src/BootstrapBlazor.Server/Components/Samples/Table/TablesColumnList.razor
index dd0d96eeadc..ec2a6072130 100644
--- a/src/BootstrapBlazor.Server/Components/Samples/Table/TablesColumnList.razor
+++ b/src/BootstrapBlazor.Server/Components/Samples/Table/TablesColumnList.razor
@@ -1,4 +1,4 @@
-@page "/table/column/list"
+@page "/table/column/list"
@inject IStringLocalizer NavMenuLocalizer
@inject IStringLocalizer Localizer
@inject IOptions WebsiteOption
@@ -13,6 +13,7 @@
Name="Visible">
@((MarkupString)Localizer["VisibleP1"].Value)
+ @((MarkupString)Localizer["ShowColumnListControlsDesc"].Value)
@((MarkupString)Localizer["VisibleP2"].Value)
@((MarkupString)Localizer["VisibleP3"].Value)
@((MarkupString)Localizer["VisibleP4"].Value)
@@ -22,9 +23,9 @@
diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json
index d05ffb8dab7..080aac66f8a 100644
--- a/src/BootstrapBlazor.Server/Locales/en-US.json
+++ b/src/BootstrapBlazor.Server/Locales/en-US.json
@@ -5156,7 +5156,8 @@
"VisibleP3": "In this example, the quantity column is not displayed by setting Visible, and it can be displayed through the column control button",
"VisibleP4": "Trigger the OnColumnVisibleChanged callback when switch the column state Show/Hide ",
"ResetVisibleColumnsButtonText": "Set Columns",
- "ResetVisibleColumnsDesc": "Call the instancel method ResetVisibleColumns of Table for set the multiple columns visible value"
+ "ResetVisibleColumnsDesc": "Call the instancel method ResetVisibleColumns of Table for set the multiple columns visible value",
+ "ShowColumnListControlsDesc": "The ShowColumnListControls setting controls whether the column dropdown list displays control buttons. The built-in control buttons are All and Invert."
},
"BootstrapBlazor.Server.Components.Samples.Table.TablesColumnTemplate": {
"TablesColumnTitle": "Table Column",
diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json
index 2f8f525baf0..4f4bf8b06a6 100644
--- a/src/BootstrapBlazor.Server/Locales/zh-CN.json
+++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json
@@ -5156,7 +5156,8 @@
"VisibleP3": "此例中 数量 列通过设置 Visible 未显示,可以通过列控制按钮进行显示设置",
"VisibleP4": "更改 列 状态后触发 OnColumnVisibleChanged 回调委托",
"ResetVisibleColumnsButtonText": "设置列隐藏信息",
- "ResetVisibleColumnsDesc": "通过调用 Table 实例方法 ResetVisibleColumns 可设置任意列显示隐藏属性"
+ "ResetVisibleColumnsDesc": "通过调用 Table 实例方法 ResetVisibleColumns 可设置任意列显示隐藏属性",
+ "ShowColumnListControlsDesc": "通过设置 ShowColumnListControls 控制列下拉框是否显示控制按钮,内置控制按钮有 全选 与 反选 两个按钮"
},
"BootstrapBlazor.Server.Components.Samples.Table.TablesColumnTemplate": {
"TablesColumnTitle": "Table 表格",