프로젝트

일반

사용자정보

통계
| 개정판:

hytos / ID2.Manager / ID2.Manager.Compare / Main.cs @ 51b9a24a

이력 | 보기 | 이력해설 | 다운로드 (21.6 KB)

1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Linq;
7
using System.Text;
8
using System.Threading.Tasks;
9
using System.Windows.Forms;
10

    
11
using System.IO;
12
using System.Reflection;
13
using System.Diagnostics;
14

    
15
using ID2.Manager.Controls;
16
using ID2.Manager.Classes;
17

    
18
using Telerik.WinControls;
19
using Telerik.WinControls.UI;
20

    
21
namespace ID2.Manager
22
{
23
    public partial class Main : RadRibbonForm
24
    {
25
        protected override CreateParams CreateParams
26
        {
27
            get
28
            {
29
                CreateParams cp = base.CreateParams;
30
                cp.ExStyle |= 0x02000000;
31
                return cp;
32
            }
33
        }
34

    
35
//#if DEBUG
36
//        Telerik.WinControls.RadControlSpy.RadControlSpyForm radControlSpyForm = new Telerik.WinControls.RadControlSpy.RadControlSpyForm();
37
//#endif
38
        private readonly Color _SummaryColor = Color.FromArgb(255, 108, 55);
39

    
40
        public Main()
41
        {
42
            InitializeComponent();
43
            var verification = new Controls.Verification(this.radProgressBarElement) { Dock = DockStyle.Fill };
44
            this.LayoutValidation.Controls.Add(verification);
45
            this.DockMainTabStrip.Select();
46

    
47
            var appDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), Application.ProductName);
48

    
49
            if (!Directory.Exists(appDataPath))
50
            {
51
                Directory.CreateDirectory(appDataPath);
52
            }
53

    
54
            #region 테마 설정
55
            this.radMenuItemControlDefault.Click += RadMenuItemTheme_Click;
56
            this.radMenuItemOffice2013Dark.Click += RadMenuItemTheme_Click;
57
            this.radMenuItemTelerikMetro.Click += RadMenuItemTheme_Click;
58
            this.radMenuItemVisualStudio2012Dark.Click += RadMenuItemTheme_Click;
59
            this.radMenuItemVisualStudio2012Light.Click += RadMenuItemTheme_Click;
60
            this.radMenuItemWindows8.Click += RadMenuItemTheme_Click;
61
            #endregion
62

    
63
            this.Initialize();
64
        }
65

    
66
        /// <summary>
67
        /// 사용자가 선택한 테마를 적용한다.
68
        /// </summary>
69
        /// <param name="sender"></param>
70
        /// <param name="e"></param>
71
        private void RadMenuItemTheme_Click(object sender, EventArgs e)
72
        {
73
            string theme = (sender as RadMenuItem).Text;
74
            if(theme != this.radDropDownButtonElementTheme.Text)
75
            {
76
                this.radDropDownButtonElementTheme.Text = theme;
77
                Classes.ID2Helper.IniWriteValue(Program.IniFilePath, "App", "Theme", theme);
78
                if (!string.IsNullOrEmpty(theme))
79
                {
80
                    Telerik.WinControls.ThemeResolutionService.ApplicationThemeName = theme;
81
                    Program.ThemeName = theme;
82
                }
83
            }
84
        }
85

    
86
        #region Init, Load
87
        private void Initialize()
88
        {
89
            this.ID2ManagerRadRibbonBar.Expanded = false;
90
        }
91

    
92
        protected override void OnLoad(EventArgs e)
