|
@@ -27,6 +27,7 @@ using System.Windows.Controls.Primitives;
|
|
|
using NPOI.OpenXmlFormats.Dml;
|
|
|
using System.Windows.Navigation;
|
|
|
using NavigationMode = Syncfusion.UI.Xaml.Grid.NavigationMode;
|
|
|
+using javax.sql.rowset;
|
|
|
|
|
|
namespace InABox.DynamicGrid;
|
|
|
|
|
@@ -452,7 +453,7 @@ public class DynamicGridTreeUIComponent<T, TKey> : IDynamicGridUIComponent<T>, I
|
|
|
// Syncfusion has given us the row index, so it also will give us the correct row, after sorting.
|
|
|
// Hence, here we use the syncfusion DataGrid.GetRecordAtRowIndex, which *should* always return a DataRowView.
|
|
|
var row = _tree.GetNodeAtRowIndex(rowIndex);
|
|
|
- return row.Item as CoreTreeNode<TKey>;
|
|
|
+ return row?.Item as CoreTreeNode<TKey>;
|
|
|
}
|
|
|
|
|
|
private CoreRow? GetRowFromIndex(int rowIndex)
|
|
@@ -1122,6 +1123,49 @@ public class DynamicGridTreeUIComponent<T, TKey> : IDynamicGridUIComponent<T>, I
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
+ private IEnumerable<CoreRow> FilterRows(IEnumerable<CoreRow> rows)
|
|
|
+ {
|
|
|
+ var rowList = rows.Select(x => new
|
|
|
+ {
|
|
|
+ Row = x,
|
|
|
+ ID = GetIDKey(x),
|
|
|
+ Parent = GetParentKey(x)
|
|
|
+ }).ToArray();
|
|
|
+
|
|
|
+ var nullKey = new object();
|
|
|
+
|
|
|
+ var allRows = rowList.ToDictionary(x => x.ID ?? nullKey);
|
|
|
+ var lastAdded = rowList.Where(x => FilterRow(x.Row)).ToHashSet();
|
|
|
+ var allFilteredRows = lastAdded.ToHashSet();
|
|
|
+ var allFilteredRows1 = lastAdded.ToHashSet();
|
|
|
+
|
|
|
+ bool updated = true;
|
|
|
+ while (updated)
|
|
|
+ {
|
|
|
+ updated = false;
|
|
|
+
|
|
|
+ var currentSet = lastAdded.NewEmpty().ToHashSet();
|
|
|
+ foreach(var row in lastAdded)
|
|
|
+ {
|
|
|
+ if(allRows.TryGetValue(row.Parent ?? nullKey, out var parent))
|
|
|
+ {
|
|
|
+ updated = allFilteredRows.Add(parent) || updated;
|
|
|
+ currentSet.Add(parent);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ foreach(var row in rowList)
|
|
|
+ {
|
|
|
+ if(allRows.TryGetValue(row.Parent ?? nullKey, out var parent) && allFilteredRows1.Contains(parent))
|
|
|
+ {
|
|
|
+ updated = allFilteredRows1.Add(row) || updated;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ lastAdded = currentSet;
|
|
|
+ }
|
|
|
+
|
|
|
+ return rowList.Where(x => allFilteredRows.Contains(x) || allFilteredRows1.Contains(x)).Select(x => x.Row);
|
|
|
+ }
|
|
|
|
|
|
private void SetFilterUIButton(TreeGridColumn gridColumn, DynamicColumnBase column)
|
|
|
{
|
|
@@ -1715,7 +1759,7 @@ public class DynamicGridTreeUIComponent<T, TKey> : IDynamicGridUIComponent<T>, I
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- foreach (var row in data.Rows.Where(FilterRow))
|
|
|
+ foreach (var row in FilterRows(data.Rows))
|
|
|
{
|
|
|
var newRow = _innerTable.NewRow();
|
|
|
ProcessRow(newRow, row);
|
|
@@ -1752,7 +1796,7 @@ public class DynamicGridTreeUIComponent<T, TKey> : IDynamicGridUIComponent<T>, I
|
|
|
_rowMap.Clear();
|
|
|
}
|
|
|
|
|
|
- foreach(var row in rows.Where(FilterRow))
|
|
|
+ foreach(var row in FilterRows(rows))
|
|
|
{
|
|
|
var newRow = _innerTable.NewRow();
|
|
|
ProcessRow(newRow, row);
|