feat: DataGrid 동적 생성 기능 추가중

hhsung_work
HyungJune Kim 10 months ago
parent aa65046922
commit f3c5b5cd2c

@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows;
namespace SmartAquaViewer.Classes
{
public static class DataGridAutoBuilder
{
public static void BuildColumnsFromType<T>(DataGrid grid, IEnumerable<T> items,
Dictionary<string, string> headerMap = null, string dateFormat = "yyyy-MM-dd HH:mm:ss")
{
grid.Columns.Clear();
var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var p in props)
{
DataGridColumn col = CreateColumnForProperty(p, headerMap, dateFormat);
if (col != null) grid.Columns.Add(col);
}
grid.ItemsSource = items;
}
private static DataGridColumn CreateColumnForProperty(PropertyInfo p,
Dictionary<string, string> headerMap, string dateFormat)
{
string header = headerMap != null && headerMap.TryGetValue(p.Name, out var h) ? h : p.Name;
var type = Nullable.GetUnderlyingType(p.PropertyType) ?? p.PropertyType;
// bool → CheckBox
if (type == typeof(bool))
{
return new DataGridCheckBoxColumn
{
Header = header,
Binding = new Binding(p.Name) { Mode = BindingMode.TwoWay }
};
}
// enum → ComboBox(읽기/쓰기)
if (type.IsEnum)
{
return new DataGridComboBoxColumn
{
Header = header,
ItemsSource = Enum.GetValues(type),
SelectedItemBinding = new Binding(p.Name) { Mode = BindingMode.TwoWay }
};
}
// DateTime → 포맷
if (type == typeof(DateTime))
{
return new DataGridTextColumn
{
Header = header,
Binding = new Binding(p.Name)
{
Mode = BindingMode.TwoWay,
StringFormat = dateFormat
}
};
}
// 숫자 → 우측정렬
if (type == typeof(int) || type == typeof(long) ||
type == typeof(float) || type == typeof(double) || type == typeof(decimal))
{
var col = new DataGridTextColumn
{
Header = header,
Binding = new Binding(p.Name) { Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }
};
col.ElementStyle = new Style(typeof(TextBlock))
{
Setters = { new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right) }
};
return col;
}
// 기본(문자 등)
return new DataGridTextColumn
{
Header = header,
Binding = new Binding(p.Name) { Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }
};
}
}
}

@ -9,6 +9,7 @@ using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using SmartAquaViewer.DataAnalisys;
using SmartAquaViewer.Model;
namespace SmartAquaViewer
{
@ -27,6 +28,7 @@ namespace SmartAquaViewer
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
var sampleData = WaterQualityVO.GetSampleData(new DateTime(2025, 8, 1), new DateTime(2025, 8, 5), 10);
Datas.SetWaterQualityVO(sampleData);
}
}
}

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SmartAquaViewer.DataAnalisys;
namespace SmartAquaViewer.Model
{
public class Datas
{
public static List<WaterQualityVO> WaterQualityList { get; set; }
static Datas()
{
WaterQualityList = new List<WaterQualityVO>();
}
public static List<WaterQualityVO> GetWaterQualityVO()
{
return WaterQualityList;
}
public static void SetWaterQualityVO(List<WaterQualityVO> sampleData)
{
WaterQualityList = sampleData;
}
}
}

@ -12,6 +12,8 @@ using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using SmartAquaViewer.Classes;
using SmartAquaViewer.Model;
using SmartAquaViewer.ViewModel;
using static SmartAquaViewer.Model.Enums;
@ -24,8 +26,6 @@ namespace SmartAquaViewer.View
{
private MonitoringViewModel? monitoringViewModel;
private PanelState _state = PanelState.Normal;
public MonitoringView()
{
InitializeComponent();
@ -35,6 +35,44 @@ namespace SmartAquaViewer.View
private void MonitoringViewModel_OnSystemChanged(string systemName)
{
switch (systemName)
{
case "Tank":
break;
case "Filter":
break;
case "System3":
break;
default:
break;
}
}
private void GetTankData()
{
//var waterTanksGroup = Datas.GetWaterQualityVO().GroupBy(w => w.WaterTank.WaterTankNum);
//foreach (var group in waterTanksGroup)
//{
// DataGrid dataGrid = new DataGrid();
// group.ToList()
// DataGridAutoBuilder.BuildColumnsFromType(dataGrid, group, new Dictionary<string, string>
// {
// { nameof(DataAnalisys.WaterQualityVO.Timestamp), "시간" },
// { nameof(DataAnalisys.WaterTank.DO), "DO센서 (mg/L)" },
// { nameof(DataAnalisys.WaterTank.PH), "pH센서" },
// { nameof(DataAnalisys.WaterTank.ORP), "ORP센서 (mV)" },
// { nameof(DataAnalisys.WaterTank.Temperature), "수온 (°C)" },
// { nameof(DataAnalisys.WaterTank.FlowRate), "유량 (m³/s)"}
// });
//}
}
}

Loading…
Cancel
Save