93
        {
94
            try
95
            {
96
                this.Text = $"ID2.Manager.Compare - V {Application.ProductVersion}";
97

    
98
                #region 테마를 읽어 적용
99
                string theme = Classes.ID2Helper.IniReadValue(Program.IniFilePath, "App", "Theme");
100
                if (!string.IsNullOrEmpty(theme))
101
                {
102
                    Telerik.WinControls.ThemeResolutionService.ApplicationThemeName = theme;
103
                    Program.ThemeName = theme;
104
                }
105
                #endregion
106

    
107
                this.radDropDownButtonElementTheme.Text = Program.ThemeName;
108
                this.radBrowseEditorAutoCADFolder.ValueChanged += RadBrowseEditorAutoCADFolder_ValueChanged;
109
                this.radBrowseEditorAVEVAFolder.ValueChanged += RadBrowseEditorAVEVAFolder_ValueChanged;
110
                this.radGridViewDocument.DataBindingComplete += RadGridViewDocument_DataBindingComplete;
111
                this.radGridViewDocument.ViewRowFormatting += RadGridViewDocument_ViewRowFormatting;
112
                this.radGridViewDocument.CellClick += RadGridViewDocument_CellClick;
113
                this.radButtonElementCompare.Click += RadButtonElementCompare_Click;
114
                this.radButtonElementConfiguration.Click += RadButtonElementConfiguration_Click;
115

    
116
                this.radButtonElementRefreshCommand.Click += RadButtonElementRefreshCommand_Click;
117

    
118
                Program.AutoCADFolder = Classes.ID2Helper.IniReadValue(Program.IniFilePath, "Path", "AutoCAD Folder");
119
                if (!string.IsNullOrEmpty(Program.AutoCADFolder)) this.radBrowseEditorAutoCADFolder.Value = Program.AutoCADFolder;
120

    
121
                Program.AVEVAPIDFolder = Classes.ID2Helper.IniReadValue(Program.IniFilePath, "Path", "AVEVA P&ID Folder");
122
                if (!string.IsNullOrEmpty(Program.AVEVAPIDFolder)) this.radBrowseEditorAVEVAFolder.Value = Program.AVEVAPIDFolder;
123
            }
124
            catch (Exception ex)
125
            {
126
                Program.logger.Error($"An exception occurred from {MethodBase.GetCurrentMethod().Name}", ex);
127
                RadMessageBox.Show("Failed to load project.", Application.ProductName, MessageBoxButtons.OK, RadMessageIcon.Error);
128
            }
129

    
130
            base.OnLoad(e);
131
        }
132

    
133
        /// <summary>
134
        /// 도면 리스트를 갱신한다.
135
        /// </summary>
136
        /// <param name="sender"></param>
137
        /// <param name="e"></param>
138
        private void RadButtonElementRefreshCommand_Click(object sender, EventArgs e)
139
        {
140
            try
141
            {
142
                this.Cursor = Cursors.WaitCursor;
143

    
144
                var AutoCADFiles = Directory.GetFiles(Program.AutoCADFolder, "*.dwg");
145
                var AVEVAFiles = Directory.GetFiles(Program.AVEVAPIDFolder, "*.dwg");
146

    
147
                MakeDocumentList(AutoCADFiles, AVEVAFiles);
148
            }
149
            finally
150
            {
151
                this.Cursor = Cursors.Default;
152
            }
153
        }
154

    
155
        /// <summary>
156
        /// 환경 설정 창을 띄운다.
157
        /// </summary>
158
        /// <param name="sender"></param>
159
        /// <param name="e"></param>
160
        private void RadButtonElementConfiguration_Click(object sender, EventArgs e)
161
        {
162
            using (var frm = new Forms.ExceptLayer())
163
            {
164
                if (DialogResult.OK == frm.ShowDialog(this))
165
                {
166
                    string ExceptLayers = string.Join(",", Forms.ExceptLayer.ExceptLayers.Select(x => x.Name));
167
                    Classes.ID2Helper.IniWriteValue(Program.IniFilePath, "Verification", "Except Layers", ExceptLayers);
168

    
169
                    string ExceptLayersVisible = string.Join(",", Forms.ExceptLayer.ExceptLayers.Select(x => x.Visible));
170
                    Classes.ID2Helper.IniWriteValue(Program.IniFilePath, "Verification", "Except Layers Visible", ExceptLayersVisible);
171

    
172
                    string LineLayers = string.Join(",", Forms.ExceptLayer.LineLayers.Select(x => x.Name));
173
                    Classes.ID2Helper.IniWriteValue(Program.IniFilePath, "Verification", "Line Layers", LineLayers);
174

    
175
                    Classes.ID2Helper.IniWriteValue(Program.IniFilePath, "Verification", "Length Tolerance Ratio", 
176
                        Forms.ExceptLayer.LengthToleranceRatio.ToString());
177

    
178
                    Classes.ID2Helper.IniWriteValue(Program.IniFilePath, "Verification", "Arrow Max Length",
179
                        Forms.ExceptLayer.ArrowMaxLength.ToString());
180
                }
181
            }
182
        }
