126 lines
6.8 KiB
C#
126 lines
6.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Controls.Primitives;
|
|
using System.Windows.Data;
|
|
using ExtendedGrid.Classes;
|
|
using ExtendedGrid.ExtendedGridControl;
|
|
|
|
|
|
namespace ExtendedGrid.Converter
|
|
{
|
|
internal class RowSummariesValueConverter : IMultiValueConverter
|
|
{
|
|
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
|
|
{
|
|
UIElement currentStackPanel=null;
|
|
object value=null;
|
|
StackPanel stackPanel = null;
|
|
DataTable dt = null;
|
|
DataGridColumnHeader currentColumn = null;
|
|
ExtendedDataGrid grid;
|
|
try
|
|
{
|
|
if (values[0] == DependencyProperty.UnsetValue || values[1] == DependencyProperty.UnsetValue)
|
|
return "";
|
|
currentColumn = (DataGridColumnHeader)values[0];
|
|
grid = FindControls.FindParent<ExtendedDataGrid>(currentColumn);
|
|
if (grid == null)
|
|
return "";
|
|
dt = ((DataTable)values[1]);
|
|
if (currentColumn.Column == null)
|
|
{
|
|
return "";
|
|
}
|
|
string computation = parameter.ToString();
|
|
stackPanel = FindControls.FindChild<System.Windows.Controls.StackPanel>(currentColumn, null);
|
|
var currentColumnName = currentColumn.Column.SortMemberPath;
|
|
if (currentColumnName == null)
|
|
return "";
|
|
switch (computation)
|
|
{
|
|
case "Count":
|
|
value = dt.Rows[ExtendedDataGrid.Count][currentColumnName];
|
|
currentStackPanel = stackPanel == null ? null : stackPanel.Children[ExtendedDataGrid.Count];
|
|
return value == DBNull.Value ? string.Empty : (string.IsNullOrEmpty(grid.RowSummaryCountFormat) ? value : System.Convert.ToDecimal(value).ToString(grid.RowSummaryCountFormat, CultureInfo.InvariantCulture));
|
|
case "Sum":
|
|
value = dt.Rows[ExtendedDataGrid.Sum][currentColumnName];
|
|
currentStackPanel = stackPanel == null ? null : stackPanel.Children[ExtendedDataGrid.Sum];
|
|
return value == DBNull.Value ? string.Empty : (string.IsNullOrEmpty(grid.RowSummarySumFormat) ? value : System.Convert.ToDecimal(value).ToString(grid.RowSummarySumFormat, CultureInfo.InvariantCulture));
|
|
case "Average":
|
|
value = dt.Rows[ExtendedDataGrid.Average][currentColumnName];
|
|
currentStackPanel = stackPanel == null ? null : stackPanel.Children[ExtendedDataGrid.Average];
|
|
return value == DBNull.Value ? string.Empty : (string.IsNullOrEmpty(grid.RowSummaryAverageFormat) ? value : System.Convert.ToDecimal(value).ToString(grid.RowSummaryAverageFormat, CultureInfo.InvariantCulture));
|
|
case "Min":
|
|
value = dt.Rows[ExtendedDataGrid.Min][currentColumnName];
|
|
currentStackPanel = stackPanel == null ? null : stackPanel.Children[ExtendedDataGrid.Min];
|
|
return value == DBNull.Value ? string.Empty : (string.IsNullOrEmpty(grid.RowSummaryMinFormat) ? value : System.Convert.ToDecimal(value).ToString(grid.RowSummaryMinFormat, CultureInfo.InvariantCulture));
|
|
case "Max":
|
|
value = dt.Rows[ExtendedDataGrid.Max][currentColumnName];
|
|
currentStackPanel = stackPanel == null ? null : stackPanel.Children[ExtendedDataGrid.Max];
|
|
return value == DBNull.Value ? string.Empty : (string.IsNullOrEmpty(grid.RowSummaryMaxFormat) ? value : System.Convert.ToDecimal(value).ToString(grid.RowSummaryMaxFormat, CultureInfo.InvariantCulture));
|
|
case "Smallest":
|
|
value = dt.Rows[ExtendedDataGrid.Smallest][currentColumnName];
|
|
currentStackPanel = stackPanel == null ? null : stackPanel.Children[ExtendedDataGrid.Smallest];
|
|
return value == DBNull.Value ? string.Empty : (string.IsNullOrEmpty(grid.RowSummarySmallestFormat) ? value : System.Convert.ToDecimal(value).ToString(grid.RowSummarySmallestFormat, CultureInfo.InvariantCulture));
|
|
case "Largest":
|
|
value = dt.Rows[ExtendedDataGrid.Largest][currentColumnName];
|
|
currentStackPanel = stackPanel == null ? null : stackPanel.Children[ExtendedDataGrid.Largest];
|
|
return value == DBNull.Value ? string.Empty : (string.IsNullOrEmpty(grid.RowSummaryLargestFormat) ? value : System.Convert.ToDecimal(value).ToString(grid.RowSummaryLargestFormat, CultureInfo.InvariantCulture));
|
|
}
|
|
return "";
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return "";
|
|
}
|
|
finally
|
|
{
|
|
if (currentStackPanel!=null)
|
|
{
|
|
currentStackPanel.Visibility = string.IsNullOrEmpty(System.Convert.ToString(value)) ? Visibility.Collapsed : Visibility.Visible;
|
|
}
|
|
//Adjust height of the summary row
|
|
//get the actual height of one text box
|
|
if (stackPanel != null)
|
|
{
|
|
var heightOfSingleElement = ((TextBlock)((System.Windows.Controls.StackPanel)(stackPanel.Children[ExtendedDataGrid.Sum])).Children[0]).ActualHeight;
|
|
var countOfRowSummaries = new List<int>();
|
|
foreach(DataColumn col in dt.Columns)
|
|
{
|
|
int count = 0;
|
|
foreach(DataRow row in dt.Rows)
|
|
{
|
|
if(!string.IsNullOrEmpty(System.Convert.ToString(row[col.ColumnName])))
|
|
{
|
|
count++;
|
|
}
|
|
}
|
|
countOfRowSummaries.Add(count);
|
|
}
|
|
int maximumCount = countOfRowSummaries.Max();
|
|
var summariesGrid = FindControls.FindParent<DataGrid>(currentColumn);
|
|
if(summariesGrid!=null)
|
|
{
|
|
if (maximumCount>0)
|
|
summariesGrid.Height = maximumCount*heightOfSingleElement+5;
|
|
else
|
|
summariesGrid.Height = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
}
|
|
|
|
|