using MeterVision.Config; using MeterVision.db; using MeterVision.Dlg; using MeterVision.Helper; using MeterVision.model; using MeterVision.Stand; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace MeterVision.Station { /// /// UCStationGrid.xaml 的交互逻辑 /// public partial class UCStationGrid : UserControl, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); public BulkObservableCollection StationItemList { get; set; } //修改站点参数配置命令 //public event Action Station_Config; //修改站点事件 //public static Action OnUpdateItem; public event Action OnStationItemChange; private StationItem _selectedStationItem; public StationItem SelectedStationItem { get => _selectedStationItem; set { if(_selectedStationItem != value) { _selectedStationItem = value; OnPropertyChanged(nameof(SelectedStationItem)); OnStationItemChange?.Invoke(value); } } } //要查找的站点ID private string _findStationId; private string _standId; private MarkFindType _markFindType; public async void ChangeFindAsync(string stationId, MarkFindType markFindType, string standId) { await ChangeFind(stationId, markFindType, standId); } public async Task ChangeFind(string stationId, MarkFindType markFindType,string standId) { if (!await _semaphore.WaitAsync(0)) return; // 防止重复调用 try { _findStationId = stationId; _standId = standId; _markFindType = markFindType; StationPage.InitDefaulValue(); await LoadStationItemList(true); } catch { } finally { _semaphore.Release(); } } public CfginiItem mConfigItem { get; set; } public PageModel StationPage { get; set; } private int _totalRecords; public int TotalRecords { get => _totalRecords; set { if(_totalRecords != value) { _totalRecords = value; OnPropertyChanged(nameof(TotalRecords)); } } } public UCStationGrid() { InitializeComponent(); StationItemList = new BulkObservableCollection(); dgStation.ItemsSource = StationItemList; mConfigItem = CfginiItem.GetConfigItem(); StationPage = new PageModel { PageSize = mConfigItem.PageSize2, //mConfigItem.PatchPageSize, PageNumber = 1 }; //mConfigItem.OnPatchPageSizeChanged += MConfigItem_OnPatchPageSizeChanged; mConfigItem.OnPageSize2Changed += MConfigItem_OnPageSize2Changed; this.DataContext = this; } private async void MConfigItem_OnPageSize2Changed(int pageSize2) { if (!await _semaphore.WaitAsync(0)) return; // 防止重复调用 try { StationPage.InitDefaulValue(pageSize2); await LoadStationItemList(true); } catch { } finally { _semaphore.Release(); } } public void ChangeMarkCount() { if(SelectedStationItem == null) { return; } int iMarkCount = DBStation.GetMarkCount(SelectedStationItem.Id); SelectedStationItem.MarkCount = iMarkCount; } private async Task LoadStationItemList(bool scrollTop) { StationItemList.Clear(); if(_findStationId == null) { return; } try { var result = await Task.Run(() => { //return DBStation.GetPagedTStations(StationPage.PageNumber, StationPage.PageSize, return DBStation.GetPagedVStations(StationPage.PageNumber, StationPage.PageSize, _findStationId, _markFindType,_standId); }); //更新分页信息 TotalRecords = result.Item1; StationPage.PageCount = result.Item2; List stationList = result.Item3; //在主线中更新数据 //Application.Current.Dispatcher.BeginInvoke(new Action(() => //{ //int index = 0; //foreach(TStation station in stationList) //{ // index++; // StationItem item = new StationItem(station); // item.Index = index + ((StationPage.PageNumber - 1) * StationPage.PageSize); // StationItemList.Add(item); //} var stationItems = stationList.Select((station, i) => new StationItem(station) { Index = (StationPage.PageNumber - 1) * StationPage.PageSize + i + 1 }).ToList(); StationItemList.AddRange(stationItems); //StationItemList.Re //SelectedStationItem = null; if(StationItemList.Count > 0 && scrollTop) { //await Task.Delay(100); await Dispatcher.BeginInvoke(new Action(() => { var scrollViewer = GetScrollViewer(dgStation); scrollViewer?.ScrollToTop(); //dgStation.ScrollIntoView(dgStation.Items[0]); })); } //})); } catch(Exception ex) { MessageBox.Show(Application.Current.MainWindow, $"b加载数据是发生错误:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } //if(StationItemList.Count > 0) //{ // SelectedStationItem = StationItemList[0]; //} //else //{ // SelectedStationItem = null; //} } private ScrollViewer _scrollViewer; private ScrollViewer GetScrollViewer(DependencyObject obj) { if (_scrollViewer != null) { return _scrollViewer; } if (obj is ScrollViewer) { _scrollViewer = (ScrollViewer)obj; return obj as ScrollViewer; } for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { var child = VisualTreeHelper.GetChild(obj, i); var scrollViewer = GetScrollViewer(child); if (scrollViewer != null) { _scrollViewer = scrollViewer; return scrollViewer; } } return null; } private void MiUpdate_Click(object sender, RoutedEventArgs e) { if (SelectedStationItem == null) return; EditStationDlg2 dialog = new EditStationDlg2(SelectedStationItem) { Owner = Application.Current.MainWindow, WindowStartupLocation = WindowStartupLocation.CenterOwner }; if (dialog.ShowDialog() == true) { SelectedStationItem = dialog.mStationItem; } //Station_Config?.Invoke(SelectedStationItem); } private void MiDelete_Click(object sender, RoutedEventArgs e) { if (SelectedStationItem == null) return; //获取当前行绑定的数据项 DeleteSelectedItem(SelectedStationItem); } private static T FindAncestor(DependencyObject dependencyObject) where T : DependencyObject { var parent = VisualTreeHelper.GetParent(dependencyObject); if (parent == null) return null; var parentT = parent as T; return parentT ?? FindAncestor(parent); } private void BtnUpdateStation_Click(object sender, RoutedEventArgs e) { Button button = sender as Button; if (button == null) return; DataGridRow row = FindAncestor(button); if (row == null) return; StationItem stationItem = row.Item as StationItem; EditStationDlg2 dialog = new EditStationDlg2(stationItem) { Owner = Application.Current.MainWindow, WindowStartupLocation = WindowStartupLocation.CenterOwner }; if (dialog.ShowDialog() == true) { stationItem = dialog.mStationItem; } //Station_Config?.Invoke(SelectedStationItem); } private void BtnDeleteStation_Click(object sender, RoutedEventArgs e) { Button button = sender as Button; if (button == null) return; DataGridRow row = FindAncestor(button); if (row == null) return; StationItem stationItem = row.Item as StationItem; DeleteSelectedItem(stationItem); } private async void DeleteSelectedItem(StationItem selectedItem) { if (selectedItem == null) return; MessageBoxResult result = MessageBox.Show("确定要删除此条目吗?", "确认删除", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result != MessageBoxResult.Yes) return; string titleInfo = "正在删除,请稍后..."; WaitWindow waitWindow = new WaitWindow(titleInfo) { Owner = Application.Current.MainWindow, WindowStartupLocation = WindowStartupLocation.CenterOwner }; waitWindow.Show(); try { bool deleteSuccess = false; await Task.Run(() => { deleteSuccess = DBStation.DeleteStationAndStandDetails(selectedItem.StandId, selectedItem.StationId); //DBStation.DeleteTStation(selectedItem.StationId); }); if (deleteSuccess) { //await Application.Current.Dispatcher.BeginInvoke(new Action(() => //{ // 从数据源中移除该条目 StationItemList.Remove(selectedItem); SelectedStationItem = null; //})); } } catch (Exception ex) { MessageBox.Show(Application.Current.MainWindow, $"删除失败:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } finally { waitWindow.Close(); } } public async void ClearAllStation() { if (!await _semaphore.WaitAsync(0)) return; // 防止重复调用 try { //清空提示 MessageBoxResult result = MessageBox.Show("确定要清空所有数据吗?", "确认清空", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result != MessageBoxResult.Yes) return; string titleInfo = "正在清空数据,请稍后..."; WaitWindow waitWindow = new WaitWindow(titleInfo) { Owner = Application.Current.MainWindow, WindowStartupLocation = WindowStartupLocation.CenterOwner }; waitWindow.Show(); try { bool blClearAll = false; await Task.Run(() => { blClearAll = DBStation.ClearTStationTable(); }); if (blClearAll) { StationPage.InitDefaulValue(); await LoadStationItemList(true); } } catch (Exception ex) { MessageBox.Show(Application.Current.MainWindow, $"清空失败:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } finally { waitWindow.Close(); } } catch { } finally { _semaphore.Release(); } } public async Task NextPage() { if (!await _semaphore.WaitAsync(0)) return; // 防止重复调用 try { if (StationPage.PageNumber < StationPage.PageCount) { StationPage.PageNumber += 1; await LoadStationItemList(true); } } catch { } finally { _semaphore.Release(); } } public async Task PrePage() { if (!await _semaphore.WaitAsync(0)) return; // 防止重复调用 try { if (StationPage.PageNumber > 1) { StationPage.PageNumber -= 1; await LoadStationItemList(true); } } catch{} finally { _semaphore.Release(); } } public async Task FirstPage() { if (!await _semaphore.WaitAsync(0)) return; // 防止重复调用 try { if (StationPage.PageNumber > 1) { StationPage.PageNumber = 1; await LoadStationItemList(true); } } catch { } finally { _semaphore.Release(); } } public async Task LastPage() { if (!await _semaphore.WaitAsync(0)) return; // 防止重复调用 try { if (StationPage.PageNumber < StationPage.PageCount) { StationPage.PageNumber = StationPage.PageCount; await LoadStationItemList(true); } } catch { } finally { _semaphore.Release(); } } public async Task SpeciPage(int pageNumber) { if (!await _semaphore.WaitAsync(0)) return; // 防止重复调用 try { if (pageNumber != StationPage.PageNumber && pageNumber > 0 && pageNumber <= StationPage.PageCount) { StationPage.PageNumber = pageNumber; await LoadStationItemList(true); } } catch { } finally { _semaphore.Release(); } } //--------------------------------------------------------------------- } }