183

    
184
        private void RadButtonElementCompare_Click(object sender, EventArgs e)
185
        {
186
            try
187
            {
188
                this.Cursor = Cursors.WaitCursor;
189

    
190
                var docs = this.radGridViewDocument.Rows.Where(x => (x.DataBoundItem is Document doc) && doc.Checked).
191
                    Select(x => (x.DataBoundItem as Document)).ToList();
192
                var verification = this.LayoutValidation.Controls[0] as Controls.Verification;
193
                verification.CompareDrawings(docs, true);
194
            }
195
            finally
196
            {
197
                this.Cursor = Cursors.Default;
198
            }
199
        }
200

    
201
        private void RadGridViewDocument_CellClick(object sender, GridViewCellEventArgs e)
202
        {
203
            if (e.RowIndex >= 0 && (e.ColumnIndex == 1 || e.ColumnIndex == 2))
204
            {
205
                if (this.radGridViewDocument.SelectedRows.Any() && this.radGridViewDocument.SelectedRows[0].DataBoundItem is Document doc)
206
                {
207
                    this.Cursor = Cursors.WaitCursor;
208
                    try
209
                    {
210
                        var verification = this.LayoutValidation.Controls[0] as Controls.Verification;
211
                        verification.CompareDrawings(new List<Document>() { doc });
212
                    }
213
                    finally
214
                    {
215
                        this.Cursor = Cursors.Default;
216
                    }
217
                }
218
            }
219
        }
220

    
221
        private void RadGridViewDocument_ViewRowFormatting(object sender, RowFormattingEventArgs e)
222
        {
223
            if(e.RowElement is GridRowElement)
224
            {
225
                if (e.RowElement.RowInfo.DataBoundItem is Document doc)
226
                {
227
                    if (!doc.IsValid)
228
                    {
229
                        e.RowElement.ForeColor = Color.Gray;
230
                        e.RowElement.Font = Program.UnmatchedFont;
231
                    }
232
                    else
233
                    {
234
                        e.RowElement.ResetValue(LightVisualElement.ForeColorProperty, ValueResetFlags.Local);
235
                        e.RowElement.Font = Program.MatchedFont;
236
                    }
237
                }
238
            }
239
            else
240
            {
241
                e.RowElement.ResetValue(LightVisualElement.ForeColorProperty, ValueResetFlags.Local);
242
                e.RowElement.ResetValue(LightVisualElement.FontProperty, ValueResetFlags.Local);
243
            }
244
        }
245

    
246
        private void RadGridViewDocument_DataBindingComplete(object sender, GridViewBindingCompleteEventArgs e)
247
        {
248
            radGridViewDocument.BestFitColumns();
249
        }
250

    
251
        private void RadBrowseEditorAVEVAFolder_ValueChanged(object sender, EventArgs e)
252
        {
253
            if(Directory.Exists(this.radBrowseEditorAVEVAFolder.Value))
254
            {
255
                Program.AVEVAPIDFolder = this.radBrowseEditorAVEVAFolder.Value;
256
                Classes.ID2Helper.IniWriteValue(Program.IniFilePath, "Path", "AVEVA P&ID Folder", Program.AVEVAPIDFolder);
257

    
258
                var AVEVAFiles = Directory.GetFiles(Program.AVEVAPIDFolder, "*.dwg");
259

    
260
                var AutoCADFiles = new List<string>();
261
                if (Directory.Exists(this.radBrowseEditorAutoCADFolder.Value))
262
                {
263
                    AutoCADFiles.AddRange(Directory.GetFiles(this.radBrowseEditorAutoCADFolder.Value, "*.dwg"));
264
                }
265

    
266
                MakeDocumentList(AutoCADFiles, AVEVAFiles);
267
            }
268
        }
269

    
270
        private void RadBrowseEditorAutoCADFolder_ValueChanged(object sender, EventArgs e)
