2010-01-04 2 views
0

У меня есть относительно простой 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-столбную таблицу данных.

Есть ли еще один проспект, на который я должен смотреть?

ответ

0

Я бы посмотрел на базовый источник данных для вашего ListView.

Источник данных должен быть сборником или IEnumerable, и вы должны иметь возможность выполнять итерацию через него, чтобы создать таблицу данных.

Если вы знаете, что все элементы одного типа, то вы можете использовать первый элемент и посмотреть его свойства с помощью отражения, чтобы определить, в каких столбцах должна содержаться ваша таблица. Затем вы можете добавить DataRows в свою таблицу и заполнить столбцы, используя имена свойств.

Это, вероятно, будет быстрее, чем итерация через сгенерированный html ListView.

+0

Я надеялся избежать необходимости добавлять все «ярлыки». У меня в основном есть 3 списка, один на каждой вкладке TabContainer, отображающий разные части одного и того же списка (из MyBusinessObject). Желаемая цель - взять то, что они видят на экране, и «экспортировать» его в Excel. У нас есть подпрограммы для преобразования Datable в Excel, поэтому я надеялся сделать datatable из таблицы, отображаемой в ListView. – David

+0

Хм. Вы определили пользовательские заголовки в вашей разметке aspx? Вам придется изучить иерархию управления или сгенерированный html для тех, кого я думаю. Но как только вы их получите, вы все равно сможете пройти через источник данных, чтобы получить данные о строках.В этом случае вы можете пройти через коллекцию Items и посмотреть на ListViewDataItem там, но это наверняка будет беспорядочно. –

+0

Становится ясным, что я должен использовать ярлыки для текста столбца и заголовка строки. Затем мне нужно выполнить итерацию через .Controls в каждом элементе ListView.Item. Оператор case, разветвляющийся по значению Control.ToString, позволяет мне DirectCast в Labels и TextBoxes. Теперь я могу рассказать о конце строки, если тип объекта «Web.UI.Webcontrols.LiteralControl» и, как только CAST, сканировать свойство LiteralControl.Text для «». Уродливо, но похоже, что это сработает. – David

0

Я использовал этот подход для экспорта ListView в Excel: http://aspalliance.com/771_CodeSnip_Exporting_GridView_to_Excel.

Я знаю, что он имеет дело с GridView, но я адаптировал его к ListView (пока базовая структура является таблицей), и она отлично работала для меня.

HTH.

+0

К сожалению, базовый код является общей коллекцией списков. – David

+0

Работает одинаково; просто привяжите список, и это тоже будет работать. –

0

вы можете использовать ..

listView1.Items[0].SubItems[0].Text 

это будет полезно, очень просто и легко. Вы можете извлечь информацию прямо на основе индекса & использовать все равно, что хотите.

Смежные вопросы