Редактирование строки Gridview – динамическое связывание с DropDownList
Я пытаюсь получить GridView ASP.NET 3.5, чтобы отображать выбранное значение как строку при отображении, и показать DropDownList, чтобы я мог выбрать значение из заданного списка параметров при редактировании. Кажется, достаточно просто?
Мое gridview выглядит так (упрощенно):
<asp:Label ID="lblPbxTypeCaption" runat="server" Text='' />
Сетка будет отображаться ОК, если не в режиме редактирования – выбранный тип УАТС показывает свое значение в элементе управления asp: Label. Не удивительно.
- Как выбрать / получить раскрывающийся список в Selenium 2
- twitter bootstrap - выпадение нескольких столбцов
- BootStrap3 сохраняет раскрывающееся меню после нажатия на элемент
- Как установить значение DropDownList с помощью jQuery?
- Селен WebDriver и DropDown Boxes
Я загружаю список значений для DropDownList в локальный элемент с именем _pbxTypes
в событии OnLoad
формы. Я проверил это – он работает, значения есть.
Теперь моя задача: когда grid переходит в режим редактирования для определенной строки, мне нужно связать список PBX, хранящихся в _pbxTypes
.
Достаточно просто, подумал я – просто возьмите выпадающий объект списка в событии RowEditing
и прикрепите список:
protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e) { grvSecondaryLocations.EditIndex = e.NewEditIndex; GridViewRow editingRow = grvSecondaryLocations.Rows[e.NewEditIndex]; DropDownList ddlPbx = (editingRow.FindControl("ddlPBXTypeNS") as DropDownList); if (ddlPbx != null) { ddlPbx.DataSource = _pbxTypes; ddlPbx.DataBind(); } .... (more stuff) }
Проблема в том, что я никогда ничего не получаю от вызова FindControl
– похоже, что ddlPBXTypeNS
не существует (или не может быть найден).
Что мне не хватает? Должно быть, это что-то действительно глупое …. но до сих пор, все мои Googling, чтение на элементах управления GridView и запросы друзей не помогли.
Кто может обнаружить недостающее звено? 😉
- Как заполнить выпадающий список json-данными в jquery?
- Событие SelectedIndexChanged DropDownList не срабатывает
- DropDownList устанавливает выбранный элемент в asp.net MVC
- Как сделать раскрывающееся меню Twitter Bootstrap, а не щелчком
- Multi-spinner в android без AlertDialog
- Asp.net - Добавить пустой элемент в верхней части раскрывающегося списка
- Выбранное значение для JSP с помощью JSTL
- Html.EnumDropdownListFor: отображение текста по умолчанию
Довольно легко … Вы делаете это неправильно, потому что этим событием контроля нет:
protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow && (e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) { // Here you will get the Control you need like: DropDownList dl = (DropDownList)e.Row.FindControl("ddlPBXTypeNS"); } }
То есть он будет действителен только для DataRow
(фактическая строка с данными), и если он находится в режиме редактирования … потому что вы редактируете только одну строку за раз. e.Row.FindControl("ddlPBXTypeNS")
найдет только тот элемент управления, который вы хотите.
Я использую ListView вместо GridView в 3.5. Когда пользователь хочет изменить, я установил выбранный элемент выпадающего списка в значение, выходящее из этого столбца для записи. Я могу получить доступ к выпадающему списку события ItemDataBound. Вот код:
protected void listViewABC_ItemDataBound(object sender, ListViewItemEventArgs e) { // This stmt is used to execute the code only in case of edit if (((ListView)(sender)).EditIndex != -1 && ((ListViewDataItem)(e.Item)).DisplayIndex == ((ListView)(sender)).EditIndex) { ((DropDownList)(e.Item.FindControl("ddlXType"))).SelectedValue = ((MyClass)((ListViewDataItem)e.Item).DataItem).XTypeId.ToString(); ((DropDownList)(e.Item.FindControl("ddlIType"))).SelectedValue = ((MyClass)((ListViewDataItem)e.Item).DataItem).ITypeId.ToString(); } }
protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e) { grvSecondaryLocations.EditIndex = e.NewEditIndex; DropDownList ddlPbx = (DropDownList)(grvSecondaryLocations.Rows[grvSecondaryLocations.EditIndex].FindControl("ddlPBXTypeNS")); if (ddlPbx != null) { ddlPbx.DataSource = _pbxTypes; ddlPbx.DataBind(); } .... (more stuff) }
Проверенный ответ от balexandre отлично работает. Но это создаст проблему, если она адаптирована к некоторым другим ситуациям.
Я использовал его для изменения значения двух элементов управления lblEditModifiedBy
– lblEditModifiedBy
и lblEditModifiedOn
– когда я редактировал строку, чтобы корректные ModifiedBy и ModifiedOn
были сохранены в db в разделе «Обновление».
Когда я нажал кнопку «Обновить», в событии RowUpdating
показаны новые значения, введенные OldValues
списке OldValues
. При обновлении базы данных мне нужны были истинные «старые значения» как значения Original_. (В GridView
есть объект ObjectDataSource
.)
Исправлено это использование кода balexandre, но в измененной форме в событии gv_DataBound
:
protected void gv_DataBound(object sender, EventArgs e) { foreach (GridViewRow gvr in gv.Rows) { if (gvr.RowType == DataControlRowType.DataRow && (gvr.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) { // Here you will get the Control you need like: ((Label)gvr.FindControl("lblEditModifiedBy")).Text = Page.User.Identity.Name; ((Label)gvr.FindControl("lblEditModifiedOn")).Text = DateTime.Now.ToString(); } } }
Вы можете использовать SelectedValue:
<%# Container .DataItemIndex+1 %>.  <%-- --%> <%-- --%> <%-- --%> <%-- --%> <%-- --%>