271
        {
272
            if (Directory.Exists(this.radBrowseEditorAutoCADFolder.Value))
273
            {
274
                Program.AutoCADFolder = this.radBrowseEditorAutoCADFolder.Value;
275
                Classes.ID2Helper.IniWriteValue(Program.IniFilePath, "Path", "AutoCAD Folder", Program.AutoCADFolder);
276

    
277
                var AutoCADFiles = Directory.GetFiles(Program.AutoCADFolder, "*.dwg");
278

    
279
                var AVEVAFiles = new List<string>();
280
                if (Directory.Exists(this.radBrowseEditorAVEVAFolder.Value))
281
                {
282
                    AVEVAFiles.AddRange(Directory.GetFiles(this.radBrowseEditorAVEVAFolder.Value, "*.dwg"));
283
                }
284

    
285
                MakeDocumentList(AutoCADFiles, AVEVAFiles);
286
            }
287
        }
288

    
289
        private void MakeDocumentList(IList<string> AutoCADFiles, IList<string> AVEVAFiles)
290
        {
291
            radGridViewDocument.DataSource = null;
292

    
293
            Program.Documents.Clear();
294
            AutoCADFiles.ForAll(x => Program.Documents.Add(new Document(Path.GetFileNameWithoutExtension(x).ToUpper()) { AutoCADFileName = Path.GetFileNameWithoutExtension(x).ToUpper()}));
295

    
296
            var addings = new List<Document>();
297
            foreach(var file in AVEVAFiles)
298
            {
299
                string FileName = Path.GetFileNameWithoutExtension(file).ToUpper();
300
                var doc = Program.Documents.Find(x => x.AutoCADFileName == FileName);
301
                if(doc != null)
302
                {
303
                    doc.AVEVAFileName = FileName;
304
                }
305
                else
306
                {
307
                    addings.Add(new Document(FileName) { AVEVAFileName = FileName });
308
                }
309
            }
310

    
311
            addings.ForAll(x => Program.Documents.Add(x));
312

    
313
            radGridViewDocument.DataSource = Program.Documents;
314
        }
315
        #endregion
316

    
317
        private void RadDropDownList_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
318
        {
319
            if (sender is RadDropDownList ddl)
320
            {
321
                if (ddl.SelectedValue != null)
322
                {
323
                    if (string.IsNullOrEmpty(ddl.SelectedValue.ToString()))
324
                    {
325
                        ddl.BackColor = Color.White;
326
                        ddl.ForeColor = Color.Black;
327
                        ddl.Font = new Font("Segoe UI", 8.25F, FontStyle.Regular);
328
                    }
329
                    else
330
                    {
331
                        ddl.BackColor = Color.DarkSlateBlue;
332
                        ddl.ForeColor = Color.Yellow;
333
                        ddl.Font = new Font("Segoe UI", 8.25F, FontStyle.Bold);
334
                    }
335
                }
336
            }
337
        }
338

    
339
        private void RadTextBoxDocumentNo_KeyUp(object sender, KeyEventArgs e)
340
        {
341
            if (sender is RadTextBox txtBox)
342
            {
343
                if (txtBox.Text.Length > 0)
344
                {
345
                    txtBox.BackColor = Color.DarkSlateBlue;
346
                    txtBox.ForeColor = Color.Yellow;
347
                    txtBox.Font = new Font("Segoe UI", 8.25F, FontStyle.Bold);
348
                }
349
                else
350
                {
351
                    txtBox.BackColor = Color.White;
352
                    txtBox.ForeColor = Color.Black;
353
                    txtBox.Font = new Font("Segoe UI", 8.25F, FontStyle.Regular);
354
                }
355
            }
356
        }
357

    
358
        /*
359
        private void GetCheckedList()
360
        {
361
            RadGridView grid = this.radGridViewDocuments;
362

    
363
            //var checkers = grid.Rows.Where(x =>
364
            //{
365
            //    return x.Cells["Checked"].Value != null && Convert.ToBoolean(x.Cells["Checked"].Value);
366
            //}).Select(x => x.DataBoundItem as Documents).ToList();
367

    
368
            //var viewRows = new Queue<GridViewRowInfo>(this.radGridViewDocuments.MasterTemplate.DataView.Where(x => x.Cells["spq");
369
            var viewRows = grid.MasterTemplate.DataView;
370

    
371
            var checkers = viewRows.Where(x =>
372
            {
373
                return x.Cells["Checked"].Value != null && Convert.ToBoolean(x.Cells["Checked"].Value);
374
            }).ToList();
375

    
376
            var rows = new GridViewDataRowInfo[checkers.Count];
377
            checkers.CopyTo(rows, 0);
378

    
379
            if (rows.Length > 0)
380
            {
381
                grid.BeginUpdate();
382

    
383
                int nLoop = 0;
384
                rows.ForAll(x =>
385
                {
386
                    grid.Rows.Remove(rows[nLoop]);
387
                    nLoop++;
388
                });
389

    
390
                grid.EndUpdate();
391
            }
392

    
393

    
394
            //grid.Rows.re grid.Rows.ToList().Intersect(checkers)
395

    
396

    
397
            //RadMessageBox.Show($"{checkers.Count()}", Globals.Name, MessageBoxButtons.OK, RadMessageIcon.Info);
398
            //RadMessageBox.Show($"{this.documents.Count}", Globals.Name, MessageBoxButtons.OK, RadMessageIcon.Info);
399
            this.lbSelectAndTotal.Text = $"{grid.MasterTemplate.DataView.Count} / {this.TotalCount} (Selected / Total)";
400
        }
401
        */
