Редактирование строки Gridview – динамическое связывание с DropDownList

Я пытаюсь получить GridView ASP.NET 3.5, чтобы отображать выбранное значение как строку при отображении, и показать DropDownList, чтобы я мог выбрать значение из заданного списка параметров при редактировании. Кажется, достаточно просто?

Мое gridview выглядит так (упрощенно):

    <asp:Label ID="lblPbxTypeCaption" runat="server" Text='' />       

Сетка будет отображаться ОК, если не в режиме редактирования – выбранный тип УАТС показывает свое значение в элементе управления asp: Label. Не удивительно.

Я загружаю список значений для 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 и запросы друзей не помогли.

Кто может обнаружить недостающее звено? 😉

Довольно легко … Вы делаете это неправильно, потому что этим событием контроля нет:

 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 отлично работает. Но это создаст проблему, если она адаптирована к некоторым другим ситуациям.

Я использовал его для изменения значения двух элементов управления lblEditModifiedBylblEditModifiedBy и 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 %>.&nbsp     <%----%>      <%----%>       <%-- --%>      <%-- --%>       <%--  --%>                  
  • Добавление эффекта слайда в раскрывающийся список бутстрапов
  • Сохранять раскрывающееся окно Bootstrap при нажатии
  • Триггер нажмите на поле выбора при наведении
  • Заполнение выпадающего списка HTML в JSP со значениями, полученными из базы данных в Servlet
  • Элемент управления Dropdownlist с помощью s для asp.net (webforms)?
  • Поддержка optgroup в выпадающем списке .NET MVC?
  • сделать выпадающий список элементов невыбранным
  • Как добавить элемент RequiredFieldValidator в DropDownList?
  • Угловые 2+ и наблюдаемые: не могут привязываться к 'ngModel', поскольку это не известное свойство 'select'
  • Включить / отключить раскрывающийся список в jquery
  • Как сохранить пробелы в DropDownList - представления ASP.NET MVC Razor
  • Давайте будем гением компьютера.