CtrlHome.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. using DevExpress.Mvvm.DataAnnotations;
  2. using DevExpress.Utils;
  3. using DevExpress.Utils.Design;
  4. using DevExpress.Utils.Drawing;
  5. using DevExpress.Utils.Svg;
  6. using DevExpress.XtraEditors;
  7. using DevExpress.XtraEditors.ButtonsPanelControl;
  8. using DevExpress.XtraEditors.Controls;
  9. using DevExpress.XtraEditors.Repository;
  10. using DevExpress.XtraGrid.Columns;
  11. using DevExpress.XtraGrid.Views.Grid;
  12. using DevExpress.XtraGrid.Views.Grid.ViewInfo;
  13. using DxHelper;
  14. using XdCxRhDW.App.EFContext;
  15. using XdCxRhDW.App.Model;
  16. using System;
  17. using System.Collections.Generic;
  18. using System.ComponentModel;
  19. using System.ComponentModel.DataAnnotations;
  20. using System.ComponentModel.DataAnnotations.Schema;
  21. using System.Data;
  22. using System.Drawing;
  23. using System.Linq;
  24. using System.Security.Cryptography;
  25. using System.Text;
  26. using System.Threading.Tasks;
  27. using System.Windows.Forms;
  28. using XdCxRhDW.App.EditForms;
  29. using System.Data.Entity;
  30. using DevExpress.XtraBars.Customization;
  31. using System.Reflection;
  32. using System.Net.Sockets;
  33. using System.Net;
  34. using DevExpress.XtraCharts.Native;
  35. using System.Threading;
  36. using XdCxRhDW.Dto;
  37. using XdCxRhDW.App.Api;
  38. using System.Windows.Controls;
  39. using XdCxRhDW.App.WebAPI;
  40. using Microsoft.Owin.Hosting;
  41. using XdCxRhDW.App.App.Properties;
  42. using System.Web.Http;
  43. namespace XdCxRhDW.App.UserControl
  44. {
  45. public partial class CtrlHome : DevExpress.XtraEditors.XtraUserControl
  46. {
  47. List<TaskInfo> list = new List<TaskInfo>();
  48. public CtrlHome()
  49. {
  50. InitializeComponent();
  51. gridHomeTask.Init();
  52. gridHomePosRes.Init().UseMultiSelect().UseRowNumber();
  53. mapControl1.UseDefalutOptions()
  54. //.UseCluster()//定位点使用内置聚合
  55. .UseClearAll()
  56. .UseDistanceLine()
  57. .UseMarkDot()
  58. .UseExportImg()
  59. .UseExportXlsx()
  60. .UseExportCsv()
  61. .UseDrawRect(rect =>
  62. {
  63. (double startLon, double startLat, double centerLon, double centerLat, double endLon, double endLat, double lonRange, double latRange) = rect;
  64. });
  65. }
  66. private async void GridView1_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e)
  67. {
  68. var tsk = (e.Row as TaskInfo);
  69. var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton);
  70. var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton);
  71. btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running;
  72. List<PosRes> listPos = new List<PosRes>();
  73. using (RHDWContext db = new RHDWContext())
  74. {
  75. var items = await db.PosRes.Where(p => p.TaskID == tsk.ID).OrderByDescending(p => p.SigTime).ToListAsync();
  76. listPos.AddRange(items);
  77. }
  78. this.gridHomePosRes.DataSource = listPos;
  79. mapControl1.SetPosDataSource(listPos.Where(p => p.PosLon <= 180));
  80. }
  81. private async void CtrlHome_Load(object sender, EventArgs e)
  82. {
  83. gridView1.FocusedRowObjectChanged += GridView1_FocusedRowObjectChanged;
  84. try
  85. {
  86. using (RHDWContext db = new RHDWContext())
  87. {
  88. var qq = db.TaskInfos.OrderByDescending(p => p.CreateTime).ToList();
  89. list.AddRange(qq);
  90. var runningList = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running).ToListAsync();
  91. foreach (var item in runningList)
  92. {
  93. item.TaskState = EnumTaskState.Stopped;
  94. }
  95. await db.SaveChangesAsync();
  96. }
  97. }
  98. catch (Exception ex)
  99. {
  100. Serilog.Log.Error(ex, "加载任务信息异常");
  101. DxHelper.MsgBoxHelper.ShowError("加载任务信息异常");
  102. }
  103. gridHomeTask.DataSource = list;
  104. gridView1.Columns["TaskName"].AppearanceCell.TextOptions.HAlignment = HorzAlignment.Near;
  105. this.svgImageCollection1.Add("Stopped", SvgHelper.CreateCycle("#1E8B58"));
  106. this.svgImageCollection1.Add("Running", SvgHelper.CreateCycle("#2E8B57"));
  107. gridView1.CustomDrawCell += GridView1_CustomDrawCell;
  108. using (RHDWContext db = new RHDWContext())
  109. {
  110. var settings = await db.SysSetings.FirstOrDefaultAsync();
  111. if (settings == null)
  112. {
  113. DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息");
  114. return;
  115. }
  116. try
  117. {
  118. StartOptions options = new StartOptions();
  119. options.Urls.Add($"http://+:{settings.HttpPort}");
  120. httpServer = WebApp.Start<Startup>(options);
  121. }
  122. catch (Exception ex)
  123. {
  124. httpServer = null;
  125. Serilog.Log.Error(ex, "启动Http定位接口服务失败!");
  126. DxHelper.MsgBoxHelper.ShowWarning($"启动Http定位接口服务失败!");
  127. }
  128. }
  129. WaitHelper.CloseForm();
  130. }
  131. private void GridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
  132. {
  133. if (e.Column.FieldName == "TaskName" && (EnumTaskState)gridView1.GetRowCellValue(e.RowHandle, "TaskState") == EnumTaskState.Running)
  134. {
  135. var palette = SvgPaletteHelper.GetSvgPalette(this.LookAndFeel, ObjectState.Normal);
  136. e.Cache.DrawSvgImage(svgImageCollection1[1], new Rectangle(new Point(e.Bounds.X + 4, e.Bounds.Y + (e.Bounds.Height - 16) / 2), new Size(16, 16)), palette);
  137. Rectangle txtBounds = e.Bounds;
  138. txtBounds.Width -= 24;
  139. txtBounds.X += 24;
  140. e.Appearance.DrawString(e.Cache, e.DisplayText, txtBounds);
  141. e.Handled = true;
  142. }
  143. }
  144. //public void SetEnumColumnImage(GridView gv, string columnFieldName, object imageCollection)
  145. //{
  146. // var repositoryItemImageComboBoxStatus = new RepositoryItemImageEdit();
  147. // var col = gv.Columns[columnFieldName];
  148. // col.MaxWidth = 40;
  149. // repositoryItemImageComboBoxStatus.Images = imageCollection;
  150. // col.ColumnEdit = repositoryItemImageComboBoxStatus;
  151. //}
  152. private void toolTipController1_GetActiveObjectInfo(object sender, DevExpress.Utils.ToolTipControllerGetActiveObjectInfoEventArgs e)
  153. {
  154. GridHitInfo hitInfo = gridView1.CalcHitInfo(e.ControlMousePosition);
  155. if (hitInfo.RowHandle < 0 || hitInfo.Column == null || hitInfo.HitTest != GridHitTest.RowCell)
  156. {
  157. toolTipController1.HideHint();
  158. return;
  159. }
  160. if (hitInfo.Column.FieldName == "TaskName")
  161. {
  162. var state = (EnumTaskState)gridView1.GetRowCellValue(hitInfo.RowHandle, "TaskState");
  163. if (state == EnumTaskState.Running)
  164. e.Info = new ToolTipControlInfo(hitInfo.RowHandle, "执行中");
  165. }
  166. }
  167. private void gridView1_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)
  168. {
  169. if (gridView1.FocusedRowHandle < 0) return;
  170. var state = (EnumTaskState)gridView1.GetFocusedRowCellValue("TaskState");
  171. btnStart.Enabled = state == EnumTaskState.Stopped;
  172. btnStop.Enabled = state == EnumTaskState.Running;
  173. popupMenu1.ShowPopup(MousePosition);
  174. }
  175. private void gridView2_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)
  176. {
  177. if (gridView2.FocusedRowHandle < 0) return;
  178. if (!gridView2.GetSelectedRows().Any())
  179. {
  180. btnDelPos.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  181. }
  182. else
  183. {
  184. btnDelPos.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  185. }
  186. popupMenu2.ShowPopup(MousePosition);
  187. }
  188. private async void layoutControlGroup1_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
  189. {
  190. var txt = (e.Button as GroupBoxButton).Caption;
  191. if (txt == "新建任务")
  192. {
  193. try
  194. {
  195. TaskEditor frm = new TaskEditor();
  196. if (frm.ShowDialog() != DialogResult.OK) return;
  197. var addItem = frm.info;
  198. using (RHDWContext db = new RHDWContext())
  199. {
  200. if (await db.TaskInfos.AnyAsync(p => p.TaskName == addItem.TaskName))
  201. {
  202. DxHelper.MsgBoxHelper.ShowWarning("任务名称重复");
  203. return;
  204. }
  205. db.TaskInfos.Add(addItem);
  206. await db.SaveChangesAsync();
  207. }
  208. list.Insert(0, addItem);
  209. gridView1.RefreshData();
  210. gridView1.FocusedRowHandle = 0;
  211. }
  212. catch (Exception ex)
  213. {
  214. Serilog.Log.Error(ex, "保存任务异常");
  215. DxHelper.MsgBoxHelper.ShowError("保存任务异常");
  216. }
  217. }
  218. else if (txt == "编辑任务")
  219. {
  220. try
  221. {
  222. var editItem = gridView1.GetFocusedRow() as TaskInfo;
  223. TaskEditor frm = new TaskEditor(editItem);
  224. if (frm.ShowDialog() != DialogResult.OK) return;
  225. editItem = frm.info;
  226. using (RHDWContext db = new RHDWContext())
  227. {
  228. if (await db.TaskInfos.AnyAsync(p => p.ID != editItem.ID && p.TaskName == editItem.TaskName))
  229. {
  230. DxHelper.MsgBoxHelper.ShowWarning("任务名称重复");
  231. return;
  232. }
  233. var find = await db.TaskInfos.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync();
  234. find.TaskName = editItem.TaskName;
  235. find.PosType = editItem.PosType;
  236. await db.SaveChangesAsync();
  237. }
  238. gridView1.RefreshData();
  239. }
  240. catch (Exception ex)
  241. {
  242. Serilog.Log.Error(ex, "保存任务异常");
  243. DxHelper.MsgBoxHelper.ShowError("保存任务异常");
  244. }
  245. }
  246. else
  247. {
  248. try
  249. {
  250. var tsk = gridView1.GetFocusedRow() as TaskInfo;
  251. if (tsk == null) return;
  252. if (!DxHelper.MsgBoxHelper.ShowConfirm($"删除任务[{tsk.TaskName}]?"))
  253. return;
  254. using (RHDWContext db = new RHDWContext())
  255. {
  256. var item = db.TaskInfos.FirstOrDefault(p => p.ID == tsk.ID);
  257. db.TaskInfos.Remove(item);
  258. db.SaveChanges();
  259. }
  260. gridView1.DeleteSelectedRows();
  261. }
  262. catch (Exception ex)
  263. {
  264. Serilog.Log.Error(ex, "删除任务异常");
  265. DxHelper.MsgBoxHelper.ShowError("删除任务异常");
  266. }
  267. }
  268. }
  269. IDisposable httpServer;
  270. TcpServer server;
  271. private async void btn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  272. {
  273. var tsk = gridView1.GetFocusedRow() as TaskInfo;
  274. if (e.Item.Caption == "启动任务")
  275. {
  276. try
  277. {
  278. using (RHDWContext db = new RHDWContext())
  279. {
  280. var find = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskState == EnumTaskState.Running && p.PosType == tsk.PosType);
  281. if (find != null)
  282. {
  283. var field = typeof(EnumPosType).GetField(Enum.GetName(typeof(EnumPosType), find.PosType));
  284. DxHelper.MsgBoxHelper.ShowWarning($"已经有一个[{field.GetCustomAttribute<DisplayAttribute>().Name}]任务正在执行,请先停止!");
  285. return;
  286. }
  287. var settings = await db.SysSetings.FirstOrDefaultAsync();
  288. if (settings == null)
  289. {
  290. DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息");
  291. return;
  292. }
  293. if (server == null)
  294. {
  295. server = new TcpServer();
  296. server.OnDataReceived += this.Server_OnDataReceived;
  297. server.Start(settings.Port);
  298. }
  299. if (httpServer == null)
  300. {
  301. try
  302. {
  303. StartOptions options = new StartOptions();
  304. options.Urls.Add($"http://+:{settings.HttpPort}");
  305. httpServer = WebApp.Start<Startup>(options);
  306. }
  307. catch (Exception ex)
  308. {
  309. Serilog.Log.Error(ex, "启动任务异常,Http定位接口服务启动失败");
  310. DxHelper.MsgBoxHelper.ShowError($"启动任务异常,Http定位接口服务启动失败");
  311. }
  312. }
  313. var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
  314. item.TaskState = EnumTaskState.Running;
  315. await db.SaveChangesAsync();
  316. tsk.TaskState = EnumTaskState.Running;
  317. Serilog.Log.Information($"用户启动了任务,ID={tsk.ID}");
  318. }
  319. }
  320. catch (Exception ex)
  321. {
  322. Serilog.Log.Error(ex, "启动任务异常");
  323. DxHelper.MsgBoxHelper.ShowError($"启动任务异常.{ex.Message}");
  324. }
  325. }
  326. else
  327. {
  328. try
  329. {
  330. using (RHDWContext db = new RHDWContext())
  331. {
  332. var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
  333. item.TaskState = EnumTaskState.Stopped;
  334. await db.SaveChangesAsync();
  335. if (!db.TaskInfos.Any(p => p.TaskState == EnumTaskState.Running))
  336. {
  337. server?.StopListening();
  338. server = null;
  339. }
  340. }
  341. tsk.TaskState = EnumTaskState.Stopped;
  342. Serilog.Log.Information($"用户停止了任务,ID={tsk.ID}");
  343. }
  344. catch (Exception ex)
  345. {
  346. Serilog.Log.Error(ex, "停止任务异常");
  347. DxHelper.MsgBoxHelper.ShowError($"停止任务异常.{ex.Message}");
  348. }
  349. }
  350. gridView1.RefreshData();
  351. var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton);
  352. var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton);
  353. btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running;
  354. }
  355. private void gridView1_CustomDrawEmptyForeground(object sender, DevExpress.XtraGrid.Views.Base.CustomDrawEventArgs e)
  356. {
  357. if (gridView1.RowCount == 0)
  358. {
  359. string txt = "点击+创建任务";
  360. var s = e.Appearance.CalcTextSize(e.Cache, txt, e.Bounds.Width).ToSize();
  361. var x = (e.Bounds.Width - s.Width) / 2;
  362. var y = (e.Bounds.Height - s.Height) / 2;
  363. //e.Appearance.DrawString(e.Cache, txt, new Rectangle(x,y,s.Width,s.Height));
  364. e.DrawHtml(htmlTemplate1);
  365. }
  366. }
  367. readonly Random r = new Random();
  368. private async void Server_OnDataReceived(byte[] data)
  369. {
  370. try
  371. {
  372. var msg = Encoding.UTF8.GetString(data);
  373. var dto = Newtonsoft.Json.JsonConvert.DeserializeObject<SendDto>(msg);
  374. if (dto == null) return;
  375. var sigTime = DateTime.Now;
  376. using (RHDWContext db = new RHDWContext())
  377. {
  378. var cgRes = db.CgRes.Add(new CgRes()
  379. {
  380. SigTime = sigTime,
  381. DtoSx = dto.SxDto * 1e6,
  382. DfoSx = 200 + r.Next(1, 5) + Math.Round(r.NextDouble(), 3),
  383. SnrSx = r.Next(18, 24) + Math.Round(r.NextDouble(), 1),
  384. DtoCdb = dto.XdDto * 1e6,
  385. DfoCdb = 600 + r.Next(1, 5) + Math.Round(r.NextDouble(), 3),
  386. SnrCdb = r.Next(22, 32) + Math.Round(r.NextDouble(), 1),
  387. YbMain = dto.MainYbDto * 1e6,
  388. YbAdja = dto.AdjaYbDto * 1e6,
  389. MainX = dto.MainX,
  390. MainY = dto.MainY,
  391. MainZ = dto.MainZ,
  392. AdjaX = dto.AdjaX,
  393. AdjaY = dto.AdjaY,
  394. AdjaZ = dto.AdjaZ,
  395. });
  396. var listTx = await db.TxInfos.ToListAsync();
  397. var cxRes = db.CxRes.Add(new CxRes()
  398. {
  399. SigTime = sigTime,
  400. Fx = dto.CxRes,
  401. });
  402. var tsk1X1D = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running);
  403. var tsk2X1D = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  404. var tskRh = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running);
  405. if (tsk1X1D != null)
  406. {
  407. var res = PosApi.X1D1_POS(cgRes, listTx, cxRes);
  408. PosRes posRes = new PosRes()
  409. {
  410. SigTime = sigTime,
  411. TaskID = tsk1X1D.ID,
  412. CxResID = cxRes.ID,
  413. CgResID = cgRes.ID,
  414. TarName = "未知目标",
  415. TsName = "DAMA--56-115ms",
  416. PosLon = res[0],
  417. PosLat = res[1],
  418. MirrLon = res[3],
  419. MirrLat = res[4],
  420. };
  421. db.PosRes.Add(posRes);
  422. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  423. if (currentTask != null && currentTask.ID == tsk1X1D.ID)
  424. {
  425. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  426. ds.Insert(0, posRes);
  427. this.Invoke(new Action(() =>
  428. {
  429. gridView2.RefreshData();
  430. mapControl1.AddPosItem(posRes);
  431. }));
  432. }
  433. }
  434. if (tsk2X1D != null)
  435. {
  436. var res = PosApi.X2D1_POS(cgRes, listTx);
  437. PosRes posRes = new PosRes()
  438. {
  439. SigTime = sigTime,
  440. TaskID = tsk2X1D.ID,
  441. CxResID = cxRes.ID,
  442. CgResID = cgRes.ID,
  443. TarName = "未知目标",
  444. TsName = "DAMA-225-173ms",
  445. PosLon = res[0],
  446. PosLat = res[1],
  447. MirrLon = res[3],
  448. MirrLat = res[4],
  449. };
  450. db.PosRes.Add(posRes);
  451. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  452. if (currentTask.ID == tsk2X1D.ID)
  453. {
  454. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  455. ds.Insert(0, posRes);
  456. this.Invoke(new Action(() =>
  457. {
  458. gridView2.RefreshData();
  459. mapControl1.AddPosItem(posRes);
  460. }));
  461. }
  462. }
  463. if (tskRh != null)
  464. {
  465. var res = PosApi.RH_POS(cgRes, listTx, cxRes);
  466. PosRes posRes = new PosRes()
  467. {
  468. SigTime = sigTime,
  469. TaskID = tskRh.ID,
  470. CxResID = cxRes.ID,
  471. CgResID = cgRes.ID,
  472. TarName = "未知目标",
  473. TsName = "DAMA-738-109ms",
  474. PosLon = res[0],
  475. PosLat = res[1],
  476. MirrLon = res[3],
  477. MirrLat = res[4],
  478. };
  479. db.PosRes.Add(posRes);
  480. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  481. if (currentTask.ID == tskRh.ID)
  482. {
  483. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  484. ds.Insert(0, posRes);
  485. this.Invoke(new Action(() =>
  486. {
  487. gridView2.RefreshData();
  488. mapControl1.AddPosItem(posRes);
  489. }));
  490. }
  491. }
  492. await db.SaveChangesAsync();
  493. }
  494. }
  495. catch (Exception ex)
  496. {
  497. Serilog.Log.Error(ex, "接收到推送消息后处理异常");
  498. }
  499. }
  500. private async void btnDelPos_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  501. {
  502. try
  503. {
  504. var ids = gridView2.GetSelectedRows();
  505. using (RHDWContext db = new RHDWContext())
  506. {
  507. foreach (var id in ids)
  508. {
  509. var item = gridView2.GetRow(id) as PosRes;
  510. var delItem = await db.PosRes.Where(p => p.ID == item.ID).FirstOrDefaultAsync();
  511. if (delItem != null)
  512. {
  513. db.PosRes.Remove(delItem);
  514. mapControl1.DelPosItem<PosRes>(item);
  515. }
  516. }
  517. await db.SaveChangesAsync();
  518. }
  519. gridView2.DeleteSelectedRows();
  520. }
  521. catch (Exception ex)
  522. {
  523. Serilog.Log.Error(ex, "删除定位结果异常");
  524. DxHelper.MsgBoxHelper.ShowError("删除定位结果异常");
  525. }
  526. }
  527. private void gridView2_RowClick(object sender, RowClickEventArgs e)
  528. {
  529. var p = gridView2.GetFocusedRow() as PosRes;
  530. p.Selected = true;
  531. mapControl1.UpdatePosItem(p);
  532. }
  533. }
  534. }