402

    
403
        #region ColumnGroup
404
        private void InitColumnGroupsViewDefinition(RadGridView gridView)
405
        {
406
            ColumnGroupsViewDefinition columnGroupsView = new ColumnGroupsViewDefinition();
407

    
408
            List<string> chkColNames = new List<string>() { "Checked" };
409

    
410
            List<string> docLinkColNames = new List<string>() { "AutoCADLink", "ID2Connection", "PDFLink", "MarkupLink", "AVEVALink", "Compare" };
411
            List<string> docInfoColNames = new List<string>() { "RefProjectCode", "System", "SubSystemCode", "DocumentNo", "PersonInCharge", "Worker", "AVEVAPersonInCharge", "AVEVAWorker", "JobLevel", "RevisonNo" };
412
            List<string> rvToColNames = new List<string>() { "ToIsDiscussion", "ToRemarks", "ToCreator", "ToCapture" };
413
            List<string> rvFrColNames = new List<string>() { "FrReviewStatus", "FrRemarks", "FrCreator", "FrCapture" };
414
            List<string> wkID2ColNames = new List<string>() { "ID2StartDate", "ID2EndDate", "ID2Status", "ID2Issues", "ID2Capture", "ReplyModifications", "ReplyRequester" };
415
            List<string> wkAVEVAColNames = new List<string>() { "IsConvert", "AVEVAConvertDate", "AVEVAWorkDate", "AVEVAStatus", "AVEVAIssues" };
416
            List<string> valProdColNames = new List<string>() { "AVEVAReviewDate", "ProdReviewer", "ProdIsResult", "ProdRemarks" };
417
            List<string> valCntColNames = new List<string>() { "ClientReviewer", "ClientIsResult", "ClientRemarks" };
418
            List<string> dtColNames = new List<string>() { "DTIsGateWay", "DTIsImport", "DTIsRegSystem", "DTRemarks" };
419

    
420
            //체크
421
            GridViewColumnGroup chkColGrp = new GridViewColumnGroup("√") { IsPinned = true };
422
            GridViewColumnGroupRow chkColGrpRow = new GridViewColumnGroupRow();
423
            chkColGrpRow.ColumnNames.AddRange(chkColNames);
424
            chkColGrp.Rows.Add(chkColGrpRow);
425

    
426
            //도면
427
            GridViewColumnGroup docColGrp = new GridViewColumnGroup("도면 ");
428
            GridViewColumnGroup docLinkColGrp = new GridViewColumnGroup("프로그램 연동");
429
            GridViewColumnGroup docInfoColGrp = new GridViewColumnGroup("도면정보");
430

    
431
            GridViewColumnGroupRow docLinkColGrpRow = new GridViewColumnGroupRow();
432
            docLinkColGrpRow.ColumnNames.AddRange(docLinkColNames);
433

    
434
            GridViewColumnGroupRow docInfoColGrpRow = new GridViewColumnGroupRow();
435
            docInfoColGrpRow.ColumnNames.AddRange(docInfoColNames);
436

    
437
            docLinkColGrp.Rows.Add(docLinkColGrpRow);
438
            docColGrp.Groups.Add(docLinkColGrp);
439
            docInfoColGrp.Rows.Add(docInfoColGrpRow);
440
            docColGrp.Groups.Add(docInfoColGrp);
441

    
442
            //검토
443
            GridViewColumnGroup rvColGrp = new GridViewColumnGroup("검토", "review");
444
            GridViewColumnGroup rvToColGrp = new GridViewColumnGroup("도프텍");
445
            GridViewColumnGroup rvFrColGrp = new GridViewColumnGroup("삼성");
446

    
447
            GridViewColumnGroupRow rvToColGrpRow = new GridViewColumnGroupRow();
448
            rvToColGrpRow.ColumnNames.AddRange(rvToColNames);
449

    
450
            GridViewColumnGroupRow rvFrColGrpRow = new GridViewColumnGroupRow();
451
            rvFrColGrpRow.ColumnNames.AddRange(rvFrColNames);
452

    
453
            rvToColGrp.Rows.Add(rvToColGrpRow);
454
            rvFrColGrp.Rows.Add(rvFrColGrpRow);
455

    
456
            rvColGrp.Groups.Add(rvToColGrp);
457
            rvColGrp.Groups.Add(rvFrColGrp);
458

    
459
            //작업
460
            GridViewColumnGroup wkColGrp = new GridViewColumnGroup("작업", "work");
461
            GridViewColumnGroup wkID2ColGrp = new GridViewColumnGroup("ID2");
462
            GridViewColumnGroup wkAVEVAColGrp = new GridViewColumnGroup("AVEVA");
463

    
464
            GridViewColumnGroupRow wkID2ColGrpRow = new GridViewColumnGroupRow();
465
            wkID2ColGrpRow.ColumnNames.AddRange(wkID2ColNames);
466

    
467
            GridViewColumnGroupRow wkAVEVAColGrpRow = new GridViewColumnGroupRow();
468
            wkAVEVAColGrpRow.ColumnNames.AddRange(wkAVEVAColNames);
469

    
470
            wkID2ColGrp.Rows.Add(wkID2ColGrpRow);
471
            wkAVEVAColGrp.Rows.Add(wkAVEVAColGrpRow);
472

    
473
            wkColGrp.Groups.Add(wkID2ColGrp);
474
            wkColGrp.Groups.Add(wkAVEVAColGrp);
475

    
476
            //Validation
477
            GridViewColumnGroup valColGrp = new GridViewColumnGroup("Validation", "validation");
478
            GridViewColumnGroup valProdColGrp = new GridViewColumnGroup("도프텍");
479
            GridViewColumnGroup valCntColGrp = new GridViewColumnGroup("삼성전자");
480

    
481
            GridViewColumnGroupRow valProdColGrpRow = new GridViewColumnGroupRow();
482
            valProdColGrpRow.ColumnNames.AddRange(valProdColNames);
483

    
484
            GridViewColumnGroupRow valCntColGrpRow = new GridViewColumnGroupRow();
485
            valCntColGrpRow.ColumnNames.AddRange(valCntColNames);
486

    
487
            valProdColGrp.Rows.Add(valProdColGrpRow);
488
            valCntColGrp.Rows.Add(valCntColGrpRow);
489

    
490
            valColGrp.Groups.Add(valProdColGrp);
491
            valColGrp.Groups.Add(valCntColGrp);
492

    
493
            //AVEVA Net
494
            GridViewColumnGroup dtColGrp = new GridViewColumnGroup("AVEVA Net\n(Digital Twin)", "avevanet");
495

    
496
            GridViewColumnGroupRow dtColGrpRow = new GridViewColumnGroupRow();
497
            dtColGrpRow.ColumnNames.AddRange(dtColNames);
498

    
499
            dtColGrp.Rows.Add(dtColGrpRow);
500

    
501
            //Group 추가
502
            columnGroupsView.ColumnGroups.Add(chkColGrp);
503
            columnGroupsView.ColumnGroups.Add(docColGrp);
504
            columnGroupsView.ColumnGroups.Add(wkColGrp);
505
            columnGroupsView.ColumnGroups.Add(rvColGrp);
506
            columnGroupsView.ColumnGroups.Add(valColGrp);
507
            columnGroupsView.ColumnGroups.Add(dtColGrp);
508

    
509
            gridView.MasterTemplate.ViewDefinition = columnGroupsView;
510
        }
511
        #endregion
512
    }
513
}
514

    
515
public class FilterColumn
516
{
517
    public string Name { get; set; }
518
    public string FieldName { get; set; }
519
    public bool IsSelect { get; set; }
520
}
클립보드 이미지 추가 (최대 크기: 500 MB)