using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Collections; namespace FPER { // cyim 2015.8.3 수신반 연동기능 추가 // 수신반에서 개별 수신기의 DB 로 부터 현재 연동상태 정보를 가져온다 // 특이한점은 TB_EVENT_TYPE 과 TB_DEVICE_TYPE 테이블의 경우 수신기 아이디가 필드에 존재하지 않는다 // 현장기준으로 전체 네트워크 수신기는 동일한 연동을 구성하도록 하고, // 지금 연동 상태는 결국 각각 수신기의 DB 를 이용해야 한다. // 아래는 참고로 디바이스 타입 약자와 타입명을 정리한것이다, 그리고 실제로 Seq 필드와 UseFlag 필드 예시이다 //OA 주경종 0 Y //OB 지구경종 1 Y //OC 비상방송 2 Y //OD 시각경보기 0 Y //OE 전자사이렌 3 Y //OF 프리액션벨브 4 Y //OG 알람밸브 0 Y //OH 제연댐퍼 5 Y //OI 전실급기FAN 6 Y //OJ 상가급기댐퍼 7 Y //OK 상가배기댐퍼 8 Y //OL 상가급기FAN 9 Y //OM 상가배기FAN 10 Y //ON 방화샷다 11 Y //OO 방화문 12 Y //OP 자동폐쇄장치 13 Y //OQ 소화전기동램프 0 Y //OR 옥상개폐장치 14 Y //OS 자동문 0 Y //OT 배연창 15 Y //OU 유도등 16 Y //OZ 출력기타 0 Y public partial class FireDesk_Operation : Form { // 타이머 public _Timer_WindowBase Timer_WindowBase_FireDesk_Operation = new _Timer_WindowBase(); // 생성자 public FireDesk_Operation() { InitializeComponent(); // // 이벤트 // // 폼닫기 이벤트 핸들러 등록 this.FormClosing += new FormClosingEventHandler(FireDesk_Operation_FormClosing); // // UI // // 데이타그리드뷰 셋팅 this.dataGridView_Main.Dock = DockStyle.Fill; this.dataGridView_Main.RowHeadersVisible = false; // 열의 첫번째 헤더는 필요 없다 this.dataGridView_Main.AllowUserToAddRows = false;// 마지막에 행이 추가될 필요가 없다 this.dataGridView_Main.Font = new System.Drawing.Font("굴림", 11F, System.Drawing.FontStyle.Bold); this.dataGridView_Main.Columns.Add("0", "연동타입"); //this.dataGridView_Main.Columns[0].Width = 100; foreach (string id in _Data.Hash_Receiver_keys) { this.dataGridView_Main.Columns.Add(id, "수신기" + id); //this.dataGridView_Main.Columns[id].Width = 140; this.dataGridView_Main.Columns[id].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; } this.dataGridView_Main.Columns[0].FillWeight = 170;// 채우기 모드에서만 적용 this.dataGridView_Main.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 데이타 그리드 뷰의 채우기 모드 this.dataGridView_Main.ScrollBars = ScrollBars.Both; // this 셋팅 // 팝업창은 수신기의 개수에 의해 가로 사이즈가 결정된다 this.Width = 170 + _Data.Hash_Receiver_keys.Length * 100; this.StartPosition = FormStartPosition.CenterScreen; this.TopMost = true; // // 타이머 // Timer_WindowBase_FireDesk_Operation.Create("FireDesk_Operation_Timer", 5000, FireDesk_Operation_Timer_Tick, true); // // 기타 // // 활성화 _Data.FireDesk_Operation_Enable = true; // 값을 가져온다 GetOeprationCurrentStatus(); } // 소멸자 public void FireDesk_Operation_FormClosing(object sender, FormClosingEventArgs e) { // 숨김 this.Hide(); // 비활성화 _Data.FireDesk_Operation_Enable = false; // 타이머 해제 Timer_WindowBase_FireDesk_Operation.Delete("FireDesk_Operation_Timer"); } // 리스트뷰에 데이타값 반영 public void GetOeprationCurrentStatus() { this.dataGridView_Main.Rows.Clear(); // 행의 기준 ArrayList DeviceTypeNames = new ArrayList(); // 컬럼(열)은 수신기별로 생성하였다 // 데이터 (행) 의 값은 출력타입으로서 데이타베이스를 기초로 해서 읽어들여야한다 // 이때는, DB 를 양쪽에서 전부 읽고 OR 조건으로 컬럼값을 추출한다 // 중복을 제거하고 준비하면 되겠다. 중요한 점은 네트워크 수신기의 경우 분명 동일한 출력타입을 모두 가지고 있다는 점이다. // 어차피 소방 설정 프로그램의 엑셀 Import 포맷의 경우 코드 시트가 1개뿐이므로 그렇게 예상할 수 있다 Hashtable ReceiverDeviceTypeNames = new Hashtable(); // 연동구성표를 위한 기초 데이터 수집 foreach (string id in _Data.Hash_Receiver_keys) { // 테이블값을 통째로 해쉬테이블에 대입 _DacFireDesk DacFireDesk = new _DacFireDesk(id); DataTable dt = DacFireDesk.TB_DEVICE_TYPE_From_SelectAll(); foreach (DataRow dr in dt.Rows) { // DEVICE_TYPE,DEVICE_TYPE_NAME,USE_FLAG,SEQ_NO string temp = dr["DEVICE_TYPE"].ToString(); // 별도로 중복방지하여 출력타입명만 가져온다 (문구가 틀릴수도 있다) if (DeviceTypeNames.Contains(temp) == false) DeviceTypeNames.Add(temp); } if (ReceiverDeviceTypeNames.ContainsKey(id) == false) ReceiverDeviceTypeNames.Add(id, dt); } // 컬럼값을 폼생성자에서 추가하였으므로 데이터, 즉 행을 추가하면 된다 // 컬럼아이디, 데이타 // 0 : 출력 타입, 1 ~ 16 : 수신기1 foreach (string DeviceTypeName in DeviceTypeNames) { // 한행당 수신기개수 + 1 의 개수값이 존재한다 string[] data = new string[ReceiverDeviceTypeNames.Count + 1]; // // cyim 2017.01.03 : 연동기능 보완 - 기존코드로는 중간에 사용안하는 수신기가 있다면 대응불가이다 // int i = 0; // 수신기 foreach (string id in _Data.Hash_Receiver_keys) { DataTable dt = (DataTable)ReceiverDeviceTypeNames[id]; DataRow[] result = dt.Select(string.Format("DEVICE_TYPE='{0}'", DeviceTypeName)); // 하단은 수신기 별 데이터 if (result.Length != 0) { // 출력타입 data[0] = result[0]["DEVICE_TYPE_NAME"].ToString(); string use_flag = result[0]["USE_FLAG"].ToString(); string seq_no = result[0]["SEQ_NO"].ToString(); string device_type = result[0]["DEVICE_TYPE"].ToString(); i++; if (device_type == "OA") // 주경종 { data[i] = (use_flag == "Y") ? "O" : "X"; } else if (seq_no != "0") { data[i] = (use_flag == "Y") ? "O" : "X"; } else data[i] = ""; // data[i] = "-"; // (- 표시는 해당 수신기에는 항목이 없다는 뜻) } } // 데이터가 있는 경우에만 표시 int Cnt = 0; foreach (string id in _Data.Hash_Receiver_keys) { if (data[i] == null || data[i].Length == 0) { Cnt++; } } // 데이타그리드뷰 표시 (모두 널값이면 표시하지 않는다) if (Cnt != ReceiverDeviceTypeNames.Count) { this.dataGridView_Main.Rows.Add(data); } } } // // 타이머 (5초) // public void FireDesk_Operation_Timer_Tick(object sender, EventArgs e) { // cyim 2015.8.3 수신반 연동기능 추가 // 데이터를 갱신하는 것은 사용자가 설비연동과 관련된 액션을 취할때 이벤트를 발생시켜서 // 처리하고 하였지만, 데이타베이스를 5초마다 갱신하는것으로 일단 연동상태 조회 기능은 종료한다 GetOeprationCurrentStatus(); } // 아래는 차후 필요한 소스이므로 삭제 유보 (리스트용) //// 컬럼값 추가 //this.listView_OperationStatus.Columns.Add("0", "연동타입"); //this.listView_OperationStatus.Columns["0"].Width = 140; //foreach (string id in _Data.Hash_Receiver_keys) //{ // this.listView_OperationStatus.Columns.Add(id, "수신기" + id); // this.listView_OperationStatus.Columns[id].Width = 140; // this.listView_OperationStatus.Columns[id].TextAlign = HorizontalAlignment.Center; //} // 데이터 생성 //string[] data = new string[ReceiverDeviceTypeNames.Count + 1]; //data[0]="a"; // 리스트 추가 //ListViewItem item = new ListViewItem(data); //item.Font = new System.Drawing.Font("굴림", 12F, System.Drawing.FontStyle.Bold); //listView_OperationStatus.Items.Add(item); } }