Тип данных в графе GridView / Listview, шаблоне и автоматически сгенерированных полях - PullRequest
1 голос
/ 18 августа 2010

Фон : я заполняю множество asp.net c # GridViews и ListViews из базы данных, и впоследствии пользователи могут экспортировать их в Excel. Я хочу экспортировать как родной Excel (не HTML). Я не могу использовать автоматизацию офиса, и я использую JET, который отлично работает. Я не контролирую машины пользователей.


Вопрос : при экспорте вы должны указать Jet, какой тип у каждого поля, в моем случае «text» (varchar) или «numeric» (double). Разница в том, что если вы экспортируете числовой столбец, пользователи могут суммировать данные в Excel, где строки экспортируются с начальным апострофом и поэтому не используются в арифметике.

В настоящее время я анализирую первую строку данных Grid / ListView, проверяю, является ли каждое значение числовым или текстовым, и соответственно назначаю тип столбцу. Это работает, за исключением случаев, когда в первом столбце есть что-то, что выглядит числовым, но на самом деле это текстовая строка. Я не хочу анализировать каждую строку, чтобы убедиться, что у меня правильный тип данных, так как некоторые из этих экспортов довольно велики.

Когда я загружаю Grid / ListView из базы данных, база данных точно знает, какой тип у каждого поля. Итак, мой вопрос ... как мне извлечь тип элемента базы данных за элементом Grid / ListView? Я мог бы явно закодировать его как атрибут элемента, но это дублирует информацию, которая у меня уже есть, если только я смогу добраться до нее.

Я знаю, что там, где у меня есть DataTable, я могу получить базовый тип из этого, но в основном у меня нет удобных таблиц, только Grid / ListView.

- (редактировать) Обратите внимание, что Jet выдаст, если вы попытаетесь вставить пустую строку в числовой столбец, который может содержать пустые значения. Способ сделать это - опустить это имя столбца в операторе вставки или вывести ноль.

Ответы [ 2 ]

0 голосов
/ 21 августа 2010

Насколько я могу судить, ответ "ты не можешь".Мои источники данных возвращают только строки, поэтому вы не можете анализировать автоматически созданные DataTable для типов столбцов.


То, что я сделал, было ...

Большинство типов столбцов, которые я могу "понюхать", посмотрев на 1-ю строку таблицы / списка.Это терпит неудачу, только если данные 1-го столбца являются нулевыми (что ничего не говорит), или если 1-й столбец подразумевает числовые значения, но данные столбца являются, например, буквенно-цифровыми.

Так что для тех столбцов, где я знаю, что есть проблема, или где тестирование показывает, что это так, я аннотирую эти конкретные элементы Grid или ListView с помощью пользовательского атрибута, который заставляет элементы экспортироваться как текстовые или числовые.Я по умолчанию использую текст, поэтому на практике мне чаще всего нужно аннотировать те записи, которые я специально хочу визуализировать, как числовые.Исключением являются некоторые идентификационные номера, которые начинаются с начальных нулей, которые я хочу отрисовать таким образом, и, следовательно, идет в явном виде в виде текста.

Где у меня есть DataTable (например, для диаграмм), и я не могу выполнить трюк с анализом(см. выше) или трюк с аннотацией (то же самое), затем я передаю карту типов столбцов в свой код экспорта.

В итоге, в некоторых случаях я вынужден повторить определение типа столбца либо вполя шаблона Grid / ListView или в полевой карте.Не могу победить их всех.Это работает.

0 голосов
/ 18 августа 2010

Я думаю, что вы пытаетесь выяснить, лежащий в основе DataSource из GridView или ListView после того, как он был связан?

Если так, то это невозможно, так как элементы управления нена самом деле следите за DataSource, как только он был связан.В основном они используются для заполнения столбцов, шаблонов и т. Д., А затем поддерживаются только эти элементы.

Единственная рекомендация, которую я могу предложить, - это хранить DataSource в другом месте, чтобы вы могли получить к нему доступ позже изатем используйте его, чтобы обнаружить основные типы данных, используемые для каждого столбца.Вы можете сохранить его в Session или ViewState, если хотите, но это увеличит накладные расходы.Другой вариант - выяснить типы данных перед привязкой, а затем сохранить их в скрытом поле с некоторым форматом, который вы можете использовать позже для репликации того, что было сделано.

Например (плохой пример, но дает вамидея) Храните в скрытом поле следующие данные:

yourHiddenField.Text = "0,1|1,1|2,0|3,1|etc...";
// format "columnindex,fieldtype(0=double,1=string)" with a pipe delimiter.

Не красиво, но иллюстрирует основную идею, о которой я думаю.

...