Files
SQLVision/SQLVision.Visualizers/Visualizers/TableVisualizer.cs
2026-01-05 00:37:54 +03:00

75 lines
2.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;
using SQLVision.Core.Enums;
using SQLVision.Core.Models;
using SQLVision.Visualizers.Interfaces;
using System.Data;
namespace SQLVision.Visualizers.Visualizers;
public class TableVisualizer : IVisualizer
{
public FrameworkElement Visualize(DataTable data, OutputDefinition definition)
{
var listView = new ListView
{
ItemsSource = data.DefaultView,
SelectionMode = ListViewSelectionMode.None,
IsItemClickEnabled = false,
HorizontalAlignment = HorizontalAlignment.Stretch,
VerticalAlignment = VerticalAlignment.Stretch
};
// Автоматическое создание колонок
listView.ItemTemplate = CreateDataTemplate(data);
var scrollViewer = new ScrollViewer
{
Content = listView,
HorizontalScrollBarVisibility = ScrollBarVisibility.Auto,
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
MaxHeight = 600
};
return scrollViewer;
}
private DataTemplate CreateDataTemplate(DataTable data)
{
var gridFactory = new FrameworkElementFactory(typeof(Grid));
// Создаем колонки
foreach (DataColumn column in data.Columns)
{
var columnDefinition = new ColumnDefinition();
gridFactory.AppendChild(columnDefinition);
}
// Создаем строку с текстовыми блоками
var stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel));
stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
foreach (DataColumn column in data.Columns)
{
var borderFactory = new FrameworkElementFactory(typeof(Border));
borderFactory.SetValue(Border.BorderThicknessProperty, new Thickness(0, 0, 1, 1));
borderFactory.SetValue(Border.BorderBrushProperty, new SolidColorBrush(Colors.LightGray));
var textBlockFactory = new FrameworkElementFactory(typeof(TextBlock));
textBlockFactory.SetBinding(TextBlock.TextProperty,
new Microsoft.UI.Xaml.Data.Binding { Path = new PropertyPath($"[{column.ColumnName}]") });
textBlockFactory.SetValue(TextBlock.MarginProperty, new Thickness(4));
textBlockFactory.SetValue(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center);
borderFactory.AppendChild(textBlockFactory);
stackPanelFactory.AppendChild(borderFactory);
}
gridFactory.AppendChild(stackPanelFactory);
return new DataTemplate { VisualTree = gridFactory };
}
public bool CanVisualize(OutputType type) => type == OutputType.Table;
}