如何使用数组检索DataTable列的值?

时间:2014-05-22 11:04:58

标签: c# asp.net .net

我有DataTable,我按以下方式构建:

DataTable data = new DataTable();

data.Columns.Add("year");
data.Columns.Add("month");
data.Columns.Add("id");
data.Columns.Add("displayText");

data.Columns["displayText"].Expression = "Convert(year, 'System.String') + ' / ' + Convert(month , 'System.String')";

DataColumn[] keyColumns = new DataColumn[2];
keyColumns[0] = data.Columns["year"];
keyColumns[1] = data.Columns["month"];

data.PrimaryKey = keyColumns;

data用作monthList下拉列表

的数据源
this.monthList.DataTextField = "displayText";
this.monthList.DataValueField = "id";
this.monthList.DataSource = data;
this.monthList.DataBind();

然后我有一个事件处理程序,我需要在其中提取键列的两个组件。

我该怎么做?

我尝试使用monthList.SelectedItem.Value,但它包含字符串"System.Object[]"

更新1:这是调试器的屏幕截图。

Debugger screenshot

更新2:以下是我向data添加项目的方式:

var row = data.NewRow();

row["year"] = 2014;
row["month"] = 5;
row["id"] = new object[] { 2014, 5 };

data.Rows.Add(row);

3 个答案:

答案 0 :(得分:1)

设计不支持将包含对象集合的列绑定到DropDownList的DataValueField属性(它使value标记的option属性设置为集合类型名称。 / p>

您可以尝试将集合对象转储为单个字符串值,并将该字符串值用作键...

例如:

row["id"] = "2014_05";

修改

当然,您可以使用与displayText列中使用的功能相同的功能自动计算此键值:

data.Columns["id"].Expression = "Convert(year, 'System.String') + '_' + Convert(month , 'System.String')";

答案 1 :(得分:1)

您已设置:

this.monthList.DataValueField = "id";

因此,Value属性将设置为" id"的值。 DataTable中的列。

" id" DataTable中的列(默认情况下)定义为" String",但您已将其设置为对象数组:

row["id"] = new object[] { 2014, 5 };

该列实际上包含

(new object[] { 2014, 5 }).ToString();

这是你看到的字符串。

您可以尝试将id列声明为类型object []:

dt.Columns.Add("id", typeof(object[]));

在此之后,您应该能够monthList.SelectedItem.Value投射到object[]并提取您的两个值。

话虽如此:我个人可能会将组成id的两个值放入单独的int列中。

答案 2 :(得分:1)

不确定为什么要在id字段中存储数组,考虑到相同的值存储在同一行但存储在不同的列中,但是如果您声明了这些值,则可以在该字段中提取值类型对象的列

  data.Columns.Add("id", typeof(object));

然后使用

检索它们
 object[] ids = (object[])data.Rows[0]["id"];


 for(int x = 0; x < ids.Length; x++)
     Console.WriteLine(Convert.ToInt32(ids[x]));