using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.Collections; namespace IControls_FireManager { public partial class Form_PointConfig : Form { // 대화 팝업용 Form DialogPopup = new Form(); // 크로스 스레드 해결 delegate void Cross_Thread(); // 수신기 ID를 저장하기 위해서 string ReceiverID = null; // 엑셀 임포팅 타입 string Type = null; // UI 갱신 타이머 bool ui_renew = false; public Form_PointConfig(_RECEIVER RECEIVER, string Info) { InitializeComponent(); /// /// 폼이 생성되는 위치 /// this.StartPosition = FormStartPosition.Manual; this.Location = new System.Drawing.Point(MousePosition.X, MousePosition.Y); // 수신기 ID 저장 ReceiverID = RECEIVER.ID; // 엑셀 임포팅 타입 Type = Info; // 폼 텍스트 쿄체 this.Text = Info + " 정보 불러오기"; /// /// 이벤트 /// // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용) this.FormClosing += new FormClosingEventHandler(CreateForm_FormClosing); } // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용) public void CreateForm_FormClosing(object sender, FormClosingEventArgs e) { } // 엑셀파일 경로 지정 private void uiButton_ProjectPath_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); // 엑셀파일 연동시에 다이얼로그창은 프로젝트 경로에 따라서 Field 폴더에 곧바로 접근할 수있도록 함 openFileDialog.InitialDirectory = _Data.Project_Path + "\\" + _Data.Project_Name; // 필터 처리 안함 (사용자가 xml //openFileDialog.Filter = "(*.xls)|*.xls|(*.xlsx)|*.xlsx"; openFileDialog.Filter = "(*.xls*)|*.xls*"; if (openFileDialog.ShowDialog() == DialogResult.OK) { if (_Excel.OpenTest(openFileDialog.FileName) == true) { this.editBox_ProjectPath.Text = openFileDialog.FileName; } else this.editBox_ProjectPath.Text = null; } } // UiProgressBar 크로스 스레드 해결 private void Delegate_UiProgressBar() { if (this.InvokeRequired) { Cross_Thread d = new Cross_Thread(Delegate_UiProgressBar); this.Invoke(d, new object[] { }); } else { UiProgressBar_ExcelImport.Value++; } } // UiButton 크로스 스레드 해결 private void Delegate_UiButton_good() { if (this.InvokeRequired) { Cross_Thread d = new Cross_Thread(Delegate_UiButton_good); this.Invoke(d, new object[] { }); } else { label1.Text = "※ 완료되었습니다."; UiButton_Apply.Enabled = true; UiButton_Close.Enabled = true; } } private void Delegate_UiButton_bad() { if (this.InvokeRequired) { Cross_Thread d = new Cross_Thread(Delegate_UiButton_bad); this.Invoke(d, new object[] { }); } else { label1.Text = "※ 실패하였습니다."; UiButton_Apply.Enabled = true; UiButton_Close.Enabled = true; } } // 닫기 버튼 private void UiButton_Close_Click(object sender, EventArgs e) { // 폼을 닫음 this.Close(); } // 저장 버튼 private void UiButton_Apply_Click(object sender, EventArgs e) { // 파일을 아무것도 선택하지 않았을 경우 if (editBox_ProjectPath.Text.Length == 0) { // 파일을 선택해 주세요 _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.NotFileChoice, 0); return; } // 엑셀 Import 중에는 엑셀 파일을 열수가 없는지 구분가능하도록 옵션조절 if (_Data.Project_ExcelOpenCheck == "1") { // 엑셀 Import 중에는 엑셀 파일을 열수가 없다 if (_Diagnostics.Process_Excute("EXCEL") == true || _Diagnostics.Process_Excute("excel") == true) { // 파일을 선택해 주세요 _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 450, 150, _Text.ExcelProcessNotuse, 0); return; } } // 버튼 연속으로 입력은 안됨 if (_Data.Enable_Button == false) return; else _Data.Enable_Button = false; // 파일 읽기가 성공한다면 곧바로 _Excel.Import_Point 작업을 수행하는데 // 지정된 경로에 있는 엑셀파일을 읽은후 5가지 작업을 함 // 1. 코드값 저장 // -> _Data.HASH_CodePosition 및 _Data.LIST_CodePosition_NAME 에 저장 // 2. 포인트 정보 저장 // -> _Data.List_ExcelPoint 에 저장 // 3. 포인트 위치 정보에 따라 실제로 사용한는 위치 코드값을 재정리 // -> _Data.HASH_CodePosition 및 _Data.LIST_CodePosition_NAME 수정 // ##수정 - 여기서 Import 하지 않음 // 4. 그룹 정보 저장 // -> _Data.List_ExcelGroup 에 저장 // 5. 맵연동 정보 저장 // -> _Data.List_ExcelMap 에 저장 // 포인트(디바이스) 정보 임포팅 if (Type == _Text.UI_TREE_POINT) { if (_Excel.Import_Point(this.editBox_ProjectPath.Text) == true) { // 엑셀 Import 실제 진행 // 저장되어 있는 디바이스 정보는 모두 삭제됩니다. 계속 진행하시겠습니까? DialogPopup = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 500, 150, _Text.DeviceInfoDelete_Continue, 0); // 대화 팝업은 특별처리 _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_PopupClose_SendMessage_Event); } else _Data.Enable_Button = true; } else if (Type == _Text.UI_TREE_OPER_GROUP) // 그룹 정보 임포팅 { if (_Excel.Import_Group(this.editBox_ProjectPath.Text) == true) { // 엑셀 Import 실제 진행 // 저장되어 있는 그룹 정보는 모두 삭제됩니다. 계속 진행하시겠습니까? DialogPopup = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 500, 150, _Text.GroupInfoDelete_Continue, 0); // 대화 팝업은 특별처리 _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_PopupClose_SendMessage_Event); } else _Data.Enable_Button = true; } else // 연동설정 정보 임포팅 { if (_Excel.Import_Map(this.editBox_ProjectPath.Text, ReceiverID) == true) { // 엑셀 Import 실제 진행 // 저장되어 있는 연동설정 정보는 모두 삭제됩니다. 계속 진행하시겠습니까? DialogPopup = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 500, 150, _Text.MapInfoDelete_Continue, 0); // 대화 팝업은 특별처리 _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_PopupClose_SendMessage_Event); } else _Data.Enable_Button = true; } } // 스레드 public void Excel_Import() { // 포인트(디바이스) 정보 임포팅 if (Type == _Text.UI_TREE_POINT) { // // TB_POSITION_CODE 처리 (삽입) // // 이미 _Excel.Import_Point 루틴에서 먼저 실제 사용하는 것만 리스트로 구성하도록 만들었다 // 1개만 존재하는 경우 무조건 삭제한다, 결국 데이타 삽입도 조건 없이 삽입이다 if (_Data.LIST_XMLRECEIVER_ID.Count == 1) { // TB_POSITION_CODE 테이블에 데이터 삽입 foreach (string CodePosition_NAME in _Data.LIST_CodePosition_NAME) { _Db.ADD("TB_POSITION_CODE", "POSITION_NAME=" + CodePosition_NAME + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ";POSITION_CODE=" + ((_Code_Position)_Data.HASH_CodePosition[CodePosition_NAME]).Code_Position_ID); } } // 수신기가 2개이상이라면 기존에 데이타가 있는지 검색하고 삽입해야한다 else { // TB_POSITION_CODE 테이블에 데이터 삽입 foreach (string CodePosition_NAME in _Data.LIST_CodePosition_NAME) { string TEMP_Code_Position_ID = ((_Code_Position)_Data.HASH_CodePosition[CodePosition_NAME]).Code_Position_ID; DataRowCollection DB_TABLE_TB_POSITION_CODE = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_POSITION_CODE", "POSITION_CODE", TEMP_Code_Position_ID, null)); // cyim 2016.07.12 : TB_POSITION_CODE 테이블 삭제하고 다시 생성하는 코드 원복, 확인결과 하나하나 중계기 입출력 포인트 별 개별적으로 위치코드가 추가된다 // 기존의 데이타가 있다면 중복될 우려가 있으므로 삭제 해야한다 if (DB_TABLE_TB_POSITION_CODE != null || DB_TABLE_TB_POSITION_CODE.Count != 0) { // 있다면 삭제하고 _Db.Execute(_Sql.Delete_Table("TB_POSITION_CODE", "POSITION_CODE", TEMP_Code_Position_ID, null)); // 삽입 _Db.ADD("TB_POSITION_CODE", "POSITION_NAME=" + CodePosition_NAME + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ";POSITION_CODE=" + TEMP_Code_Position_ID); } else { // 삽입 _Db.ADD("TB_POSITION_CODE", "POSITION_NAME=" + CodePosition_NAME + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ";POSITION_CODE=" + TEMP_Code_Position_ID); } } } // TB_EVENT_TYPE 테이블에 데이터 삽입 foreach (_Code_Event_Type Code_Event_Type in _Data.LIST_CodeEventType) { _Db.ADD("TB_EVENT_TYPE", "EVENT_TYPE=" + Code_Event_Type.EVENT_TYPE + ";EVENT_TYPE_NAME=" + Code_Event_Type.EVENT_TYPE_NAME + ";UPDATE_USER_ID=" + "FireManager" + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } // TB_DEVICE_TYPE 테이블에 데이터 삽입 foreach (_Code_Device_Type Table_Device_Type in _Data.LIST_CodeDeviceType) { _Db.ADD("TB_DEVICE_TYPE", "DEVICE_TYPE=" + Table_Device_Type.DEVICE_TYPE + ";DEVICE_TYPE_NAME=" + Table_Device_Type.DEVICE_TYPE_NAME + ";SYMBOL_TYPE=" + Table_Device_Type.SYMBOL_TYPE + ";SEQ_NO=" + Table_Device_Type.SEQ_NO + ";USE_FLAG=" + Table_Device_Type.USE_FLAG + ";UPDATE_USER_ID=" + "FireManager" + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } // TB_POSITION_CODE 테이블에 전체데이터를 삽입하고 Value값 1증가 if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum) Delegate_UiProgressBar(); //크로스 스레드 해결 // 2015.6.16 // 아래부터 아날로그 감지기를 위한 루틴이 추가되었다 // 아날로그 감지기를 위한 테이블은 총 4개이다. // TB_REPEATER, TB_DEVICE, TB_DAYTIME, TB_ANALOG_DEVICE_2 // 아날로그 감지기 화재 (FireDay 모드) 시간이 있는 경우에만 if (_Data.LIST_CodeFireDayTime.Count != 0) { _Db.ADD("TB_DAYTIME", "START_HOUR=" + _Data.LIST_CodeFireDayTime[0].ToString() + ";START_MIN=" + _Data.LIST_CodeFireDayTime[1].ToString() + ";END_HOUR=" + _Data.LIST_CodeFireDayTime[2].ToString() + ";END_MIN=" + _Data.LIST_CodeFireDayTime[3].ToString()); } // cyim 2017.01.19 반드시 통신보드 1번에 0번루프 중계기126번 127번 중계기가 있어야한다 // cyim 2017.01.23 반드시 통신보드 1번에 0번루프 중계기124번 125번 중계기가 있어야한다 int RePeater_Special = 0; int RePeater_Special_Point = 0; // 3개 테이블 동시 삽입 // TB_REPEATER 테이블에 데이터 삽입 // TB_DEVICE 테이블에 데이터 삽입 // TB_EMERGENCY_BROADCASTION 테이블에 데이터 삽입 foreach (_Excel_Sheet Excel_Sheet in _Data.List_ExcelPoint) { foreach (_Excel_Repeater Excel_Repeater in Excel_Sheet.List_Repeater) { // 중계기 타입을 확인하여 코드 생성 // 중계기 타입은 아래와 같다 // '1' = A : 2X2 // '2' = B : 4X4 // '4' = C : 아날로그연감지기 // '5' = D : 아날로그열감지기 string RepeaterType = null; if (Excel_Repeater.TYPE.ToString() == POINT_TYPE.REPEATER_2_2.ToString()) RepeaterType = "1"; else if (Excel_Repeater.TYPE.ToString() == POINT_TYPE.REPEATER_4_4.ToString()) RepeaterType = "2"; else if (Excel_Repeater.TYPE.ToString() == POINT_TYPE.ANALOG_SMOKE.ToString()) RepeaterType = "4"; else if (Excel_Repeater.TYPE.ToString() == POINT_TYPE.ANALOG_HEAT.ToString()) RepeaterType = "5"; // cyim 2017.01.19 반드시 통신보드 1번에 0번루프 중계기126번 127번 중계기가 있어야한다 // cyim 2017.01.23 반드시 통신보드 1번에 0번루프 중계기124번 125번 중계기가 있어야한다 if (Excel_Sheet.BOARD_ID == "1" && (Excel_Repeater.REPEATER_ID == "124" || Excel_Repeater.REPEATER_ID == "125" || Excel_Repeater.REPEATER_ID == "126" || Excel_Repeater.REPEATER_ID == "127") ) RePeater_Special++; // TB_REPEATER 테이블에 데이터 삽입 _Db.ADD("TB_REPEATER", "RECEIVER_ID=" + ReceiverID + ";COMM_ID=" + "1" + ";BOARD_ID=" + Excel_Sheet.BOARD_ID + ";LOOP_NO=" + (Int32.Parse(Excel_Sheet.LOOP_NO) - 1) + // 채널값은 엑셀에 나와 있는 값에서 -1 ";REPEATER_ID=" + Excel_Repeater.REPEATER_ID + ";REPEATER_TYPE=" + RepeaterType + ";REPEATER_NAME=" + Excel_Repeater.NAME + ";CUT_FLAG=" + "N" + ";USE_FLAG=" + "Y" + ";POSITION_CODE=" + ((_Code_Position)_Data.HASH_CodePosition[_Excel.Code_Position_Name_Create(Excel_Repeater.Excel_Position.Building, Excel_Repeater.Excel_Position.Stair, Excel_Repeater.Excel_Position.Floor)]).Code_Position_ID + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); foreach (_Excel_Point Excel_Point in Excel_Repeater.List_Point) { // cyim 2017.01.23 반드시 통신보드 1번에 0번루프 중계기124번 125번 중계기가 있어야한다 if (Excel_Sheet.BOARD_ID == "1" && (Excel_Repeater.REPEATER_ID == "124" || Excel_Repeater.REPEATER_ID == "125" || Excel_Repeater.REPEATER_ID == "126" || Excel_Repeater.REPEATER_ID == "127") ) RePeater_Special_Point++; // TB_DEVICE 테이블에 데이터 삽입 _Db.ADD("TB_DEVICE", "RECEIVER_ID=" + ReceiverID + ";COMM_ID=" + "1" + ";BOARD_ID=" + Excel_Sheet.BOARD_ID + ";LOOP_NO=" + (Int32.Parse(Excel_Sheet.LOOP_NO) - 1) + // 채널값은 엑셀에 나와 있는 값에서 -1 ";REPEATER_ID=" + Excel_Repeater.REPEATER_ID + ";DEVICE_ID=" + Excel_Point.PortNum + ";INOUT_TYPE=" + Excel_Point.TYPE + ";DEVICE_NAME=" + Excel_Point.NAME + ";DEVICE_TYPE=" + Excel_Point.Code_Type + ";POSITION_CODE=" + ((_Code_Position)_Data.HASH_CodePosition[_Excel.Code_Position_Name_Create(Excel_Point.Excel_Position.Building, Excel_Point.Excel_Position.Stair, Excel_Point.Excel_Position.Floor)]).Code_Position_ID + ";CUT_FLAG=" + "N" + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); // TB_EMERGENCY_BROADCASTION 테이블에 데이터 삽입 if (Excel_Point.Code_Name == "일반화재입력" || Excel_Point.Code_Name == "축적화재입력" || Excel_Point.Code_Name == "열감지기입력" || Excel_Point.Code_Name == "연감지기입력") { // 포지션코드 확인해서 분리 //string Position_Code = ((_Code_Position)_Data.HASH_CodePosition[_Excel.Code_Position_Name_Create(Excel_Point.Excel_Position.Building, Excel_Point.Excel_Position.Stair, Excel_Point.Excel_Position.Floor)]).Code_Position_ID; //string AREA_CODE = Position_Code.Substring(0, 2); //string STAIR_CODE = Position_Code.Substring(2, 2); //string FLOOR_CODE = Position_Code.Substring(4, 2); //// 지하층일 경우 무조건 FLOOR_CODE는 "00" //if (FLOOR_CODE == "36" || FLOOR_CODE == "37" || FLOOR_CODE == "38" || FLOOR_CODE == "39" || FLOOR_CODE == "40" || FLOOR_CODE == "41" || FLOOR_CODE == "42") // FLOOR_CODE = "00"; string Emergency_Code = ((_Code_Position)_Data.HASH_CodePosition[_Excel.Code_Position_Name_Create(Excel_Point.Excel_Position.Building, Excel_Point.Excel_Position.Stair, Excel_Point.Excel_Position.Floor)]).Code_Emergency_ID; string AREA_CODE = Emergency_Code.Substring(0, 2); string STAIR_CODE = Emergency_Code.Substring(2, 2); string FLOOR_CODE = Emergency_Code.Substring(4, 2); _Db.ADD("TB_EMERGENCY_BROADCASTION", "RECEIVER_ID=" + ReceiverID + ";COMM_ID=" + "1" + ";BOARD_ID=" + Excel_Sheet.BOARD_ID + ";LOOP_NO=" + (Int32.Parse(Excel_Sheet.LOOP_NO) - 1) + // 채널값은 엑셀에 나와 있는 값에서 -1 ";REPEATER_ID=" + Excel_Repeater.REPEATER_ID + ";DEVICE_ID=" + Excel_Point.PortNum + ";INOUT_TYPE=" + Excel_Point.TYPE + ";AREA_CODE=" + AREA_CODE + ";STAIR_CODE=" + STAIR_CODE + ";FLOOR_CODE=" + FLOOR_CODE + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } // cyim 2016.07.27 : 아날로그 감지기 레벨 감지기 타입별 설정 기능 // 아날로그 감지기 레벨값이 있는 경우에만 if (RepeaterType == "4" && _Data.LIST_CodeAnalogLevel_Smoke.Count == 4) { // TB_ANALOG_DEVICE_2 테이블에 데이터 삽입 _Db.ADD("TB_ANALOG_DEVICE_2", "RECEIVER_ID=" + ReceiverID + ";COMM_ID=" + "1" + ";BOARD_ID=" + Excel_Sheet.BOARD_ID + ";LOOP_NO=" + (Int32.Parse(Excel_Sheet.LOOP_NO) - 1) + // 채널값은 엑셀에 나와 있는 값에서 -1 ";REPEATER_ID=" + Excel_Repeater.REPEATER_ID + ";DEVICE_ID=" + Excel_Point.PortNum + ";INOUT_TYPE=" + Excel_Point.TYPE + ";FAULT_VALUE=" + _Data.LIST_CodeAnalogLevel_Smoke[0].ToString() + ";PREFIRE_VALUE=" + _Data.LIST_CodeAnalogLevel_Smoke[1].ToString() + ";FIRED_VALUE=" + _Data.LIST_CodeAnalogLevel_Smoke[2].ToString() + ";FIREN_VALUE=" + _Data.LIST_CodeAnalogLevel_Smoke[3].ToString() + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } if (RepeaterType == "5" && _Data.LIST_CodeAnalogLevel_Heat.Count == 4) { // TB_ANALOG_DEVICE_2 테이블에 데이터 삽입 _Db.ADD("TB_ANALOG_DEVICE_2", "RECEIVER_ID=" + ReceiverID + ";COMM_ID=" + "1" + ";BOARD_ID=" + Excel_Sheet.BOARD_ID + ";LOOP_NO=" + (Int32.Parse(Excel_Sheet.LOOP_NO) - 1) + // 채널값은 엑셀에 나와 있는 값에서 -1 ";REPEATER_ID=" + Excel_Repeater.REPEATER_ID + ";DEVICE_ID=" + Excel_Point.PortNum + ";INOUT_TYPE=" + Excel_Point.TYPE + ";FAULT_VALUE=" + _Data.LIST_CodeAnalogLevel_Heat[0].ToString() + ";PREFIRE_VALUE=" + _Data.LIST_CodeAnalogLevel_Heat[1].ToString() + ";FIRED_VALUE=" + _Data.LIST_CodeAnalogLevel_Heat[2].ToString() + ";FIREN_VALUE=" + _Data.LIST_CodeAnalogLevel_Heat[3].ToString() + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } // TB_REPEATER 테이블에 데이터 삽입할때마다 Value값을 1 증가시킴 if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum) Delegate_UiProgressBar(); //크로스 스레드 해결 } } // cyim 2017.02.02 : IFC 3300 에서는 엑셀입출력표 제한을 걸지 않는다 // hoon 2020-01-08 사업부(장재연)의 요청으로 다 허용으로 수정 //if (((_RECEIVER)_Data.HASH_RECEIVER[ReceiverID]).MODEL != "IFC3300") //{ // // cyim 2017.01.23 반드시 통신보드 1번에 0번루프 중계기124번 125번 중계기가 있어야한다 // // cyim 2017.01.19 반드시 통신보드 1번에 0번루프 중계기126번 127번 중계기가 있어야한다 // if ((RePeater_Special == 4 || RePeater_Special == 8) && (RePeater_Special_Point == 13 || RePeater_Special_Point == 26)) // { // ; // } // else // { // // UI를 갱신하라 // ui_renew = true; // // 저장버튼 및 닫기버튼 사용하게... // Delegate_UiButton_bad(); // // 프로젝트 수정 // _Data.ProJect_Save_Complete = false; // // 버튼은 사용가능함 // _Data.Enable_Button = true; // _Popup.MessageBoxPopup(MessageBoxButtons.OK, _Text.ExceptionError6, _Text.OK); // return; // } //} // // GridEx 출력 // // 그리드에 출력이 끝나면 Value값을 1 증가시킴 if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum) Delegate_UiProgressBar(); //크로스 스레드 해결 //** IO 보드 디바이스 추가 (엑셀연동 루틴 추가) bool result = Add_IOBoard_Device(); // cyim 2016.12.22 모델별 엑셀임포트 오류 방지 if (result == false) { // UI를 갱신하라 ui_renew = true; // 저장버튼 및 닫기버튼 사용하게... Delegate_UiButton_bad(); // 프로젝트 수정 _Data.ProJect_Save_Complete = false; // 버튼은 사용가능함 _Data.Enable_Button = true; //if (((_RECEIVER)_Data.HASH_RECEIVER[ReceiverID]).MODEL == "IFC3300") // _Popup.MessageBoxPopup(MessageBoxButtons.OK, _Text.ExceptionError4,_Text.OK); //else if (((_RECEIVER)_Data.HASH_RECEIVER[ReceiverID]).MODEL != "IFC3300") _Popup.MessageBoxPopup(MessageBoxButtons.OK, _Text.ExceptionError5, _Text.OK); if (((_RECEIVER)_Data.HASH_RECEIVER[ReceiverID]).MODEL == "IFC3300") _Popup.MessageBoxPopup(MessageBoxButtons.OK, _Text.ExceptionError7, _Text.OK); return; } // 그리드에 출력이 끝나면 Value값을 1 증가시킴 if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum) Delegate_UiProgressBar(); //크로스 스레드 해결 // // 입력 및 출력 디바이스의 빠른 출력을 위해서 미리 정리(추가된 작업 - 2013.07.03) // 상위 루틴은 데이타베이스에 저장이 목표였다면 하위 부분은 포인트 입출력 정보가 너무 화면이 늦게 나타나므로 미리 SQL 결과를 저장하기 위한 용도입니다. // // 먼저 클리어 _Data.Hash_ImportPoint.Clear(); // 해당 수신기 아이디만큼 루틴을 돌린다 foreach (string pRECEIVER_ID in _Data.LIST_XMLRECEIVER_ID) { _ImportPoint ImportPoint = new _ImportPoint(); // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경 if (((_RECEIVER)_Data.HASH_RECEIVER[pRECEIVER_ID]).MODEL == "IFC3300") { // 해당 수신기 아이디 값을 이용해서 입력용 데이타를 만들자 ImportPoint.IN_Points = _Db.ExecuteRead_SqlDataAdapter( _Sql.Search_DEVICETable_With_EMERGENCY_BigReceiver("1", "I", "", "", "", "", "", "", pRECEIVER_ID, "", "", "", false)); // 해당 수신기 아이디 값을 이용해서 출력용 데이타를 만들자 ImportPoint.OUT_Points = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_DEVICETable_NoneBoardID_BigReceiver("1", "O", "", "", "", "", "", pRECEIVER_ID)); } else { // 해당 수신기 아이디 값을 이용해서 입력용 데이타를 만들자 ImportPoint.IN_Points = _Db.ExecuteRead_SqlDataAdapter( _Sql.Search_DEVICETable_With_EMERGENCY("1", "I", "15", "", "", "", "", "", pRECEIVER_ID, "", "", "", false)); // 해당 수신기 아이디 값을 이용해서 출력용 데이타를 만들자 ImportPoint.OUT_Points = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_DEVICETable("1", "O", "15", "", "", "", "", "", pRECEIVER_ID)); } // 해쉬테이블에 삽입 _Hash.Add(_Data.Hash_ImportPoint, pRECEIVER_ID, ImportPoint); } // 이 루틴은 상위 루틴이 오래걸려서 프로그레스바가 멈추는 것처럼 보일수도 있으므로 일단 프로그레스바 진행바 총 카운터를 50만큼 늘인것이다 for (int i = 0; i < 50; i++) { // 그리드에 출력이 끝나면 Value값을 1 증가시킴 if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum) Delegate_UiProgressBar(); //크로스 스레드 해결 } } else if (Type == _Text.UI_TREE_OPER_GROUP) // 그룹 정보 임포팅 { // // TB_GROUP 정보추가 // foreach (_Excel_Group Excel_Group in _Data.List_ExcelGroup) { // "TB_GROUP"에 DB 삽입 _Db.ADD("TB_GROUP", "RECEIVER_ID=" + ReceiverID + // 그룹 임포팅때는 모든 그룹이 자기 관할 그룹이다. ";GROUP_ID=" + Excel_Group.Group_ID + ";GROUP_NAME=" + Excel_Group.Group_Name + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum) Delegate_UiProgressBar(); //크로스 스레드 해결 } } else // 연동설정 정보 임포팅 { // 엑셀에는 타수신기의 그룹정보가 있을수 있으므로 전체 그룹에 대한 그룹아이디를 키값으로 갇고 수신기아이디로 데이타를 가지고 있는 특별한 해쉬테이블을 구성한다 Hashtable Group_ReceiverID_Table = new Hashtable(); DataRowCollection DB_TABLE_GROUP = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_GROUP", null)); if (DB_TABLE_GROUP != null && DB_TABLE_GROUP.Count != 0) { foreach (DataRow dr in DB_TABLE_GROUP) // 네트워크 수신기에서 그룹 아이디는 유일하다 { if (Group_ReceiverID_Table.ContainsKey(dr["GROUP_ID"].ToString()) == false) Group_ReceiverID_Table.Add(dr["GROUP_ID"].ToString(), dr["RECEIVER_ID"].ToString()); } } // // TB_MAP 정보추가 // foreach (_Excel_Map Excel_Map in _Data.List_ExcelMap) { // // "TB_MAP"에 DB 삽입 // _Db.ADD("TB_MAP", "RECEIVER_ID=" + ReceiverID + ";MAP_NO=" + Excel_Map.Map_ID.Remove(0, 1) + ";MAP_ID=" + Excel_Map.Map_ID + ";MAP_NAME=" + Excel_Map.Map_Name + ";USE_FLAG=" + "Y" + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); // // "TB_MAP_PROCESS"에 DB 삽입 // // 그룹이 몇개 들어 있는지 조사해서 그만큼 "TB_MAP_PROCESS"에 저장한다 if (Excel_Map.Groups != _Text.Null) { string[] Group = Excel_Map.Groups.Split(':'); for (int i = 0; i < Group.Count(); i++) { // 타수신기 그룹 정보를 먼저 임포트작업을 완료해야만, 연동설정을 임포트해야 그룹아이디 정보를 설정 프로그램에서 추출할수 있습니다 try { // // 그룹 정보 저장 // _Db.ADD("TB_MAP_PROCESS", "MAP_RECEIVER_ID=" + ReceiverID + // 현재 ReceiverID 저장 ";MAP_NO=" + Excel_Map.Map_ID.Remove(0, 1) + ";MAP_TYPE=" + "O" + ";SEQ_NO=" + (i + 1) + ";PROCESS_TYPE=" + "G" + ";GROUP_ID=" + Group[i] + ";RECEIVER_ID=" + Group_ReceiverID_Table[Group[i]].ToString() + // 출력해야되는 회로 혹은 그룹의 수신기 아이디 : 엑셀로 Import 할때는 그룹 정보가 반드시 수신기 아이디에 해당하지 않는 타 수신기에 그룹일수도 있다. ";COMM_ID=" + null + ";BOARD_ID=" + null + ";LOOP_NO=" + null + ";REPEATER_ID=" + null + ";DEVICE_ID=" + null + ";INOUT_TYPE=" + null + ";USE_FLAG=" + "Y"); } catch { // UI를 갱신하라 ui_renew = true; // 저장버튼 및 닫기버튼 사용하게... Delegate_UiButton_bad(); // 프로젝트 수정 _Data.ProJect_Save_Complete = false; // 버튼은 사용가능함 _Data.Enable_Button = true; MessageBox.Show(_Text.ExceptionError1); return; } } } // 입력디바이스가 몇개 들어 있는지 조사해서 그만큼 "TB_MAP_PROCESS"에 저장한다 if (Excel_Map.InDevices != _Text.Null) { string[] InDevice = Excel_Map.InDevices.Split(':'); for (int i = 0; i < InDevice.Count(); i++) { // BOARD_ID, LOOP_NO, REPEATER_ID, DEVICE_ID string[] Value = InDevice[i].Split('-'); // // 입력 디바이스 정보 저장 // _Db.ADD("TB_MAP_PROCESS", "MAP_RECEIVER_ID=" + ReceiverID + // 현재 ReceiverID 저장 ";MAP_NO=" + Excel_Map.Map_ID.Remove(0, 1) + ";MAP_TYPE=" + "I" + ";SEQ_NO=" + (i + 1) + ";PROCESS_TYPE=" + "D" + ";GROUP_ID=" + null + ";RECEIVER_ID=" + ReceiverID + // 현재 ReceiverID 저장 // 입력회로는 반드시 자기 수신기의 입력 회로이다 ";COMM_ID=" + "1" + ";BOARD_ID=" + Int32.Parse(Value[1]) + ";LOOP_NO=" + Int32.Parse(Value[2]) + ";REPEATER_ID=" + Int32.Parse(Value[3]) + ";DEVICE_ID=" + Int32.Parse(Value[4]) + ";INOUT_TYPE=" + "I" + ";USE_FLAG=" + "Y"); } } if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum) Delegate_UiProgressBar(); //크로스 스레드 해결 } } // UI를 갱신하라 ui_renew = true; // 저장버튼 및 닫기버튼 사용하게... Delegate_UiButton_good(); // 프로젝트 수정 _Data.ProJect_Save_Complete = false; // 버튼은 사용가능함 _Data.Enable_Button = true; } // IO보드 디바이스 추가 public bool Add_IOBoard_Device() { foreach (_Code_IO_Board Code_IO_Board in _Data.LIST_CodeIOBoard) { // cyim 2017.01.12 모델별 엑셀임포트 오류 방지 버그 수정 // 통신보드는 0번,15번 으로 구분해야한다 // cyim 2017.01.23 예외처리 부분은 일단 제외한다 // cyim 2016.12.22 모델별 엑셀임포트 오류 방지 if (((_RECEIVER)_Data.HASH_RECEIVER[ReceiverID]).MODEL == "IFC3300") { if (Code_IO_Board.IOBOARD_COM_PORT == "1") // 엑셀 시트의 IO 보드 입출력표 내용중 통신보드 별도 추가건에 대해서는 if (Code_IO_Board.IOBOARD_BOARD_ID != "0") // 반드시 0 이 들어가야한다 (다른 아이디는 허용안함) return false; } // cyim 2017.02.02 : IFC 3300 에서는 엑셀입출력표 제한을 걸지 않는다 // 단, IFC3300 이하 모델에서는 IO 보드는 15번 보드는 무조건 강제로 사용하도록 한다 if (((_RECEIVER)_Data.HASH_RECEIVER[ReceiverID]).MODEL != "IFC3300") { if (Code_IO_Board.IOBOARD_COM_PORT == "1") // 엑셀 시트의 IO 보드 입출력표 내용중 통신보드 별도 추가건에 대해서는 if (Code_IO_Board.IOBOARD_BOARD_ID != "15") // 반드시 15 가 들어가야한다 (다른 아이디는 허용안함) return false; } // I/O 보드의 각 디바이스 아이디를 추가한다. 즉 TB_DEVICE 에 추가 DB_ADD_IOBoard_Device(ReceiverID, Code_IO_Board.IOBOARD_COM_PORT, Code_IO_Board.IOBOARD_BOARD_ID, Code_IO_Board.IOBOARD_LOOP_NO, Code_IO_Board.IOBOARD_REPEATER_ID, Code_IO_Board.IOBOARD_DEVICE_ID, Code_IO_Board.IOBOARD_INOUT, Code_IO_Board.IOBOARD_NAME, "000000", "N"); // 별도 펌프에 관련된 중계기를 추가한다. 즉 TB_REPEATER 에 추가 if (Code_IO_Board.IOBOARD_ADDREPEATER_YN == "Y") { // 중계기 추가 DB_ADD_Repeater(ReceiverID, Code_IO_Board.IOBOARD_COM_PORT, Code_IO_Board.IOBOARD_BOARD_ID, Code_IO_Board.IOBOARD_LOOP_NO, Code_IO_Board.IOBOARD_REPEATER_ID, Code_IO_Board.IOBOARD_ADDREPEATER_TYPE == "2*2" ? "1" : "2", // 중계기타입 1 : 2*2 , 2 : 4*4 "중계기"); } } return true; // cyim : 임시코드 (주석코드는 지우지 마십시오, 원본보관용입니다) //// I/O 추가 //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "9", "I", "주펌프 스위치주의", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "10", "I", "보조펌프 스위치주의", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "11", "I", "충압펌프 스위치주의", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "12", "I", "주스프링클러 스위치주의", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "13", "I", "보조스프링클러 스위치주의", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "14", "I", "충압스프링클러 스위치주의", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "1", "I", "발신기", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "2", "I", "전화", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "3", "I", "교류전원", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "4", "I", "예비전원이상", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "1", "O", "표시등", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "2", "O", "유도등", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "3", "O", "전원릴레이", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "1", "15", "0", "1", "1", "I", "주펌프", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "1", "15", "0", "2", "1", "I", "보조펌프", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "1", "15", "0", "3", "1", "I", "충압펌프", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "1", "15", "0", "4", "1", "I", "주스프링클러", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "1", "15", "0", "5", "1", "I", "보조스프링클러", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "1", "15", "0", "6", "1", "I", "충압스프링클러", "000000", "N"); //// 중계기 추가 //DB_ADD_Repeater(ReceiverID, "1", "15", "0", "1", "2", "중계기"); //DB_ADD_Repeater(ReceiverID, "1", "15", "0", "2", "2", "중계기"); //DB_ADD_Repeater(ReceiverID, "1", "15", "0", "3", "1", "중계기"); //DB_ADD_Repeater(ReceiverID, "1", "15", "0", "4", "2", "중계기"); //DB_ADD_Repeater(ReceiverID, "1", "15", "0", "5", "2", "중계기"); //DB_ADD_Repeater(ReceiverID, "1", "15", "0", "6", "1", "중계기"); // cyim : 임시코드 (주석코드는 지우지 마십시오, 테스트용입니다) //DB_ADD_IOBoard_Device(ReceiverID, "3", "1", "0", "0", "1", "O", "표시등", "000000", "N"); //DB_ADD_IOBoard_Device(ReceiverID, "3", "1", "0", "0", "2", "O", "유도등", "000000", "N"); } // IO보드 디바이스 추가 public void DB_ADD_IOBoard_Device(string RECEIVER_ID, string COMM_ID, string BOARD_ID, string LOOP_NO, string REPEATER_ID, string DEVICE_ID, string INOUT_TYPE, string DEVICE_NAME, string POSITION_CODE, string CUT_FLAG) { _Db.ADD("TB_DEVICE", "RECEIVER_ID=" + ReceiverID + ";COMM_ID=" + COMM_ID + ";BOARD_ID=" + BOARD_ID + ";LOOP_NO=" + LOOP_NO + ";REPEATER_ID=" + REPEATER_ID + ";DEVICE_ID=" + DEVICE_ID + ";INOUT_TYPE=" + INOUT_TYPE + ";DEVICE_NAME=" + DEVICE_NAME + ";POSITION_CODE=" + POSITION_CODE + ";CUT_FLAG=" + CUT_FLAG + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } // 중계기 6개 추가 public void DB_ADD_Repeater(string RECEIVER_ID, string COMM_ID, string BOARD_ID, string LOOP_NO, string REPEATER_ID, string REPEATER_TYPE, string REPEATER_NAME) { _Db.ADD("TB_REPEATER", "RECEIVER_ID=" + ReceiverID + ";COMM_ID=" + COMM_ID + ";BOARD_ID=" + BOARD_ID + ";LOOP_NO=" + LOOP_NO + ";REPEATER_ID=" + REPEATER_ID + ";REPEATER_TYPE=" + REPEATER_TYPE + ";REPEATER_NAME=" + REPEATER_NAME + ";CUT_FLAG=" + "N" + ";USE_FLAG=" + "Y" + ";POSITION_CODE=" + "000000" + ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } // 팝업에서 Yes, NO 에서 받은 이벤트 처리 (실제 엑셀연동 적용여부) public void _Event_PopupClose_SendMessage_Event(object sender, object etc) { // 대화 팝업 주체 Form popup = (Form)sender; if (DialogPopup.Name == popup.Name && etc.ToString() == _Text.OK) { // UI 갱신 타이머 스타트 Timer_Renew.Start(); int ProgressBar_TotalCount = 0; // 저장버튼 및 닫기버튼 실행 중에는 사용 못하게 UiButton_Apply.Enabled = false; UiButton_Close.Enabled = false; // 포인트(디바이스) 정보 임포팅 if (Type == _Text.UI_TREE_POINT) { // 먼저 4개 테이블 삭제하고 데이터 Importing // TB_POSITION_CODE 테이블 모든 데이터 삭제 // cyim 2013.06.14 이렇게 만약 엑셀연동할때마다 테이블을 삭제하고 마지막에 엑셀 연동한 데이타만 들어가므로 문제의 요지가 있다 //if (_Data.LIST_XMLRECEIVER_ID.Count == 1) // 1개만 존재하는 경우 무조건 삭제한다 // cyim 2016.07.11 : 네트워크 수신기도 무조건 삭제한다. 단, 1번수신기의엑셀,2번 수신기의 엑셀 내용중 코드탭의 건물,계단,층 정보는 동일해야한다 // cyim 2016.07.12 : TB_POSITION_CODE 테이블 삭제하고 다시 생성하는 코드 원복, 확인결과 하나하나 중계기 입출력 포인트 별 개별적으로 위치코드가 추가된다 if (_Data.LIST_XMLRECEIVER_ID.Count == 1) _Db.Execute(_Sql.Delete_Table("TB_POSITION_CODE", null)); // TB_EVENT_TYPE 모든 데이타 삭제 _Db.Execute(_Sql.Delete_Table("TB_EVENT_TYPE", null)); // TB_DEVICE_TYPE 모든 데이타 삭제 _Db.Execute(_Sql.Delete_Table("TB_DEVICE_TYPE", null)); // TB_DEVICE 테이블 모든 데이터 삭제 (수신기 아이디별) _Db.Execute(_Sql.Delete_Table("TB_DEVICE", ReceiverID)); // TB_REPEATER 테이블 모든 데이터 삭제 (수신기 아이디별) _Db.Execute(_Sql.Delete_Table("TB_REPEATER", ReceiverID)); // TB_EMERGENCY_BROADCASTION 테이블 모든 데이터 삭제 (수신기 아이디별) _Db.Execute(_Sql.Delete_Table("TB_EMERGENCY_BROADCASTION", ReceiverID)); // // 아날로그감지기용 테이블 2개가 없다면 새로 생성한다 // // 중계기 타입은 아래와 같다, 아날로그 감지기를 위한 테이블은 총 4개이다. TB_DEVICE, TB_REPEATER, TB_DAYTIME, TB_ANALOG_DEVICE_2 // '1' = A : 2X2 // '2' = B : 4X4 // '4' = C : 아날로그연감지기 // '5' = D : 아날로그열감지기 // TB_DAYTIME DataRowCollection DB_TABLE_TB_DAYTIME = _Db.ExecuteRead_SqlDataAdapter(_Sql.Table_Exist("TB_DAYTIME")); if (DB_TABLE_TB_DAYTIME != null && DB_TABLE_TB_DAYTIME.Count != 0) { // 존재하면 테이블 내용을 삭제 _Db.Execute(_Sql.Delete_Table("TB_DAYTIME", null)); } else { // 존재하지 않는 경우에는 테이블 신규 생성 _Db.Execute(_Sql.Create_TB_DAYTIME()); } // TB_ANALOG_DEVICE_2 DataRowCollection DB_TABLE_TB_ANALOG_DEVICE_2 = _Db.ExecuteRead_SqlDataAdapter(_Sql.Table_Exist("TB_ANALOG_DEVICE_2")); if (DB_TABLE_TB_ANALOG_DEVICE_2 != null && DB_TABLE_TB_ANALOG_DEVICE_2.Count != 0) { // 존재하면 테이블 내용을 삭제 _Db.Execute(_Sql.Delete_Table("TB_ANALOG_DEVICE_2", ReceiverID)); } else { // 존재하지 않는 경우에는 테이블 신규 생성 _Db.Execute(_Sql.Create_TB_ANALOG_DEVICE_2()); } // ProgressBar Total 카운트 (3를 주는 이유는 포지션 테이블이 추가될때 1 증가, 그리드에 출력 올릴 때 1 증가, IO보드 디바이스 추가될때 1 증가) ProgressBar_TotalCount = 3 + 50; // 이 루틴은 상위 루틴이 오래걸려서 프로그레스바가 멈추는 것처럼 보일수도 있으므로 일단 프로그레스바 진행바 총 카운터를 50만큼 늘인것이다 // ProgressBar의 Maximum값을 구하기 위해서 foreach (_Excel_Sheet Excel_Sheet in _Data.List_ExcelPoint) { ProgressBar_TotalCount = ProgressBar_TotalCount + Excel_Sheet.List_Repeater.Count; } } else if (Type == _Text.UI_TREE_OPER_GROUP) // 그룹 정보 임포팅 { // TB_GROUP 테이블 모든 데이터 삭제 _Db.Execute(_Sql.Delete_Table("TB_GROUP", ReceiverID)); //_Db.Execute(_Sql.Delete_Table("TB_GROUP_DEVICE", ReceiverID)); // 주석 처리(강과장님의 요구) - 힘들게 설정한 정보를 삭제하기 싫어서 // 프로그레스바 계산 // ProgressBar의 Maximum값을 구하기 위해서 ProgressBar_TotalCount = _Data.List_ExcelGroup.Count; } else // 연동설정 정보 임포팅 { // TB_MAP 테이블 모든 데이터 삭제 _Db.Execute(_Sql.Delete_Table("TB_MAP", ReceiverID)); _Db.Execute(_Sql.Delete_Table("TB_MAP_PROCESS", "MAP_RECEIVER_ID", ReceiverID, null)); // 네트워크 연동을 생각하여 삭제 // 프로그레스바 계산 // ProgressBar의 Maximum값을 구하기 위해서 ProgressBar_TotalCount = _Data.List_ExcelMap.Count; } // ProgressBar의 Maximum값 저장 UiProgressBar_ExcelImport.Maximum = ProgressBar_TotalCount; // UiProgressBar 초기값 셋팅 UiProgressBar_ExcelImport.Value = 0; // 스레드 생성 Thread WorkingThread = new Thread(new ThreadStart(Excel_Import)); // 스레드시작 WorkingThread.Start(); } else _Data.Enable_Button = true; // 대화 팝업은 특별처리(이벤트 해제) _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_PopupClose_SendMessage_Event); } // UI 개신 타이머 private void Timer_Renew_Tick(object sender, EventArgs e) { if (ui_renew == true) { if (Type == _Text.UI_TREE_POINT) { _Event.WorkViewPageName_SendMessage_Write(ReceiverID, Object_Type.POINT, null, null); } else if (Type == _Text.UI_TREE_OPER_GROUP) // 그룹 정보 임포팅 { // 폼을 다시 갱신 _Event.WorkViewPageName_SendMessage_Write(ReceiverID, Object_Type.OPER_GROUP, null, null); } else // 연동설정 정보 임포팅 { // 폼을 다시 갱신 _Event.WorkViewPageName_SendMessage_Write(ReceiverID, Object_Type.OPER_SET, null, null); } // 다시 변수 복귀 ui_renew = false; // 타이머 스탑 Timer_Renew.Stop(); } } } }