1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
using DevExpress.XtraTreeList.Nodes;
using DevExpress.XtraTreeList;
using Gs.DevApp.Entity;
using Gs.DevApp.ToolBox;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
namespace Gs.DevApp.DevFrm.QC
{
    public partial class DefectCode : DevExpress.XtraEditors.XtraUserControl
    {
        string _webServiceName = "MesDefectCodeManager/";
        List<FilterEntity> _filterList = new List<FilterEntity>();
 
        public string strType = "";//类别(普通信息,认证信息)
        /// <summary>
        /// DefectCode类的构造函数
        /// </summary>
        /// <param name="_strType">传入的类型参数(如"QC基础资料",用于标识数据类别)</param>
        public DefectCode(string _strType)
        {
            // 1. 初始化控件布局(设计器自动生成的方法,设置控件位置、大小等)
            InitializeComponent();
            // 将传入的类型参数赋值给类的成员变量(后续逻辑中使用)
            strType = _strType;
 
            // 2. 绑定工具栏按钮事件(加载、查询)
            // 绑定"加载"按钮点击事件:点击后触发 ToolBarMenu1_btnLoadClick 方法
            toolBarMenu1.btnLoadClick += ToolBarMenu1_btnLoadClick;
            // 绑定"查询"按钮点击事件:点击后触发 ToolBarMenu1_btnQueryClick 方法
            this.toolBarMenu1.btnQueryClick += ToolBarMenu1_btnQueryClick;
 
 
            // 3. 配置树形列表(tlMenu)的序号列样式
            // 设置树形列表的"序号列"宽度为50像素
            tlMenu.IndicatorWidth = 50;
            // 绑定"自定义绘制序号列"事件:自定义序号显示逻辑
            tlMenu.CustomDrawNodeIndicator += (s, ee) =>
            {
                // 判断当前绘制的是"序号列"
                if (ee.IsNodeIndicator)
                {
                    // 获取当前节点在可见列表中的索引(从0开始)
                    var index = ee.Node.TreeList.GetVisibleIndexByNode(ee.Node);
                    // 序号显示为"索引+1"(从1开始计数)
                    ee.Info.DisplayText = (index + 1).ToString();
                }
            };
 
 
            // 4. 初始加载第一页数据
            getPageList(1);
 
 
            // 5. 绑定树形列表鼠标点击事件(后续可在 TlMenu_MouseDown 中处理点击逻辑)
            this.tlMenu.MouseDown += TlMenu_MouseDown;
 
 
            // 6. 绑定"添加子节点"菜单按钮事件(右键菜单或工具栏按钮)
            this.toolStripMenuItemAdd.Click += (s, ee) =>
            {
                // 初始化节点ID(新增节点暂未生成ID,为空)
                string strGuid = "";
                // 父节点ID:如果选中了某个节点,则以该节点为父节点;否则父节点为空(顶级节点)
                string strUpGuid = "";
                if (tlMenu.FocusedNode != null)
                {
                    // 获取选中节点的"guid"字段值,作为新节点的父ID
                    strUpGuid = tlMenu.FocusedNode.GetValue("guid").ToString();
                }
 
                // 打开新增节点的弹窗(参数:节点ID、父节点ID、数据类型)
                Frm_MesDefectCodeShow frm = new Frm_MesDefectCodeShow(strGuid, strUpGuid, strType);
                // 绑定弹窗的"更新父控件"事件:弹窗关闭后刷新当前页面数据
                frm.UpdateParent += (s2, ee2) =>
                {
                    getPageList(1); // 重新加载第一页数据
                };
                // 以模态窗口显示弹窗(阻塞当前界面,直到弹窗关闭)
                frm.ShowDialog();
            };
 
 
            // 7. 绑定"添加根节点"菜单按钮事件
            this.toolStripMenuItemRoot.Click += (s, ee) =>
            {
                // 新增根节点:节点ID和父节点ID均为空(无父节点)
                string strGuid = "";
                string strUpGuid = "";
                // 打开新增弹窗(明确添加根节点,父ID为空)
                Frm_MesDefectCodeShow frm = new Frm_MesDefectCodeShow(strGuid, strUpGuid, strType);
                // 弹窗关闭后刷新数据
                frm.UpdateParent += (s2, ee2) =>
                {
                    getPageList(1);
                };
                frm.ShowDialog();
            };
 
 
            // 8. 绑定"删除节点"菜单按钮事件
            this.toolStripMenuItemDel.Click += (s, ee) =>
            {
                // 判断是否选中了节点(未选中则提示)
                if (tlMenu.FocusedNode != null)
                {
                    // 获取选中节点的ID和名称(用于删除确认)
                    string rowGuid = "";
                    string rowName = "";
                    rowGuid = tlMenu.FocusedNode.GetValue("guid").ToString();
                    rowName = tlMenu.FocusedNode.GetValue("defectName").ToString();
 
                    // 节点ID为空时提示(异常情况处理)
                    if (string.IsNullOrEmpty(rowGuid))
                    {
                        ToolBox.MsgHelper.Warning("请先选择你要操作的行!");
                        return;
                    }
 
                    // 弹出确认框:提示用户是否删除选中的节点
                    if (!MsgHelper.AskQuestion("你选择了【" + rowName + "】,确定删除吗?"))
                        return; // 用户取消删除,直接返回
 
                    // 准备删除参数:将节点ID存入列表(适配接口参数格式)
                    List<dynamic> lst = new List<dynamic>();
                    lst.Add(rowGuid);
                    var _obj = lst;
 
                    try
                    {
                        // 调用WebService接口删除节点(POST请求,传入节点ID列表)
                        string strJson = UtilityHelper.HttpPost("", _webServiceName + "DeleteModel", JsonConvert.SerializeObject(_obj));
                        // 解析接口返回结果
                        ReturnModel<dynamic> _rtn = ToolBox.UtilityHelper.ReturnToDynamic(strJson);
 
                        // 接口返回成功(rtnCode>0):从树形列表中移除该节点
                        if (_rtn.rtnCode > 0)
                        {
                            tlMenu.DeleteNode(tlMenu.FocusedNode);
                        }
                        // 接口返回失败:提示错误信息
                        else
                            ToolBox.MsgHelper.Warning("提示:" + _rtn.rtnMsg);
                    }
                    // 捕获异常(如网络错误、接口报错)并提示
                    catch (Exception ex)
                    {
                        ToolBox.MsgHelper.Warning("提示:" + ex.Message);
                    }
                }
            };
 
 
            // 9. 绑定"编辑节点"菜单按钮事件
            this.toolStripMenuItemEdt.Click += (s, ee) =>
            {
                // 节点ID:选中节点的ID(用于回显数据)
                string strGuid = "";
                // 父节点ID:选中节点的父ID(编辑时保持父节点不变)
                string strUpGuid = "";
                if (tlMenu.FocusedNode != null)
                {
                    strGuid = tlMenu.FocusedNode.GetValue("guid").ToString();
                    strUpGuid = tlMenu.FocusedNode.GetValue("pid").ToString();
                }
 
                // 打开编辑弹窗(参数:节点ID、父节点ID、数据类型)
                Frm_MesDefectCodeShow frm = new Frm_MesDefectCodeShow(strGuid, strUpGuid, strType);
                // 弹窗关闭后刷新当前页面数据
                frm.UpdateParent += (s2, ee2) =>
                {
                    getPageList(1);
                };
                frm.ShowDialog();
            };
        }
        /// <summary>
        /// 右键弹出菜单,如果是行,增加子项目,否则增加主项
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TlMenu_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                TreeListHitInfo hInfo = tlMenu.CalcHitInfo(new Point(e.X, e.Y));
                TreeListNode node = hInfo.Node;
                tlMenu.FocusedNode = node;
                if (hInfo.HitInfoType == HitInfoType.Cell ||
                    hInfo.HitInfoType == HitInfoType.Row ||
                    hInfo.HitInfoType == HitInfoType.RowIndent ||
                    hInfo.HitInfoType == HitInfoType.RowIndicator
                    )
                {
                    if (node != null)
                    {
                        toolStripMenuItemAdd.Visible = true;
                        toolStripMenuItemEdt.Visible = true;
                        toolStripMenuItemDel.Visible = true;
                        toolStripMenuItemRoot.Visible = false;
                        cms1.Show(tlMenu, e.Location);
                    }
                }
                else
                {
                    toolStripMenuItemAdd.Visible = false;
                    toolStripMenuItemEdt.Visible = false;
                    toolStripMenuItemDel.Visible = false;
                    toolStripMenuItemRoot.Visible = true;
                    cms1.Show(tlMenu, e.Location);
                }
            }
        }
 
 
        /// <summary>
        /// 查询事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ToolBarMenu1_btnQueryClick(object sender, EventArgs e)
        {
            Gs.DevApp.ToolBox.MsgHelper.ShowInformation("该窗体不支持查询,若想更新页面,请点击 刷新");
        }
 
        /// <summary>
        /// 刷新事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ToolBarMenu1_btnLoadClick(object sender, EventArgs e)
        {
            _filterList.Clear();
            getPageList(1);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="curPage">第几页</param>
        /// <param name="pageSize">每页几条</param>
        private void getPageList(int curPage)
        {
            System.Text.StringBuilder sbWhere = new StringBuilder();
            sbWhere.Append(" and a.defect_sort='" + strType + "'");
            var pgq = new PageQueryModel(1, 999999, "a.defect_code ", "asc","", sbWhere.ToString());
            var json = JsonConvert.SerializeObject(pgq);
            try
            {
                var strReturn =
                    UtilityHelper.HttpPost("", _webServiceName + "GetListPage", json);
                var dd = UtilityHelper.ReturnToTablePage(strReturn);
                var dt = dd.rtnData.list;
                tlMenu.DataSource = dt;
                tlMenu.KeyFieldName = "guid";
                tlMenu.ParentFieldName = "pid";
                tlMenu.EndUpdate();
                //this.tlMenu.CollapseAll();
                // this.tlMenu.ExpandAll();
                this.tlMenu.ExpandToLevel(0);
            }
            catch (Exception ex)
            {
                MsgHelper.Warning("提示:" + ex.Message);
            }
        }
 
       
    }
}