none
解决DataTable应用表达式后导致的列只读问题 RRS feed

  • 问题

  •  当我对DataTable 应用 Expression 后,会导致列属性为只读,不可编辑。包括设置了该DataTable为数据源的表格控件也将无法修改该列。有什么办法能让应用了Expression的列能重新被编辑修改?

    是否存在这样的方案:对应用了Expression的DataTable做一个类似快照或执行Expression后的计算值做一个类似“提交”的动作,让该列的值变更为Expression计算后的值,致使该列能被重新编辑?

    2017年6月29日 6:43

全部回复

  • 你好,

    >>是否存在这样的方案:对应用了Expression的DataTable做一个类似快照或执行Expression后的计算值做一个类似“提交”的动作,让该列的值变更为Expression计算后的值,致使该列能被重新编辑?

    根据下面的这个文章,我们知道 与大多数 DBMS 中的计算所得的列的情况不同,所有值始终存储在内存中,从这个意义上来说,计算所得的 ADO.NET DataColumn 对象表示真实的列。不过,计算所得的列将永久地标记为只读。也就是说,在删除绑定的表达式之前,您不能删除列的 “只读” 属性。当然,“只读” 属性还防止任何应用程序将直接的值分配给列的单元格。

    https://msdn.microsoft.com/zh-cn/library/ms810291.aspx

    所以你可以创建一个temp table,把原datatable的数据复制到temp table, 改temp table的列。

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

    Best regards,

    Cole Wu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年6月30日 9:45
    版主