alielie
2025-03-11 2e54b439c64e0adbb7e010243c1f33aa5fc5f503
HMI.DataViewer/DataViewer.xaml.cs
@@ -1,6 +1,19 @@
using System.Windows;
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 HMI.Base;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Media;
namespace HMI.DataViewer
{
@@ -11,11 +24,237 @@
    {
        public DataViewer()
        {
            DataContext = this;
            InitializeComponent();
        }
        private string SourceFilePath;
        private ObservableCollection<DataBase_Setting> settings = new ObservableCollection<DataBase_Setting>();
        public ObservableCollection<DataBase_Setting> Settings
        {
            get => settings;
            set { Set(ref settings, value); }
        }
        private ObservableCollection<QueryData> datas = new ObservableCollection<QueryData>();
        public ObservableCollection<QueryData> Datas
        {
            get => datas;
            set { Set(ref datas, value); }
        }
        private Dictionary<string, DataBase_Setting> Map = new Dictionary<string, DataBase_Setting>();
        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<string> names = new List<string>();
                Settings = XmlHelper.DeserializeFromXml<ObservableCollection<DataBase_Setting>>(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<QueryData>(
                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);
        }
    }