У меня есть 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);
Не знаете, почему вы пытаетесь сохранить массив в своем поле 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]));
Вы установили:
this.monthList.DataValueField = "id";
Поэтому для свойства Value будет установлено значение столбца "id" в вашем DataTable.
Столбец "id" в вашем DataTable определен (по умолчанию) как тип "String", но вы установили его в массив объектов:
row["id"] = new object[] { 2014, 5 };
Столбец фактически будет содержать
(new object[] { 2014, 5 }).ToString();
который является той строкой, которую вы видите.
Вы можете попробовать объявить столбец id как объект типа []:
dt.Columns.Add("id", typeof(object[]));
После этого вы сможете monthList.SelectedItem.Value
к object[]
и извлечь два значения.
Сказав это: лично я, вероятно, поместил бы два значения, составляющие id, в отдельные столбцы int.
id
содержало два целых числа. Мой вопрос - как я могу извлечь эти два целых числа из свойства SelectedValue
или SelectedItem
раскрывающегося списка?
data.Columns.Add("id", typeof(object[]));
не помогло
Кажется, что привязка столбца, который содержит коллекцию объектов к свойству DataValueField для DropDownList, не поддерживается конструкцией (это делает атрибут value
тега option
для имени типа коллекции).
Вы можете попытаться сбрасывать объекты коллекции на одно строковое значение и использовать это строковое значение в качестве ключа...
Например:
row["id"] = "2014_05";
EDIT:
Конечно, вы можете вычислить значение этого ключа автоматически, используя ту же функцию, что и для столбца displayText
:
data.Columns["id"].Expression = "Convert(year, 'System.String') + '_' + Convert(month , 'System.String')";
monthList
(monthList.DataSource == null
true), но не наdata
, как я могу получить доступ к двум другим столбцам int?