using HMI.Base; using HMI.Core.Util; using HMI.DataViewer.Entity; using HMI.UI.Util; using Panuon.WPF.UI; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.IO; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Data; using System.Windows.Media; namespace HMI.DataViewer { /// /// UserControl1.xaml 的交互逻辑 /// public partial class DataViewer : PluginControl { public DataViewer() { DataContext = this; InitializeComponent(); } private string SourceFilePath; private ObservableCollection settings = new ObservableCollection(); public ObservableCollection Settings { get => settings; set { Set(ref settings, value); } } private ObservableCollection datas = new ObservableCollection(); public ObservableCollection Datas { get => datas; set { Set(ref datas, value); } } private Dictionary Map = new Dictionary(); private void Button_Click(object sender, RoutedEventArgs e) { Button btn = sender as Button; switch (btn.Name) { case "addBtn": OpenSettingModal(new DataBase_Setting()); break; case "rfhBtn": break; case "delBtn": break; case "srhBtn": SearchData(); break; case "resetBtn": ResetDataTable(); break; default: break; } } private void OpenSettingModal(DataBase_Setting data) { DbSettingModal modal = new DbSettingModal(log) { Title = "新增数据源", Owner = Window.GetWindow(this) }; if (modal.Open(-1, data, Settings, SourceFilePath) == true) { LoadData(); } } private void SearchData() { string program = programInput.Text; if (!Map.ContainsKey(program)) { ToastHelper.Error(Window.GetWindow(this), "参数异常,请刷新重试"); return; } var datas = Datas?.Where(d => !string.IsNullOrEmpty(d.Value)).ToList(); if (datas == null || datas.Count <= 0) { ToastHelper.Warning(Window.GetWindow(this), "请设置查询条件值"); return; } DataBase_Setting setting = Map[program]; string fields = string.Join(",", Datas?.Select(d => $"[{d.Key}]").ToList()); string conditon = string.Join(" AND ", datas.Select(d => $"[{d.Key}] {d.Condition} '{d.Value}'").ToList()); string timeCol = setting.TimeCol; if (string.IsNullOrEmpty(timeCol)) { timeCol = "time"; } if (!string.IsNullOrEmpty(startTimeInput.Text)) { conditon += $" AND {timeCol} >= '{startTimeInput.Text}'"; } if (!string.IsNullOrEmpty(endTimeInput.Text)) { conditon += $" AND {timeCol} < '{endTimeInput.Text}'"; } conditon = string.IsNullOrEmpty(conditon) ? string.Empty : $" WHERE {conditon}"; SqliteHelper helper = null; string sql = string.Empty; try { helper = new SqliteHelper(setting.DBFilePath); sql = $"SELECT {fields} FROM {setting.TableName} {conditon}"; DataTable dt = helper.GetDataTable(sql); HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null); dataTable.ItemsSource = dt.DefaultView; } catch (Exception ex) { log.Error($"Select Data Failed. SQL: {sql}", ex); ToastHelper.Error(Window.GetWindow(this), $"查询失败!{ex.Message}"); } finally { helper?.Close(); } } private void ResetDataTable() { startTimeInput.SelectedDateTime = null; endTimeInput.SelectedDateTime = null; dataTable.ItemsSource = null; foreach (var data in Datas) { data.Value = null; } } public override void SetBaseFolder(string folder) { base.SetBaseFolder(folder); SourceFilePath = Path.Combine(BaseFolder, "SourceData.setting"); } private void PluginControl_Loaded(object sender, RoutedEventArgs e) { LoadData(); Loaded -= PluginControl_Loaded; } private void LoadData() { if (File.Exists(SourceFilePath)) { List names = new List(); Settings = XmlHelper.DeserializeFromXml>(SourceFilePath); Map.Clear(); foreach (var data in Settings) { Map.Add(data.Program, data); names.Add(data.Program); } programInput.ItemsSource = names; } } private void programInput_SelectionChanged(object sender, SelectionChangedEventArgs e) { var key = e.AddedItems[0].ToString(); if (!Map.ContainsKey(key)) { ToastHelper.Error(Window.GetWindow(this), "参数异常,请刷新重试"); return; } DataBase_Setting setting = Map[key]; Datas = new ObservableCollection( setting?.Condition?.Select(d => new QueryData { Key = d.Key, Name = d.Desc, Condition = "=" }).ToList()); var temp = dataTable.Columns[0]; HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null); dataTable.Columns.Clear(); dataTable.Columns.Add(temp); foreach (var data in Datas) { AddDataGridTextColumn(data.Name, data.Key); } } private void AddDataGridTextColumn(string header, string bindingPath) { DataGridTextColumn textColumn = new DataGridTextColumn { Header = header, Binding = new Binding(bindingPath), Width = new DataGridLength(1, DataGridLengthUnitType.Star) }; dataTable.Columns.Add(textColumn); } private void dataTable_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { // 获取点击的元素 DependencyObject dep = (DependencyObject)e.OriginalSource; // 遍历找到 DataGridColumnHeader while (dep != null && !(dep is DataGridColumnHeader) && !(dep is DataGridRow)) { dep = VisualTreeHelper.GetParent(dep); } HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null); if (dep is DataGridColumnHeader columnHeader) { // 获取列索引 int columnIndex = columnHeader.Column.DisplayIndex; // 清除已有选择 dataTable.SelectedCells.Clear(); // 遍历所有行,选中该列的所有单元格 foreach (var item in dataTable.Items) { DataGridCellInfo cellInfo = new DataGridCellInfo(item, columnHeader.Column); dataTable.SelectedCells.Add(cellInfo); } HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, columnHeader.Column); e.Handled = true; // 防止默认行为 } else if (dep is DataGridRow row) { // 清除已有选择 dataTable.SelectedCells.Clear(); dataTable.SelectedItem = row.Item; e.Handled = true; } } private void MenuItem_Click(object sender, RoutedEventArgs e) { DataGridColumn column = HMI.UI.DpUtil.DataGridHelper.GetSelectedColumn(dataTable); } } }