【问题标题】:How to define a DataType column in DataTable?如何在 DataTable 中定义 DataType 列?
【发布时间】:2011-05-21 18:10:34
【问题描述】:

我需要将一些数据存储在数据表中。表中的列是: -ID -文本 -价值 -数据类型 我应该如何定义表列以便 DataType 列存储本机和复合类型?

目前我将其存储为

dt.Columns.Add(new DataColumn("Id", typeof(int)));
dt.Columns.Add(new DataColumn("Text", typeof(string)));
dt.Columns.Add(new DataColumn("Value", typeof(string)));
dt.Columns.Add(new DataColumn("DataType", typeof(string)));

稍后在我的程序中,我尝试解析值并根据数据类型显示控件。比如,如果数据类型是 int 则显示文本框,如果是 bool 则显示下拉列表。

我相信会有更简单的方法来做到这一点。请建议如何实现此功能?示例代码将帮助我更好地理解它。谢谢!

【问题讨论】:

  • 它应该以这种方式工作。有什么问题?
  • 让我再次解释一下,因为我以前无法解释。我想要一种方法来确定存储在数据表列中或简化的数据类型,存储在字符串变量中。像字符串 sType = "System.Boolean"。一旦确定,然后我将放置控件(文本框、下拉列表等)。但我也想用标准值填充控件。例如:如果它是布尔类型,那么我需要下拉列表具有真值和假值。如果变量具有“System.Drawing.Color”,则下拉列表应包含所有系统颜色。我有一个完全可以做到这一点的代码,但是我有一个类对象而不是数据表。

标签: .net datatable types type-conversion


【解决方案1】:

DataColumn 或 DBMS 中创建像 DataType 和 Value 这样的列通常是 Inner-platform effect 的症状,在这种情况下,您尝试通过忽略数据库中的类型定义来在类型化数据库中创建类型化数据库。

不要那样做。 DataColumns 已经支持类型化数据、查询架构和连接包含异构数据的表。将 int 存储为 ints ,将 booleans 存储为布尔值,您无需解析任何内容。您可以通过以下方式确定DataColumn 的数据类型:

var dc = new System.Data.DataColumn("ID", typeof(int));
bool isInt = dc.DataType.Equals(typeof(int));

【讨论】:

  • 你是对的,但在我的情况下,我得到了一个需要解析的数据类型列,以便我可以在页面上提供正确的 Web 控件。我无法更改传给我的数据。我的示例中提到的“DataType”列包含整数、布尔值、字符串、颜色、myobject 等。该示例类似于属性网格。我说得有道理吗?
【解决方案2】:

您可以通过执行以下操作来简化代码:

dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Text", typeof(string));
dt.Columns.Add("Value", typeof(string));
dt.Columns.Add("DataType", typeof(string));

不需要使用数据列构造函数。

【讨论】:

  • 当然 :) 它看起来更干净。关于如何将类似于 GetStandardValuesSupported() 的方法用于数据表中的 DataType 列的任何想法?我想这种方法将帮助我确定它可以具有的类型和值。对吗?
【解决方案3】:

所以,您实际上是在创建某种创作工具。您在数据库中定义数据类型,然后在读取数据时动态创建控件?

好的,与其将默认值(true、false)存储在数据库中,不如将它们存储在控件中。例如,您现在的复选框必须具有默认值 true/false,txtbax 具有默认值空白等。

或者,你可以扩展你的数据库来保存一个字段的可能值列表。我的意思是你可能有一行显示

Id=5,文本='选定'。值='False',类型='System.Boolean'

然后在另一个表中

Id=5,值=True,默认值=false id=5,值=false,默认=true

或者,对于一个字符串

Id=5,文本='选定'。值='UK',类型='System.Text'

Id=5,值='UK',默认值=true id=5, value='USA', 默认=false

如果你这样做,那么你可以从第一个表中删除值..

不完全确定这有帮助吗?

【讨论】:

  • 这是另一种解决方案,但如果我的一个变量的数据类型是 Color 或 struc 或 enum 怎么办?我想要一种从代码本身获取信息的方法。我不想将默认值存储在数据库中。类似于下面的 TypeDescriptor.GetProperties(myobject)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2012-03-29
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2021-01-12
相关资源
最近更新 更多