private DataTable GetCustomFieldsTable() { if (!ExternalData.ContainsKey("CustomFieldDataSet")) { throw new ExternalDataRequiredException("Provide a CustomFieldDataSet object as external data for ProjectCustomFieldsDataTableMappingObject") { DataKeyName = "CustomFieldDataSet" }; } var customFieldsDs = ExternalData["CustomFieldDataSet"] as DataSet; var customFieldsTable = customFieldsDs.Tables["CustomFields"]; return(customFieldsTable); }
private object Get(string column) { if (_rowIdx == -1) { _rowIdx++; } if (ExternalData.ContainsKey("TASK_UID")) { if ((bool)((DataRow)Current)["TASK_IS_SUMMARY"]) { _rowIdx++; } } return(_dataTable.Rows[_rowIdx][column]); }
// TODO: Implement mapping to types different than decimal // Implement mapping Duration to TimeSpan // Implement mapping Work to TimeSpan // It shuld be done in value converter public object this[string propName] { get { var customFieldsTable = GetCustomFieldsTable(); var customFieldsMap = customFieldsTable.Rows .Cast <DataRow>() .ToDictionary(r => r["MD_PROP_NAME"], r => r); var customField = customFieldsMap[propName]; var propUid = customField["MD_PROP_UID"]; // MD_PROP_TYPE_ENUM stored as byte internaly, we have to unbox it to byte first to convert to enum. var type = (PsDataType)(byte)customField["MD_PROP_TYPE_ENUM"]; var targetColumn = GetColumnNameByDataType(type); var rows = _dataTable.Rows .Cast <DataRow>() .Where(r => r["PROJ_UID"].Equals(ExternalData["PROJ_UID"])); if (ExternalData.ContainsKey("TASK_UID")) { rows = rows.Where(r => r["TASK_UID"].Equals(ExternalData["TASK_UID"])); } var row = rows .FirstOrDefault(r => r["MD_PROP_UID"].Equals(propUid)); if (row == null) { return(null); } return(row[targetColumn]); } set { var customFieldsTable = GetCustomFieldsTable(); var customFieldsMap = customFieldsTable.Rows .Cast <DataRow>() .ToDictionary(r => r["MD_PROP_NAME"], r => r); var customField = customFieldsMap[propName]; var propUid = customField["MD_PROP_UID"]; // MD_PROP_TYPE_ENUM stored as byte internaly, we have to unbox it to byte first to convert to enum. var type = (PsDataType)(byte)customField["MD_PROP_TYPE_ENUM"]; var targetColumn = GetColumnNameByDataType(type); var row = _dataTable.Rows.Cast <DataRow>().FirstOrDefault(r => r["MD_PROP_UID"].Equals(propUid)); //If there are now row exists for given custom field value, create a new one. if (row == null && value != null) { row = _dataTable.NewRow(); row["MD_PROP_UID"] = propUid; row["PROJ_UID"] = ExternalData["PROJ_UID"]; if (ExternalData.ContainsKey("TASK_UID")) { row["TASK_UID"] = ExternalData["TASK_UID"]; } row["CUSTOM_FIELD_UID"] = Guid.NewGuid(); row[targetColumn] = value; _dataTable.Rows.Add(row); return; } //If custom field value is null, remove the row with existing values, it will erase the field on server. if (row != null && value == null) { _dataTable.Rows.Remove(row); return; } //If row for given custom field value exists, update a value in column if (row != null) { row[targetColumn] = value; } } }