У меня есть относительно простой Listview, который внезапно нуждается (из-за новых требований), чтобы его «макет» был извлечен в DataTable, чтобы обычная подпрограмма могла преобразовать его в электронную таблицу Excel для целей экспорта.Как извлечь или преобразовать информацию из списка (в DataTable)?
ItemTemplate - это всего лишь серия строк таблицы с текстом, привязанными к данным метками и текстовыми полями с валидаторами в ячейках.
Обычно, пытаясь вытащить определенное значение (например, введенное в текстовое поле), я использую метод ListViewItem .FindControl.
For Each objItem As ListViewItem In lvwOptions.Items
Dim objTextHrsLabor As TextBox = CType(objItem.FindControl("txtHrsOptByLabor"), TextBox)
decHours = CDec(objTextHrsLabor.Text)
Next
В этом случае, однако, я стараюсь взять все данные, отображаемые - все «строки и столбцы» таблицы, которая была создана.
Внутри цикла ForEach/Next ListViewItems я начал цикл управления ForEach/Next для элементов управления каждого экземпляра, но у меня появились некоторые действительно странные результаты (например, элементы управления, в которых было несколько ячеек таблицы).
Получилось ощущение, что я направляюсь в неправильном направлении. Все, что я хочу, это для хорошо отформатированной 5-строчной, 6 столбцовой таблицы, которая будет преобразована в 5-строчную, 6-столбную таблицу данных.
Есть ли еще один проспект, на который я должен смотреть?
Я надеялся избежать необходимости добавлять все «ярлыки». У меня в основном есть 3 списка, один на каждой вкладке TabContainer, отображающий разные части одного и того же списка (из MyBusinessObject). Желаемая цель - взять то, что они видят на экране, и «экспортировать» его в Excel. У нас есть подпрограммы для преобразования Datable в Excel, поэтому я надеялся сделать datatable из таблицы, отображаемой в ListView. – David
Хм. Вы определили пользовательские заголовки в вашей разметке aspx? Вам придется изучить иерархию управления или сгенерированный html для тех, кого я думаю. Но как только вы их получите, вы все равно сможете пройти через источник данных, чтобы получить данные о строках.В этом случае вы можете пройти через коллекцию Items и посмотреть на ListViewDataItem там, но это наверняка будет беспорядочно. –
Становится ясным, что я должен использовать ярлыки для текста столбца и заголовка строки. Затем мне нужно выполнить итерацию через .Controls в каждом элементе ListView.Item. Оператор case, разветвляющийся по значению Control.ToString, позволяет мне DirectCast в Labels и TextBoxes. Теперь я могу рассказать о конце строки, если тип объекта «Web.UI.Webcontrols.LiteralControl» и, как только CAST, сканировать свойство LiteralControl.Text для «». Уродливо, но похоже, что это сработает. – David