我有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:这是调试器的屏幕截图。
更新2:以下是我向data
添加项目的方式:
var row = data.NewRow();
row["year"] = 2014;
row["month"] = 5;
row["id"] = new object[] { 2014, 5 };
data.Rows.Add(row);
答案 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]));