Привязать DropDownList "неиспользуемых" элементов плюс текущий элемент строки в EditItemTemplate GridView?
У меня есть 2 таблицы с уникальными идентификаторами, которые могут быть сопоставлены друг с другом (одна таблица поступает из базы данных вне моего приложения, но содержит информацию о тех же сущностях, которые я отслеживаю). Я хочу предоставить пользовательский интерфейс для связи "моих" записей с "другими", чтобы я мог хранить "другие" идентификаторы в моей таблице для соответствующих записей. В двух словах, ключевым элементом пользовательского интерфейса является раскрывающийся список, показывающий доступные (т.е. еще не связанные) записи из "другой" таблицы.
У меня есть сетка для отображения "моих" записей в каждой строке, плюс столбец, показывающий некоторую информацию из связанной записи в "другой" таблице, если таковая имеется. Данные о зданиях и свойствах, поэтому это может выглядеть так:
Building1 Dallas TX Building1_Dallas_TX
Building2 Memphis TN Bldg2_Memphis_TN
Building3 Denver CO
Building4 Seattle WA
Building5 Boston MA Building5_Boston_MA
где первые 3 столбца показывают некоторую информацию из "моей" таблицы, а последний показывает соответствующую запись из "другой" таблицы, где записи уже были связаны, в противном случае - пустое место, где не было установлено никакой связи. У моего фактического gridview есть еще несколько столбцов из "моей" таблицы, но этого достаточно, чтобы проиллюстрировать необходимость.
Если щелкнуть строку "Изменить" (не показана), я хочу иметь возможность редактировать все 4 столбца. Первые 3 являются текстовыми полями; последний столбец должен быть выпадающим списком, показывающим все несвязанные записи из "другой" таблицы, плюс опцию "Неназначенные" (как первый элемент в списке), чтобы записи можно было "отсоединить" или просто оставить неназначенными, плюс (для те строки, в которых уже установлена ссылка) связанный элемент (он "используется", но он должен быть там, чтобы они могли продолжать его использовать).
Я могу правильно заполнить раскрывающийся список в выделенном фрагменте кода в событии gridview RowEditing (за исключением элемента "Неназначенный", который я добавляю в качестве ListItem в.aspx с параметром AppendDataBoundItems, установленным в значение "истина"), и могу установить правильное значение SelectedValue для DataBound объекта ddl. событие, но при обратной передаче, когда я нажимаю Обновить строку, в ddl больше нет элементов (кроме элемента "Неназначенный"), поэтому ссылка всегда очищается. Если я установлю ссылку вручную, напрямую отредактировав свою таблицу, все будет хорошо, если перейти в режим редактирования - в ddl будут правильные элементы, и он предварительно выберет правильный элемент, но все будет потеряно при обратной передаче обновления. Я пытался повторно привязать ddl на разных этапах цикла страницы, но, очевидно, я еще недостаточно хорошо понимаю этот цикл, потому что не могу понять, как получить выбранный пользователем элемент для обновления моей таблицы.
Я также попытался заполнить ddl с помощью SqlDataSource SelectCommand, но мне не повезло, включая идентификатор связанных в настоящее время записей в другой базе данных (даже если он доступен в "моей" таблице, и я установил его как GridView DataKey и добавил это как ControlParameter в SelectParameters для SqlDataSource. Без текущей связанной записи в списке элементов ddl я не могу сохранить существующие ссылки.
Я пока не буду отправлять пример кода - это сообщение уже слишком длинное! - в надежде, что решение очевидно из того, что я описал... Я не думаю, что моя цель странная, но я открыт для убеждения иначе.
Спасибо заранее!
Крис
1 ответ
Хорошо, я не буду вдаваться в подробности с кодом, потому что, возможно, вы уже сделали то, что я собираюсь предложить.
Для последнего столбца, выпадающего списка, вы должны выполнить оператор SQL, чтобы получить несвязанные элементы. Используйте "ГДЕ ХХ НЕ ВХОДИТ". Для опции "Неназначенный" просто добавьте элемент в список в той же области кода, что и выше.
Следующим шагом является обработка событий редактирования GridView вручную. Вставить, обновить и удалить.
Я думаю, что таким образом у тебя не будет проблем.