Редактирование строки 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     <%----%>      <%----%>       <%-- --%>      <%-- --%>       <%--  --%>                  
    Interesting Posts

    Ruby on Rails – проверка стоимости

    Выполнять команды с использованием sudo на удаленном сервере после входа в PuTTY через командный файл

    Установка изображения UIButton приводит к синей кнопке в iOS 7

    На моем нетбуке, как я могу отключить сенсорную панель, пока я набираю текст, чтобы избежать столкновения?

    Как Chrome может искать среди заголовков / URL уже открытых вкладок, например Firefox?

    Изображение для преобразования в ASCII

    Как работает http://to./?

    Пароль, защищающий каталог и все его подпапки, используя .htaccess

    В чем разница между eq, eql, equal и equalp в Common Lisp?

    Как передать данные от 2-го действия до 1-го действия при нажатии? – Андроид

    Поворот GameObject с течением времени

    разница между http.context.user и thread.currentprincipal и когда их использовать?

    Windows 10: Запланированные задачи с блокировкой / разблокировкой рабочей станции, не запускаемой

    Как сделать VS Code для обработки других расширений файлов как определенного языка?

    Учитывая, что последний блок не заполнен неправильно

    Давайте будем гением компьютера.