您的位置:首页 > 其它

130517Dev GridControl建立多行复杂表头(Banded View)时,统计列与对应列无法对齐的解决办法

2013-05-17 14:08 513 查看
使用Dev GridControl建立多行复杂表头时,TotalSummaryItem统计列始终无法与对应列对齐,也无法与对应列一起调整宽度。

最终通过Dev官方网站的技术支持那里得到了最终解决办法,公布如下,供大家参考。

具体的实现原理我也不太懂,总而言之,按照该方法,粘贴部分代码到自己的项目中,能够解决问题。

MainWindow.xaml代码:

using System;
using System.Windows;
using DevExpress.Xpf.Grid;
using System.Windows.Controls;
using System.Windows.Data;

namespace GridExample {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
}

public class Data {
public string First { get; set; }
public string Second { get; set; }
}

public class BandedTotalSummaryItemsControl : TotalSummaryItemsControl {
public static readonly DependencyProperty ViewProperty =
DependencyProperty.Register("View", typeof(DataViewBase), typeof(BandedTotalSummaryItemsControl), null);
public DataViewBase View {
get { return (DataViewBase)GetValue(ViewProperty); }
set { SetValue(ViewProperty, value); }
}

public BandedViewBehavior BandBehavior { get { return BandedViewBehavior.GetBandBehaviour((TableView)View); } }
Grid LayoutPanel { get { return (Grid)Panel; } }

public BandedTotalSummaryItemsControl() {
Loaded += OnLoaded;
}

protected override FrameworkElement CreateChild(object item) {
FrameworkElement res = base.CreateChild(item);
GridColumnData cellData = (GridColumnData)item;
ColumnBase gridColumn = cellData.Column;
int row = BandedViewBehavior.GetRow(gridColumn);
int column = BandedViewBehavior.GetColumn(gridColumn) + 1;
int rowSpan = BandedViewBehavior.GetRowSpan(gridColumn);
int columnSpan = BandedViewBehavior.GetColumnSpan(gridColumn);
Grid.SetRow(res, row);
Grid.SetColumn(res, column);
Grid.SetRowSpan(res, rowSpan);
Grid.SetColumnSpan(res, columnSpan);
if (BandedViewBehavior.GetIsBand(gridColumn)) res.Visibility = Visibility.Collapsed;
else res.Visibility = Visibility.Visible;
return res;
}
protected override void ValidateVisualTree() {
PreparePanel();
base.ValidateVisualTree();
}
void OnLoaded(object sender, RoutedEventArgs e) {
ClearPanel();
}
void ClearPanel() {
if (View == null || LayoutPanel == null) return;
InvalidateMeasure();
LayoutPanel.ColumnDefinitions.Clear();
LayoutPanel.RowDefinitions.Clear();
}
void PreparePanel() {
if (View == null || LayoutPanel == null) return;
if (LayoutPanel.ColumnDefinitions.Count != 0 || LayoutPanel.RowDefinitions.Count != 0) return;
CreateCorrectingColumn();
foreach (DevExpress.Xpf.Grid.ColumnDefinition columnDefinition in BandBehavior.ColumnDefinitions)
LayoutPanel.ColumnDefinitions.Add(columnDefinition.CreateGridColumnDefinition());
foreach (DevExpress.Xpf.Grid.RowDefinition rowDefinition in BandBehavior.RowDefinitions)
LayoutPanel.RowDefinitions.Add(rowDefinition.CreateGridRowDefinition());
}
void CreateCorrectingColumn() {
System.Windows.Controls.ColumnDefinition res = new System.Windows.Controls.ColumnDefinition();
Binding b = new Binding("GroupCount");
b.Source = ((GridControl)View.DataControl);
b.Converter = new GridLengthValueConverter();
b.ConverterParameter = ((TableView)View).LeftGroupAreaIndent;
BindingOperations.SetBinding(res, System.Windows.Controls.ColumnDefinition.WidthProperty, b);
LayoutPanel.ColumnDefinitions.Insert(0, res);

Binding b1 = new Binding("Level");
b1.Source = DataContext;
b1.Converter = new ValueConverter();
b1.ConverterParameter = ((TableView)View).LeftGroupAreaIndent;
BindingOperations.SetBinding(this, CellLayoutControl.MarginProperty, b1);
}
class ValueConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
double res = (int)value * (double)parameter;
return new Thickness() { Left = -res };
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
throw new NotImplementedException();
}
}
}
}


View Code
类BandedTotalSummaryItemsControl 是重点,必须粘贴;xaml文件中<dxg:TableView.FooterTemplate>... ...</dxg:TableView.FooterTemplate>是重点,必须粘贴。

最终实现效果很好,和WinForm中的效果是一样滴。

最后感谢Dev的工程师。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: