private void UpdateMeters() { logger.Info("Получаем счетчики места..."); try { string sql = "SELECT meters.id, meters.name, meter_types.name as type, meters.disabled FROM meters " + "LEFT JOIN meter_types ON meter_types.id = meters.meter_type_id " + "WHERE place_type_id = @place_type AND place_no = @place_no " + "ORDER BY disabled"; MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@place_type", ComboWorks.GetActiveId (comboPType)); cmd.Parameters.AddWithValue("@place_no", entryNumber.Text); List<object[]> DBRead = new List<object[]>(); using(MySqlDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { object[] values = new object[rdr.FieldCount]; rdr.GetValues (values); DBRead.Add (values); } } if(DBRead.Count == 0) return; if(Meters == null) { int i = 0; Meters = new MeterTable[DBRead.Count]; foreach(object[] row in DBRead) { Meters[i] = AddMeterPage(Convert.ToInt32 (row[0]), (string)row[2], (bool)row[3]); if(i == 0) // Удаляем вкладку по умочанию, только после добавления новой, иначе проблемы с отображением. { notebookMeters.RemovePage (0); //FIXME Подумать о обработки ситуации когда все счетчики удалены. buttonEditMeter.Sensitive = true; buttonDeleteMeter.Sensitive = true; buttonAddReading.Sensitive = true; } i++; } } else { int offset = 0, i = 0; MeterTable[] NewMeters = new MeterTable[DBRead.Count]; foreach(MeterTable meter in Meters) { bool Found = false; foreach(object[] row in DBRead) { if(Convert.ToInt32 (row[0]) == meter.ID && row[2].ToString () == meter.Name && (bool)row[3] == meter.Disabled) Found = true; } if(!Found) { notebookMeters.RemovePage (i); offset++; } else { NewMeters[i] = meter; i++; } } foreach(object[] row in DBRead) { bool Found = false; foreach(MeterTable meter in NewMeters) { if(meter != null && meter.ID == Convert.ToInt32 (row[0])) { Found = true; break; } } if(Found) continue; NewMeters[i] = AddMeterPage(Convert.ToInt32 (row[0]), (string)row[2], (bool)row[3] ); i++; } Meters = NewMeters; } logger.Info("Ok"); } catch (Exception ex) { QSMain.ErrorMessageWithLog(this, "Ошибка получения информации о счётчиках!", logger, ex); } }
private MeterTable AddMeterPage(int id, string name, bool disable) { MeterTable meter = new MeterTable (); meter.ID = id; meter.Name = name; meter.Filled = false; meter.Disabled = disable; meter.liststore = new ListStore (typeof(int), // 0 - ID typeof(string), //1 - date typeof(string), //2 - tariff typeof(string), //3 - value typeof(string), //4 - delta typeof(int) //5 - digital value ); meter.treeview = new TreeView (meter.liststore); meter.treeview.AppendColumn ("Дата", new CellRendererText (), "text", 1); meter.treeview.AppendColumn ("Тариф", new CellRendererText (), "text", 2); meter.treeview.AppendColumn ("Показания", new CellRendererText (), "text", 3); meter.treeview.AppendColumn ("Расход", new CellRendererText (), "text", 4); ScrolledWindow Scroll = new ScrolledWindow (); if (disable) name += "(отк.)"; notebookMeters.AppendPage (Scroll, new Label (name)); Scroll.Add (meter.treeview); meter.treeview.CursorChanged += OnTreeviewReadingCursorChanged; meter.treeview.Show (); notebookMeters.ShowAll (); return meter; }