0

http://msdn.microsoft.com/en-us/library/ms810291.aspxによると、DataTable の Expression ベースの列の ReadOnly 属性を変更することはできません。DataTable 列の式を評価し、.Expression = null を設定して、その列の編集を許可する方法を見つける必要があります。

Expression == null を設定すると、DataTable の値が DBNull にリセットされるため、次のコードは機能しません。

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

私の考えは、スキーマを保持せずに現在の DataTable を新しい DataTable に行ごとにコピーし、新しい DataTable 値を編集できるようにすることです (式によって派生したかどうかに関係なく)...よくわかりませんこれを行う方法。

4

2 に答える 2

0

これが私がそれをした方法です:

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));
                    }
                }
            }

        }
于 2012-06-27T16:00:53.320 に答える