/// <summary> /// Получить права на объекты пользовательского интерфейса по идентификатору роли /// </summary> public Dictionary <int, EntityRights> GetUiObjRights(int roleID) { Dictionary <int, EntityRights> rightsDict = new Dictionary <int, EntityRights>(); try { dataCache.RefreshBaseTables(); BaseTables baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.RightTable, true); DataView viewRight = baseTables.RightTable.DefaultView; viewRight.Sort = "RoleID"; foreach (DataRowView rowView in viewRight.FindRows(roleID)) { int uiObjID = (int)rowView["ItfID"]; EntityRights rights = new EntityRights((bool)rowView["ViewRight"], (bool)rowView["CtrlRight"]); rightsDict[uiObjID] = rights; } } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении прав на объекты пользовательского интерфейса для роли с ид.={0}" : "Error getting access rights on user interface objects for the role with ID={0}", roleID); } return(rightsDict); }
/// <summary> /// Получить цвет по статусу /// </summary> public string GetColorByStat(int stat, string defaultColor) { lock (baseLock) { try { dataCache.RefreshBaseTables(); DataTable tblEvType = dataCache.BaseTables.EvTypeTable; BaseTables.CheckIsNotEmpty(tblEvType, true); tblEvType.DefaultView.RowFilter = "CnlStatus = " + stat; if (tblEvType.DefaultView.Count > 0) { object colorObj = tblEvType.DefaultView[0]["Color"]; if (colorObj != DBNull.Value) { return(colorObj.ToString()); } } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении цвета по статусу {0}" : "Error getting color by status {0}", stat); } return(defaultColor); } }
/// <summary> /// Конструктор /// </summary> public DataCache(ServerComm serverComm, Log log) { if (serverComm == null) { throw new ArgumentNullException("serverComm"); } if (log == null) { throw new ArgumentNullException("log"); } this.serverComm = serverComm; this.log = log; baseLock = new object(); curDataLock = new object(); baseRefrDT = DateTime.MinValue; baseAge = DateTime.MinValue; tblCur = new SrezTableLight(); curRefrDT = DateTime.MinValue; BaseTables = new BaseTables(); CnlProps = new InCnlProps[0]; CtrlCnlProps = new CtrlCnlProps[0]; }
/// <summary> /// Get user interface object properties by id /// </summary> public UiObjProps GetUiObjProps(int uiObjID) { try { dataCache.RefreshBaseTables(); // you must save the link, because the object can be recreated by another thread var baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.InterfaceTable, true); var viewInterface = baseTables.InterfaceTable.DefaultView; viewInterface.Sort = "ItfID"; int rowInd = viewInterface.Find(uiObjID); if (rowInd >= 0) { var rowView = viewInterface[rowInd]; var uiObjProps = UiObjProps.Parse((string)rowView["Name"]); uiObjProps.UiObjID = uiObjID; uiObjProps.Title = (string)rowView["Descr"]; return(uiObjProps); } return(null); } } catch (Exception ex) { log.WriteException(ex, "Error getting user interface object properties by ID={0}", uiObjID); return(null); } }
/// <summary> /// Get user properties by ID /// </summary> public UserProps GetUserProps(int userID) { try { dataCache.RefreshBaseTables(); var baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.UserTable, true); var viewUser = baseTables.UserTable.DefaultView; viewUser.Sort = "UserID"; int rowInd = viewUser.Find(userID); if (rowInd >= 0) { var userProps = new UserProps(userID) { UserName = (string)viewUser[rowInd]["Name"], RoleID = (int)viewUser[rowInd]["RoleID"] }; userProps.RoleName = GetRoleName(userProps.RoleID); return(userProps); } return(null); } } catch (Exception ex) { log.WriteException(ex, "Error getting user properties by ID={0}", userID); return(null); } }
/// <summary> /// Получить свойства объекта пользовательского интерфейса по идентификатору. /// </summary> public UiObjProps GetUiObjProps(int uiObjID) { try { dataCache.RefreshBaseTables(); // необходимо сохранить ссылку, т.к. объект может быть пересоздан другим потоком BaseTables baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.InterfaceTable, true); DataView viewInterface = baseTables.InterfaceTable.DefaultView; viewInterface.Sort = "ItfID"; int rowInd = viewInterface.Find(uiObjID); // столбец TypeCode добавлен в таблицу Интерфейс, начиная с версии 5.8 return(rowInd >= 0 ? GetUiObjFromRow(viewInterface[rowInd], viewInterface.Table.Columns.Contains("TypeCode")) : null); } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении свойств объекта пользовательского интерфейса по ид.={0}" : "Error getting user interface object properties by ID={0}", uiObjID); return(null); } }
/// <summary> /// Get a list of user interface object properties /// </summary> public List <UiObjProps> GetUiObjPropsList(UiObjProps.BaseUiTypes baseUiTypes) { var list = new List <UiObjProps>(); try { dataCache.RefreshBaseTables(); var baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.InterfaceTable, true); var viewInterface = baseTables.InterfaceTable.DefaultView; viewInterface.Sort = "ItfID"; foreach (DataRowView rowView in viewInterface) { var uiObjProps = UiObjProps.Parse((string)rowView["Name"]); if (baseUiTypes.HasFlag(uiObjProps.BaseUiType)) { uiObjProps.UiObjID = (int)rowView["ItfID"]; uiObjProps.Title = (string)rowView["Descr"]; list.Add(uiObjProps); } } } } catch (Exception ex) { log.WriteException(ex, "Error getting list of user interface object properties"); } return(list); }
/// <summary> /// Конструктор /// </summary> public DataCache(ServerComm serverComm, Log log) { if (serverComm == null) { throw new ArgumentNullException("serverComm"); } if (log == null) { throw new ArgumentNullException("log"); } this.serverComm = serverComm; this.log = log; baseLock = new object(); curDataLock = new object(); baseRefrDT = DateTime.MinValue; tblCur = new SrezTableLight(); curDataRefrDT = DateTime.MinValue; BaseTables = new BaseTables(); CnlProps = new InCnlProps[0]; CtrlCnlProps = new CtrlCnlProps[0]; CnlStatProps = new SortedList <int, CnlStatProps>(); HourTableCache = new Cache <DateTime, SrezTableLight>(HourCacheStorePeriod, HourCacheCapacity); EventTableCache = new Cache <DateTime, EventTableLight>(EventCacheStorePeriod, EventCacheCapacity); }
/// <summary> /// Получить идентификатор пользователя по имени. /// </summary> public int GetUserID(string username) { try { username = username ?? ""; dataCache.RefreshBaseTables(); BaseTables baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.UserTable, true); DataView viewUser = baseTables.UserTable.DefaultView; viewUser.Sort = "Name"; int rowInd = viewUser.Find(username); return(rowInd >= 0 ? (int)viewUser[rowInd]["UserID"] : BaseValues.EmptyDataID); } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении идентификатора пользователя по имени \"{0}\"" : "Error getting user ID by name \"{0}\"", username); return(BaseValues.EmptyDataID); } }
/// <summary> /// Получить наименование роли по идентификатору из базы конфигурации /// </summary> protected string GetRoleNameFromBase(int roleID, string defaultRoleName) { lock (baseLock) { try { dataCache.RefreshBaseTables(); DataTable tblRole = dataCache.BaseTables.RightTable; BaseTables.CheckIsNotEmpty(tblRole, true); tblRole.DefaultView.RowFilter = "RoleID = " + roleID; return(tblRole.DefaultView.Count > 0 ? (string)tblRole.DefaultView[0]["Name"] : defaultRoleName); } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении наименования роли по идентификатору {0}" : "Error getting role name by ID {0}", roleID); return(defaultRoleName); } } }
/// <summary> /// Получить имя пользователя по идентификатору. /// </summary> public string GetUserName(int userID) { try { dataCache.RefreshBaseTables(); BaseTables baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.UserTable, true); DataView viewUser = baseTables.UserTable.DefaultView; viewUser.Sort = "UserID"; int rowInd = viewUser.Find(userID); return(rowInd >= 0 ? (string)viewUser[rowInd]["Name"] : "[" + userID + "]"); // deleted or external user } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении имени пользователя по ид.={0}" : "Error getting user name by ID={0}", userID); return(null); } }
/// <summary> /// Получить свойства представления по идентификатору /// </summary> /// <remarks>Используется таблица объектов интерфейса</remarks> public ViewProps GetViewProps(int viewID) { lock (baseLock) { try { dataCache.RefreshBaseTables(); DataTable tblInterface = dataCache.BaseTables.InterfaceTable; BaseTables.CheckIsNotEmpty(tblInterface, true); tblInterface.DefaultView.RowFilter = "ItfID = " + viewID; if (tblInterface.DefaultView.Count > 0) { ViewProps viewProps = new ViewProps(viewID); viewProps.FileName = (string)tblInterface.DefaultView[0]["Name"]; viewProps.ViewTypeCode = Path.GetExtension(viewProps.FileName); return(viewProps); } else { return(null); } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении свойств представления по ид.={0}" : "Error getting view properties by ID={0}", viewID); return(null); } } }
/// <summary> /// Получить идентификатор пользователя по имени /// </summary> public int GetUserID(string username) { lock (baseLock) { try { username = username ?? ""; dataCache.RefreshBaseTables(); DataTable tblUser = dataCache.BaseTables.UserTable; BaseTables.CheckIsNotEmpty(tblUser, true); tblUser.DefaultView.RowFilter = "Name = '" + username + "'"; return(tblUser.DefaultView.Count > 0 ? (int)tblUser.DefaultView[0]["UserID"] : BaseValues.EmptyDataID); } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении идентификатора пользователя по имени \"{0}\"" : "Error getting user ID by name \"{0}\"", username); return(BaseValues.EmptyDataID); } } }
/// <summary> /// Gets the parent roles of the specified role including the specified role itself. /// </summary> protected List <int> GetParentRoles(int roleID) { HashSet <int> roleIDSet = new HashSet <int>(); // set of parent roles and the specified role List <int> roleIDList = new List <int>(); // similar role list ordered by inheritance roleIDSet.Add(roleID); // to avoid infinite loop // the RoleRef table has been added since version 5.8 if (BaseTables.CheckColumnsExist(dataCache.BaseTables.RoleRefTable)) { dataCache.BaseTables.RoleRefTable.DefaultView.Sort = "ChildRoleID"; AppendParentRoles(roleIDSet, roleIDList, roleID); } roleIDList.Add(roleID); return(roleIDList); }
/// <summary> /// Get the name of the role by ID from the configuration database /// </summary> protected string GetRoleNameFromBase(int roleID, string defaultRoleName) { try { dataCache.RefreshBaseTables(); var baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.RoleTable, true); var viewRole = baseTables.RoleTable.DefaultView; viewRole.Sort = "RoleID"; int rowInd = viewRole.Find(roleID); return(rowInd >= 0 ? (string)viewRole[rowInd]["Name"] : defaultRoleName); } } catch (Exception ex) { log.WriteException(ex, "Error getting role name by ID {0}", roleID); return(defaultRoleName); } }
/// <summary> /// Get the name of KP by number /// </summary> public string GetKPName(int kpNum) { try { dataCache.RefreshBaseTables(); var baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.ObjTable, true); var viewObj = baseTables.KPTable.DefaultView; viewObj.Sort = "KPNum"; int rowInd = viewObj.Find(kpNum); return(rowInd >= 0 ? (string)viewObj[rowInd]["Name"] : ""); } } catch (Exception ex) { log.WriteException(ex, "Error getting device name by number {0}", kpNum); return(""); } }
/// <summary> /// Get username by id /// </summary> public string GetUserName(int userID) { try { dataCache.RefreshBaseTables(); var baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.UserTable, true); var viewUser = baseTables.UserTable.DefaultView; viewUser.Sort = "UserID"; int rowInd = viewUser.Find(userID); return(rowInd >= 0 ? (string)viewUser[rowInd]["Name"] : ""); } } catch (Exception ex) { log.WriteException(ex, "Error getting user name by ID={0}", userID); return(null); } }
/// <summary> /// Get user ID by name /// </summary> public int GetUserID(string username) { try { username = username ?? ""; dataCache.RefreshBaseTables(); var baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.UserTable, true); var viewUser = baseTables.UserTable.DefaultView; viewUser.Sort = "Name"; int rowInd = viewUser.Find(username); return(rowInd >= 0 ? (int)viewUser[rowInd]["UserID"] : BaseValues.EmptyDataID); } } catch (Exception ex) { log.WriteException(ex, "Error getting user ID by name \"{0}\"", username); return(BaseValues.EmptyDataID); } }
/// <summary> /// Loads the configuration database. /// </summary> private void LoadConfigBase() { try { if (FindConfigBase()) { baseTables = new BaseTables(); baseTables.Load(baseDir); } else { baseTables = null; } } catch (Exception ex) { baseTables = null; ProcError(ex, TablePhrases.LoadConfigBaseError); } }
private bool preventNodeExpand; // prevent a tree node from expanding or collapsing /// <summary> /// Initializes a new instance of the class. /// </summary> public FrmMain() { InitializeComponent(); exeDir = Path.GetDirectoryName(Application.ExecutablePath); configDir = Path.Combine(exeDir, "Config"); langDir = Path.Combine(exeDir, "Lang"); errLog = new Log(Log.Formats.Full) { FileName = Path.Combine(exeDir, "Log", ErrFileName) }; Application.ThreadException += Application_ThreadException; tableView = null; fileName = ""; modified = false; baseDir = ""; baseTables = null; preventNodeExpand = false; }
/// <summary> /// Получить свойства объекта пользовательского интерфейса по идентификатору /// </summary> public UiObjProps GetUiObjProps(int uiObjID) { try { dataCache.RefreshBaseTables(); // необходимо сохранить ссылку, т.к. объект может быть пересоздан другим потоком BaseTables baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.InterfaceTable, true); DataView viewInterface = baseTables.InterfaceTable.DefaultView; viewInterface.Sort = "ItfID"; int rowInd = viewInterface.Find(uiObjID); if (rowInd >= 0) { DataRowView rowView = viewInterface[rowInd]; UiObjProps uiObjProps = UiObjProps.Parse((string)rowView["Name"]); uiObjProps.UiObjID = uiObjID; uiObjProps.Title = (string)rowView["Descr"]; return(uiObjProps); } else { return(null); } } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении свойств объекта пользовательского интерфейса по ид.={0}" : "Error getting user interface object properties by ID={0}", uiObjID); return(null); } }
/// <summary> /// Получить наименование КП по номеру. /// </summary> public string GetKPName(int kpNum) { try { dataCache.RefreshBaseTables(); BaseTables baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.ObjTable, true); DataView viewObj = baseTables.KPTable.DefaultView; viewObj.Sort = "KPNum"; int rowInd = viewObj.Find(kpNum); return(rowInd >= 0 ? (string)viewObj[rowInd]["Name"] : ""); } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении наименования КП по номеру {0}" : "Error getting device name by number {0}", kpNum); return(""); } }
/// <summary> /// Получить свойства пользователя по идентификатору. /// </summary> public UserProps GetUserProps(int userID) { try { dataCache.RefreshBaseTables(); BaseTables baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.UserTable, true); DataView viewUser = baseTables.UserTable.DefaultView; viewUser.Sort = "UserID"; int rowInd = viewUser.Find(userID); if (rowInd >= 0) { UserProps userProps = new UserProps(userID); userProps.UserName = (string)viewUser[rowInd]["Name"]; userProps.RoleID = (int)viewUser[rowInd]["RoleID"]; userProps.RoleName = GetRoleName(userProps.RoleID); return(userProps); } else { return(null); } } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении свойств пользователя по ид.={0}" : "Error getting user properties by ID={0}", userID); return(null); } }
/// <summary> /// Получить список свойств объектов пользовательского интерфейса. /// </summary> public List <UiObjProps> GetUiObjPropsList(UiObjProps.BaseUiTypes baseUiTypes) { List <UiObjProps> list = new List <UiObjProps>(); try { dataCache.RefreshBaseTables(); BaseTables baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.InterfaceTable, true); DataView viewInterface = baseTables.InterfaceTable.DefaultView; viewInterface.Sort = "ItfID"; bool v58plus = viewInterface.Table.Columns.Contains("TypeCode"); foreach (DataRowView rowView in viewInterface) { UiObjProps uiObjProps = GetUiObjFromRow(rowView, v58plus); if (baseUiTypes.HasFlag(uiObjProps.BaseUiType)) { list.Add(uiObjProps); } } } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении списка свойств объектов пользовательского интерфейса" : "Error getting list of user interface object properties"); } return(list); }
/// <summary> /// Получить список свойств объектов пользовательского интерфейса /// </summary> public List <UiObjProps> GetUiObjPropsList(UiObjProps.BaseUiTypes baseUiTypes) { List <UiObjProps> list = new List <UiObjProps>(); try { dataCache.RefreshBaseTables(); BaseTables baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.InterfaceTable, true); DataView viewInterface = baseTables.InterfaceTable.DefaultView; viewInterface.Sort = "ItfID"; foreach (DataRowView rowView in viewInterface) { UiObjProps uiObjProps = UiObjProps.Parse((string)rowView["Name"]); if (baseUiTypes.HasFlag(uiObjProps.BaseUiType)) { uiObjProps.UiObjID = (int)rowView["ItfID"]; uiObjProps.Title = (string)rowView["Descr"]; list.Add(uiObjProps); } } } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении списка свойств объектов пользовательского интерфейса" : "Error getting list of user interface object properties"); } return(list); }
/// <summary> /// Получить наименование роли по идентификатору из базы конфигурации. /// </summary> protected string GetRoleNameFromBase(int roleID, string defaultRoleName) { try { dataCache.RefreshBaseTables(); BaseTables baseTables = dataCache.BaseTables; lock (baseTables.SyncRoot) { BaseTables.CheckColumnsExist(baseTables.RoleTable, true); DataView viewRole = baseTables.RoleTable.DefaultView; viewRole.Sort = "RoleID"; int rowInd = viewRole.Find(roleID); return(rowInd >= 0 ? (string)viewRole[rowInd]["Name"] : defaultRoleName); } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении наименования роли по идентификатору {0}" : "Error getting role name by ID {0}", roleID); return(defaultRoleName); } }
/// <summary> /// Update configuration database tables, channel properties and statuses /// </summary> public void RefreshBaseTables() { lock (baseLock) { try { var utcNowDT = DateTime.UtcNow; if (utcNowDT - baseRefrDT > BaseValidSpan) // data is out of date { baseRefrDT = utcNowDT; var newBaseAge = serverComm.ReceiveFileAge(ServerComm.Dirs.BaseDAT, BaseTables.GetFileName(BaseTables.InCnlTable)); if (newBaseAge == DateTime.MinValue) { // configuration database does not exist or there is no connection to the server throw new ScadaException("Unable to receive the configuration database modification time."); } if (BaseTables.BaseAge != newBaseAge) // configuration base changed { log.WriteAction("Refresh the tables of the configuration database"); // waiting for unlocking possible configuration base var t0 = utcNowDT; while (serverComm.ReceiveFileAge(ServerComm.Dirs.BaseDAT, "baselock") > DateTime.MinValue && DateTime.UtcNow - t0 <= WaitBaseLock) { Thread.Sleep(ScadaUtils.ThreadDelay); } // loading data into tables var newBaseTables = new BaseTables() { BaseAge = newBaseAge }; foreach (var dataTable in newBaseTables.AllTables) { string tableName = BaseTables.GetFileName(dataTable); if (!serverComm.ReceiveBaseTable(tableName, dataTable)) { throw new ScadaException($"Unable to receive the table {tableName}"); } } BaseTables = newBaseTables; // filling channel properties and statuses lock (BaseTables.SyncRoot) { FillCnlProps(); FillCtrlCnlProps(); FillCnlStatProps(); } } } } catch (Exception ex) { BaseTables.BaseAge = DateTime.MinValue; log.WriteException(ex, "Error refreshing the tables of the configuration database"); } } }
/// <summary> /// Обновить таблицы базы конфигурации, свойства каналов и статусов /// </summary> public void RefreshBaseTables() { lock (baseLock) { try { DateTime utcNowDT = DateTime.UtcNow; if (utcNowDT - baseRefrDT > BaseValidSpan) // данные устарели { baseRefrDT = utcNowDT; DateTime newBaseAge = serverComm.ReceiveFileAge(ServerComm.Dirs.BaseDAT, BaseTables.GetFileName(BaseTables.InCnlTable)); if (newBaseAge == DateTime.MinValue) // база конфигурации не существует или нет связи с сервером { throw new ScadaException(Localization.UseRussian ? "Не удалось принять время изменения базы конфигурации." : "Unable to receive the configuration database modification time."); } else if (BaseTables.BaseAge != newBaseAge) // база конфигурации изменена { log.WriteAction(Localization.UseRussian ? "Обновление таблиц базы конфигурации" : "Refresh the tables of the configuration database"); // ожидание снятия возможной блокировки базы конфигурации DateTime t0 = utcNowDT; while (serverComm.ReceiveFileAge(ServerComm.Dirs.BaseDAT, "baselock") > DateTime.MinValue && DateTime.UtcNow - t0 <= WaitBaseLock) { Thread.Sleep(ScadaUtils.ThreadDelay); } // загрузка данных в таблицы BaseTables newBaseTables = new BaseTables() { BaseAge = newBaseAge }; foreach (DataTable dataTable in newBaseTables.AllTables) { string tableName = BaseTables.GetFileName(dataTable); if (!serverComm.ReceiveBaseTable(tableName, dataTable)) { throw new ScadaException(string.Format(Localization.UseRussian ? "Не удалось принять таблицу {0}" : "Unable to receive the table {0}", tableName)); } } BaseTables = newBaseTables; // заполнение свойств каналов и статусов lock (BaseTables.SyncRoot) { FillCnlProps(); FillCtrlCnlProps(); FillCnlStatProps(); } } } } catch (Exception ex) { BaseTables.BaseAge = DateTime.MinValue; log.WriteException(ex, Localization.UseRussian ? "Ошибка при обновлении таблиц базы конфигурации" : "Error refreshing the tables of the configuration database"); } } }
/// <summary> /// Initializes a new instance of the class. /// </summary> public FrmItemInfo(TableView.Item item, BaseTables baseTables) : this() { this.item = item ?? throw new ArgumentNullException("item"); this.baseTables = baseTables ?? throw new ArgumentNullException("baseTables"); }