ASP Удалить только чтение в столбце на основе выражений в классе DataTable

Согласно http://msdn.microsoft.com/en-us/library/ms810291.aspx, вы не можете изменить атрибут ReadOnly столбца на основе выражений в DataTable. Мне нужно выяснить способ оценки выражения в столбце DataTable, затем установить .Expression = null, а затем разрешить редактирование этого столбца:

Следующий код не работает, потому что, когда вы устанавливаете Expression == null, он сбрасывает значение в DataTable на DBNull:

_persistedDataTable.Columns[currentDataColumn.ColumnName].Expression = null;
_persistedDataTable.Columns[currentDataColumn.ColumnName].ReadOnly = false;

Моя идея состоит в том, что я копирую текущий DataTable в новый DataTable, строка за строкой без сохранения схемы, что позволяет мне редактировать новые значения DataTable (независимо от того, были ли они получены с помощью выражений или нет) ... Я просто не уверен как это сделать.


person doug    schedule 27.06.2012    source источник


Ответы (2)


Вот как я это сделал:

String dateFilter = "IIF([data_type] = 'smalldatetime', 'true!', '')";
            String targetFilter = "[source_field]"; 

            DataTable tempDataTable = new DataTable();

            //create fields field
            DataColumn order = new DataColumn("order", Type.GetType("System.Int32"));
            tempDataTable.Columns.Add(order);
            order.AutoIncrement = true;
            order.AutoIncrementSeed = 1;
            order.ReadOnly = false;

            _sourceDataAdapter.Fill(tempDataTable);
            tempDataTable.Columns.Add(new DataColumn("date_format", Type.GetType("System.String"), dateFilter));
            tempDataTable.Columns.Add(new DataColumn("target_field", Type.GetType("System.String"), targetFilter));

            tempDataTable.BeginInit();
            tempDataTable.EndInit();

            _dataTable.Columns.Add(new DataColumn("order", Type.GetType("System.Int32")));
            _dataTable.Columns.Add(new DataColumn("local_field", Type.GetType("System.String")));
            _dataTable.Columns.Add(new DataColumn("length", Type.GetType("System.Int32")));
            _dataTable.Columns.Add(new DataColumn("data_type", Type.GetType("System.String")));
            _dataTable.Columns.Add(new DataColumn("decimals", Type.GetType("System.Int32")));

            _dataTable.Columns.Add(new DataColumn("date_format", Type.GetType("System.String")));
            _dataTable.Columns.Add(new DataColumn("target_field", Type.GetType("System.String")));

            using (DataTableReader reader = tempDataTable.CreateDataReader())
            {
                while(reader.Read())
                {
                    if (reader.HasRows)
                    {
                        _dataTable.Rows.Add(reader.GetValue(0), reader.GetValue(1), reader.GetValue(2), reader.GetValue(3), reader.GetValue(4), reader.GetValue(5), reader.GetValue(6));
                    }
                }
            }

        }
person doug    schedule 27.06.2012

нет, не надо. Вы хотите создать новый столбец с копией выраженных данных и сделать его RW.

person Dan    schedule 29.01.2019