UCCompMain.xaml.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. using MeterVision.Config;
  2. using MeterVision.db;
  3. using MeterVision.Dlg;
  4. using MeterVision.model;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Collections.ObjectModel;
  8. using System.ComponentModel;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Text.RegularExpressions;
  12. using System.Threading.Tasks;
  13. using System.Windows;
  14. using System.Windows.Controls;
  15. using System.Windows.Data;
  16. using System.Windows.Documents;
  17. using System.Windows.Input;
  18. using System.Windows.Media;
  19. using System.Windows.Media.Imaging;
  20. using System.Windows.Navigation;
  21. using System.Windows.Shapes;
  22. namespace MeterVision.Patch
  23. {
  24. /// <summary>
  25. /// UCCompMain.xaml 的交互逻辑
  26. /// </summary>
  27. public partial class UCCompMain : UserControl,INotifyPropertyChanged
  28. {
  29. public event PropertyChangedEventHandler PropertyChanged;
  30. protected void OnPropertyChanged(string propertyName)
  31. {
  32. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  33. }
  34. private const int COLUMN_LEFT_WIDTH = 450;
  35. private bool LeftVisiable = true; //表示左侧的显示状态
  36. public ObservableCollection<KeyValuePair<CompFindType, string>> CompFindTypeKVs { get; set; }
  37. //当前选择的筛选类型
  38. private CompFindType _selectedCompFindType;
  39. public CompFindType SelectedCompFindType
  40. {
  41. get => _selectedCompFindType;
  42. set
  43. {
  44. if(_selectedCompFindType != value)
  45. {
  46. _selectedCompFindType = value;
  47. OnPropertyChanged(nameof(SelectedCompFindType));
  48. //改变显示明细的项的函数
  49. ucCompGird.ChangeCompItemOrFindType(SelectedCompItem, SelectedCompFindType);
  50. }
  51. }
  52. }
  53. public PageModel CompPage { get; set; }
  54. //定义比较目录的数据源
  55. public ObservableCollection<CompItem> CompItemList { get; set; }
  56. public CfginiItem mConfigItem { get; set; }
  57. private CompItem _selectedCompItem;
  58. public CompItem SelectedCompItem
  59. {
  60. get => _selectedCompItem;
  61. set
  62. {
  63. _selectedCompItem = value;
  64. OnPropertyChanged(nameof(SelectedCompItem));
  65. //调用显示明细项的函数
  66. ucCompGird.ChangeCompItemOrFindType(SelectedCompItem, SelectedCompFindType);
  67. Apply_UCCompDetail_Title(value);
  68. }
  69. }
  70. private void Apply_UCCompDetail_Title(CompItem compItem)
  71. {
  72. if(compItem == null)
  73. {
  74. pnlDetailFunc.Visibility = Visibility.Hidden;
  75. txtCompName.Text = "请选择左侧比较项";
  76. }
  77. else
  78. {
  79. pnlDetailFunc.Visibility = Visibility.Visible;
  80. txtCompName.Text = $"{compItem.Index}. {compItem.NPatchName} vs {compItem.OPatchName}";
  81. }
  82. }
  83. //总共的Comp数量
  84. private int _totalCompRecords;
  85. public int TotalCompRecords
  86. {
  87. get => _totalCompRecords;
  88. set
  89. {
  90. if(_totalCompRecords != value)
  91. {
  92. _totalCompRecords = value;
  93. OnPropertyChanged(nameof(TotalCompRecords));
  94. }
  95. }
  96. }
  97. private void InitCompFindTypeKVs()
  98. {
  99. CompFindTypeKVs = new ObservableCollection<KeyValuePair<CompFindType, string>>()
  100. {
  101. new KeyValuePair<CompFindType, string>(CompFindType.ALL,"所有"),
  102. new KeyValuePair<CompFindType, string>(CompFindType.NERROR_ORIGHT,"新错+旧对"),
  103. new KeyValuePair<CompFindType, string>(CompFindType.NRIGHT_OERROR,"新对+旧错"),
  104. new KeyValuePair<CompFindType, string>(CompFindType.NRIGHT_ORIGHT,"新旧都对"),
  105. new KeyValuePair<CompFindType, string>(CompFindType.NERROR_OERROR,"新旧都错"),
  106. };
  107. }
  108. public UCCompMain()
  109. {
  110. InitializeComponent();
  111. CompItemList = new ObservableCollection<CompItem>();
  112. dgComp.ItemsSource = CompItemList;
  113. Apply_UCCompDetail_Title(null);
  114. mConfigItem = CfginiItem.GetConfigItem();
  115. CompPage = new PageModel
  116. {
  117. PageSize = mConfigItem.PatchCatalogPageSize,
  118. PageNumber = 1
  119. };
  120. mConfigItem.OnPatchCatalogPageSizeChnaged += MConfigItem_OnPatchCatalogPageSizeChnaged;
  121. this.DataContext = this;
  122. LoadCompItemListAsync();
  123. InitCompFindTypeKVs();
  124. SelectedCompFindType = CompFindType.ALL;
  125. //CompFindType.NERROR_ORIGHT;
  126. //控制左侧栏目的显示
  127. LeftVisiable = true;
  128. ChangeLeftVisiable(LeftVisiable);
  129. }
  130. private async void MConfigItem_OnPatchCatalogPageSizeChnaged(int pageSize)
  131. {
  132. CompPage.InitDefaulValue(pageSize);
  133. bool blLoad = await LoadCompItemList();
  134. if (blLoad)
  135. {
  136. SelectedCompItem = null;
  137. }
  138. }
  139. private async void LoadCompItemListAsync()
  140. {
  141. await LoadCompItemList();
  142. }
  143. private async Task<bool> LoadCompItemList()
  144. {
  145. CompItemList.Clear();
  146. try
  147. {
  148. var result = await Task.Run(() =>
  149. {
  150. return DBComp.GetPagedVComps(CompPage.PageNumber, CompPage.PageSize);
  151. });
  152. TotalCompRecords = result.Item1;
  153. CompPage.PageCount = result.Item2;
  154. List<VComp> comps = result.Item3;
  155. int index = 0;
  156. foreach(VComp vComp in comps)
  157. {
  158. index++;
  159. CompItem compItem = new CompItem(vComp);
  160. compItem.Index = index + (CompPage.PageNumber - 1) * CompPage.PageSize;
  161. CompItemList.Add(compItem);
  162. }
  163. return true;
  164. }
  165. catch(Exception ex)
  166. {
  167. MessageBox.Show(Application.Current.MainWindow,
  168. $"e加载数据时发生错误:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  169. return false;
  170. }
  171. }
  172. private async void BtnAddComp_Click(object sender, RoutedEventArgs e)
  173. {
  174. AddCompDlg2 dialog = new AddCompDlg2()
  175. {
  176. Owner = Application.Current.MainWindow,
  177. WindowStartupLocation = WindowStartupLocation.CenterOwner
  178. };
  179. if(dialog.ShowDialog() == true)
  180. {
  181. TComp comp = dialog.NewComp;
  182. CompPage.InitDefaulValue();
  183. bool blLoad = await LoadCompItemList();
  184. if(blLoad && CompItemList.Count > 0)
  185. {
  186. SelectedCompItem = CompItemList[0];
  187. dgComp.ScrollIntoView(SelectedCompItem);
  188. }
  189. }
  190. }
  191. private async void BtnDelComp_Click(object sender, RoutedEventArgs e)
  192. {
  193. bool blDelete = await DeleteCompItem();
  194. }
  195. private async void MiDeleteCompr_Click(object sender, RoutedEventArgs e)
  196. {
  197. bool blDelete = await DeleteCompItem();
  198. }
  199. private async Task<bool> DeleteCompItem()
  200. {
  201. bool blDelete = false;
  202. if (SelectedCompItem == null) return blDelete;
  203. // 弹出确认对话框
  204. MessageBoxResult result = MessageBox.Show(
  205. $"您确定要删除[{SelectedCompItem.NPatchName} VS {SelectedCompItem.OPatchName}]的比较吗?\n此操作无法撤销。",
  206. "确认删除",
  207. MessageBoxButton.YesNo, // 提供“是”和“否”按钮
  208. MessageBoxImage.Warning // 使用警告图标
  209. );
  210. if (result != MessageBoxResult.Yes)
  211. {
  212. return blDelete;
  213. }
  214. //开始删除操作
  215. string titleInfo = "正在删除,请稍候...";
  216. WaitWindow waitWindow = new WaitWindow(titleInfo)
  217. {
  218. Owner = Application.Current.MainWindow,
  219. WindowStartupLocation = WindowStartupLocation.CenterOwner
  220. };
  221. waitWindow.Show();
  222. try
  223. {
  224. //执行异步删除逻辑
  225. bool deleteSuccess = false;
  226. await Task.Run(() =>
  227. {
  228. deleteSuccess = DBComp.DelteTComp(SelectedCompItem.CompId);
  229. //Task.Delay(200).Wait(); // 模拟延迟
  230. });
  231. if (deleteSuccess)
  232. {
  233. //await LoadPatchItemList();
  234. // 在 UI 线程上更新 ObservableCollection
  235. await Application.Current.Dispatcher.BeginInvoke(new Action(() =>
  236. {
  237. CompItemList.Remove(SelectedCompItem);
  238. SelectedCompItem = null;
  239. TotalCompRecords -= 1;
  240. }));
  241. blDelete = true;
  242. }
  243. }
  244. catch (Exception ex)
  245. {
  246. MessageBox.Show(Application.Current.MainWindow, $"删除失败:{ex.Message}", "错误",
  247. MessageBoxButton.OK, MessageBoxImage.Error);
  248. }
  249. finally
  250. {
  251. //关闭等待窗口
  252. waitWindow.Close();
  253. }
  254. return blDelete;
  255. }
  256. private void BtnRefreshDetail_Click(object sender, RoutedEventArgs e)
  257. {
  258. ucCompGird.ChangeCompItemOrFindType(null, SelectedCompFindType);
  259. ucCompGird.ChangeCompItemOrFindType(SelectedCompItem, SelectedCompFindType);
  260. }
  261. private async void BtnRefresh_Click(object sender, RoutedEventArgs e)
  262. {
  263. CompPage.InitDefaulValue();
  264. bool blLoad = await LoadCompItemList();
  265. if(blLoad && CompItemList.Count > 0)
  266. {
  267. dgComp.ScrollIntoView(CompItemList[0]);
  268. }
  269. }
  270. private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
  271. {
  272. // 只允许数字输入
  273. e.Handled = !Regex.IsMatch(e.Text, @"^\d$");
  274. }
  275. private async void BtnCompPrePage_Click(object sender, RoutedEventArgs e)
  276. {
  277. if (CompPage.PageNumber > 1)
  278. {
  279. CompPage.PageNumber -= 1;
  280. bool blLoad = await LoadCompItemList();
  281. if (blLoad && CompItemList.Count > 0)
  282. {
  283. dgComp.ScrollIntoView(CompItemList[0]);
  284. }
  285. }
  286. }
  287. private async void BtnCompNextPage_Click(object sender, RoutedEventArgs e)
  288. {
  289. if (CompPage.PageNumber < CompPage.PageCount)
  290. {
  291. CompPage.PageNumber += 1;
  292. bool blLoad = await LoadCompItemList();
  293. if (blLoad && CompItemList.Count > 0)
  294. {
  295. dgComp.ScrollIntoView(CompItemList[0]);
  296. }
  297. }
  298. }
  299. private void BtnCompDetailFirstPage_Click(object sender, RoutedEventArgs e)
  300. {
  301. ucCompGird.FirstPage();
  302. }
  303. private void BtnCompDetailPrePage_Click(object sender, RoutedEventArgs e)
  304. {
  305. ucCompGird.PrePage();
  306. }
  307. private void BtnCompDetailNextPage_Click(object sender, RoutedEventArgs e)
  308. {
  309. ucCompGird.NextPage();
  310. }
  311. private void BtnCompDetailLastPage_Click(object sender, RoutedEventArgs e)
  312. {
  313. ucCompGird.LastPage();
  314. }
  315. private void BtnCompDetailSpeciPage_Click(object sender, RoutedEventArgs e)
  316. {
  317. try
  318. {
  319. int pageNumber = int.Parse(txtCompDetailPageNumber.Text.ToString());
  320. ucCompGird.SpeciPage(pageNumber);
  321. }
  322. catch
  323. {
  324. }
  325. }
  326. //-----------------------------------------------------------------------
  327. private void BtnLeftCtl_Click(object sender, RoutedEventArgs e)
  328. {
  329. bool visiable = !LeftVisiable;
  330. ChangeLeftVisiable(visiable);
  331. }
  332. private void ChangeLeftVisiable(bool visiable)
  333. {
  334. LeftVisiable = visiable;
  335. colLeft.Width = new GridLength(visiable ? COLUMN_LEFT_WIDTH : 0);
  336. btnLeftCtl.Content = visiable ? "◀️" : "▶️";
  337. btnLeftCtl.ToolTip = visiable ? "点击隐藏左侧栏" : "点击显示左侧栏";
  338. }
  339. ///----------------------------------------------------------------
  340. }
  341. public enum CompFindType
  342. {
  343. ALL = 1,
  344. NERROR_ORIGHT = 2, /* 旧对新错 */
  345. NRIGHT_OERROR = 3, /* 新对旧错 */
  346. NRIGHT_ORIGHT = 4, /* 新旧均对 */
  347. NERROR_OERROR = 5 /* 新旧均错 */
  348. }
  349. //////////////////////////////////////////////////////////////////////////
  350. }