This repository has been archived on 2024-01-02. You can view files and clone it, but cannot push or open issues or pull requests.
Sic06/Yalv/YALV/Common/FilteredGridManager.cs

143 lines
5.2 KiB
C#
Raw Normal View History

2023-01-13 10:57:37 +08:00
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using YALV.Common.Converters;
using YALV.Core.Domain;
using YALV.Properties;
namespace YALV.Common
{
public class FilteredGridManager
: FilteredGridManagerBase
{
public FilteredGridManager(DataGrid dg, Panel txtSearchPanel, KeyEventHandler keyUpEvent)
: base(dg, txtSearchPanel, keyUpEvent)
{
_centerCellStyle = Application.Current.FindResource("CenterDataGridCellStyle") as Style;
_adjConv = new AdjustValueConverter();
}
#region Private Properties
private Style _centerCellStyle;
private AdjustValueConverter _adjConv;
#endregion
#region Public Methods
public void BuildDataGrid(IList<ColumnItem> columns)
{
if (_dg == null)
return;
if (_filterPropertyList == null)
_filterPropertyList = new List<string>();
else
_filterPropertyList.Clear();
if (columns != null)
{
foreach (ColumnItem item in columns)
{
DataGridTextColumn col = new DataGridTextColumn();
col.Header = item.Header;
if (item.Alignment == CellAlignment.CENTER && _centerCellStyle != null)
col.CellStyle = _centerCellStyle;
if (item.MinWidth != null)
col.MinWidth = item.MinWidth.Value;
if (item.Width != null)
col.Width = item.Width.Value;
Binding bind = new Binding(item.Field) { Mode = BindingMode.OneWay };
bind.ConverterCulture = System.Globalization.CultureInfo.GetCultureInfo(Properties.Resources.CultureName);
if (!String.IsNullOrWhiteSpace(item.StringFormat))
bind.StringFormat = item.StringFormat;
col.Binding = bind;
//Add column to datagrid
_dg.Columns.Add(col);
if (_txtSearchPanel != null)
{
Binding widthBind = new Binding()
{
Path = new PropertyPath("ActualWidth"),
Source = col,
Mode = BindingMode.OneWay,
Converter = _adjConv,
ConverterParameter = "-2"
};
TextBox txt = new TextBox();
Style txtStyle = Application.Current.FindResource("RoundWatermarkTextBox") as Style;
if (txtStyle != null)
txt.Style = txtStyle;
txt.Name = getTextBoxName(item.Field);
txt.ToolTip = String.Format(Resources.FilteredGridManager_BuildDataGrid_FilterTextBox_Tooltip, item.Header);
txt.Tag = txt.ToolTip.ToString().ToLower();
txt.Text = string.Empty;
txt.AcceptsReturn = false;
txt.SetBinding(TextBox.WidthProperty, widthBind);
_filterPropertyList.Add(item.Field);
if (_keyUpEvent != null)
txt.KeyUp += _keyUpEvent;
RegisterControl<TextBox>(_txtSearchPanel, txt.Name, txt);
_txtSearchPanel.Children.Add(txt);
}
}
}
_dg.ColumnReordered += OnColumnReordered;
}
#endregion
#region Private methods
private void OnColumnReordered(object sender, DataGridColumnEventArgs dataGridColumnEventArgs)
{
if (dataGridColumnEventArgs.Column == null || !(dataGridColumnEventArgs.Column is DataGridBoundColumn))
return;
Binding colBind = ((DataGridBoundColumn)dataGridColumnEventArgs.Column).Binding as Binding;
if (colBind == null || colBind.Path == null)
return;
string field = colBind.Path.Path;
if (String.IsNullOrWhiteSpace(field))
return;
int displayOrder = dataGridColumnEventArgs.Column.DisplayIndex;
string textBoxName = getTextBoxName(field);
TextBox textBox = (from tb in _txtSearchPanel.Children.OfType<TextBox>()
where tb.Name == textBoxName
select tb).FirstOrDefault<TextBox>();
if (textBox == null)
return;
_txtSearchPanel.Children.Remove(textBox);
_txtSearchPanel.Children.Insert(displayOrder, textBox);
}
private void RegisterControl<T>(FrameworkElement element, string controlName, T control)
{
if ((T)element.FindName(controlName) != null)
{
element.UnregisterName(controlName);
}
element.RegisterName(controlName, control);
}
#endregion
}
}