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();
            }
        }



    }
}