private static void AddFeaturesToInMemoryFeatureLayer(InMemoryFeatureLayer inMemoryFeatureLayer, Collection <Feature> features)
        {
            inMemoryFeatureLayer.SafeProcess(() =>
            {
                List <string> columnNames = inMemoryFeatureLayer.GetDistinctColumnNames().ToList();
                foreach (var columnName in features[0].ColumnValues.Keys)
                {
                    if (!columnNames.Contains(columnName))
                    {
                        inMemoryFeatureLayer.Columns.Add(new FeatureSourceColumn(columnName, DbfColumnType.Character.ToString(), 100));
                    }
                }

                foreach (Feature feature in features)
                {
                    inMemoryFeatureLayer.EditTools.BeginTransaction();
                    inMemoryFeatureLayer.EditTools.Add(feature);
                    inMemoryFeatureLayer.EditTools.CommitTransaction();
                }
            });
        }
        private void GridCellEditing(DataGridCellEditEndingEventArgs e)
        {
            GisEditorEditInteractiveOverlay editOverlay = GisEditor.ActiveMap.FeatureLayerEditOverlay;
            InMemoryFeatureLayer            layer       = editOverlay != null ? editOverlay.EditShapesLayer : null;

            if (layer != null)
            {
                try
                {
                    FeatureViewModel entity      = featuresList.SelectedValue as FeatureViewModel;
                    string           columnName  = ((DataRowView)e.Row.Item)[0].ToString();
                    string           columnValue = (e.EditingElement as TextBox).Text;

                    if (columnValue != originalColumnValue)
                    {
                        layer.Open();
                        Feature feature = layer.QueryTools.GetFeatureById(entity.FeatureId, layer.GetDistinctColumnNames());
                        feature.ColumnValues[columnName] = columnValue;
                        if (!layer.EditTools.IsInTransaction)
                        {
                            layer.EditTools.BeginTransaction();
                        }
                        layer.EditTools.Update(feature);
                        TransactionResult result = layer.EditTools.CommitTransaction();
                        if (result.TotalFailureCount != 0)
                        {
                            string failureReasonString = null;
                            Dictionary <string, string> failureReasons = result.FailureReasons;
                            foreach (string key in failureReasons.Keys)
                            {
                                failureReasonString += "\r\n\r\n" + failureReasons[key];
                            }
                            System.Windows.Forms.MessageBox.Show(GisEditor.LanguageManager.GetStringResource("FeatureAttibuteWindowUpdateFailedText") + failureReasonString, GisEditor.LanguageManager.GetStringResource("FeatureAttibuteWindowUpdateFailedCaption"));
                            (e.EditingElement as TextBox).Text = originalColumnValue;
                        }
                        else
                        {
                            // Update the selected value
                            entity.Feature.ColumnValues[columnName] = columnValue;
                        }
                    }
                }
                catch (UnauthorizedAccessException unauthorizedAccessException)
                {
                    GisEditor.LoggerManager.Log(LoggerLevel.Debug, unauthorizedAccessException.Message, new ExceptionInfo(unauthorizedAccessException));
                    System.Windows.Forms.MessageBox.Show(string.Format("{0} {1}", unauthorizedAccessException.Message, GisEditor.LanguageManager.GetStringResource("FeatureAttributeWindowRestartAdminText")), GisEditor.LanguageManager.GetStringResource("MessageBoxWarningTitle"), System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning);
                }
                catch (Exception ex)
                {
                    GisEditor.LoggerManager.Log(LoggerLevel.Debug, ex.Message, new ExceptionInfo(ex));
                    System.Windows.Forms.MessageBox.Show(ex.Message);
                }
                finally
                {
                    layer.Close();
                }
            }
        }