У меня есть серия GridView в панели вкладок, привязанная к общему списку бизнес-объектов.
Все столбцы в Gridview похожи на следующие:
<asp:TemplateField HeaderText="Company" SortExpression="Company.ShortName">
<ItemTemplate>
<asp:Label ID="lblCompany" runat="server" Text='<%# Bind("Company.ShortName") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="ddlCompany" runat="server"></asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>
GridView генерирует ссылку «Редактировать» в начале строки, все события запускаются нормально. Проблема в том, что данные становятся длинными. В «режиме отображения» это нормально, потому что элемент управления GridView достаточно умен, чтобы разбить некоторый текст на несколько строк (в частности, имена проектов, заголовков и рабочих могут быть довольно длинными).
Проблема возникла в режиме редактирования. Раскрывающиеся списки НЕ разбивают записи на несколько строк (по понятным причинам). Переход к редактированию строки в Gridview может привести к расширению Griview по горизонтали до размера экрана в два раза (превышение пределов ширины на главной странице и в CSS, но это только связанная проблема).
Мне нужно что-то вроде ModalPopup, но при попытке привязать его к идентификатору в EditItemTemplate я получаю ошибки при визуализации страницы (потому что в то время «ddlXXXX» не существует). Кроме того, я не знаю, как динамически заполнить панель, чтобы получить от нее ответ (например, идентификатор выбранной ими компании).
Я также пытаюсь избежать javascript и хотел бы, чтобы это было «чистое» решение aspx / code-behind (для простоты, среди прочего).
Все примеры, которые я нахожу, относятся к модальным всплывающим окнам с заранее заданными панелями. Даже если бы это (всплывающая панель) было чем-то вроде списка флажков, это могло бы быть связано с SortedList, который я готов использовать, и комбинацией кнопок OK / Cancel, чтобы принимать или игнорировать вещи. Я просто не уверен, что и куда.
Я открыт для предложений. Заранее спасибо.
РЕДАКТИРОВАТЬ: окончательное решение выглядит следующим образом:
<asp:TemplateField HeaderText="Company" SortExpression="Company.ShortName">
<ItemTemplate>
<asp:Label ID="lblCompany" runat="server" Text='<%# Bind("Company.ShortName") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:LinkButton ID="lnkCompany" runat="server" Text='<%# Bind("Company.ShortName") %>'></asp:LinkButton>
<asp:Panel ID="pnlCompany" runat="server" style="display:none">
<div>
<asp:DropDownList ID="ddlCompany" runat="server" ></asp:DropDownList>
<br/>
<asp:ImageButton ID="btnOKCo" runat="server" ImageUrl="~/Images/greencheck.gif" OnCommand="PopupButton_Command" CommandName="SelectCO" />
<asp:ImageButton ID="btnCxlCo" runat="server" ImageUrl="~/Images/RedX.gif" />
</div>
</asp:Panel>
<cc1:ModalPopupExtender ID="mpeCompany" runat="server"
TargetControlID="lnkCompany" PopupControlID="pnlCompany"
BackgroundCssClass="modalBackground" CancelControlID="btnCxlCo"
DropShadow="true" PopupDragHandleControlID="pnlCompany" />
</EditItemTemplate>
</asp:TemplateField>
А в коде позади lstIDLabor - это общий список строк данных (одним из свойств которого является Company, который также является бизнес-объектом), который связан с GridView:
Sub PopupButton_Command(ByVal sender As Object, ByVal e As CommandEventArgs)
Dim intRow As Integer
Dim intVal As Integer
RestoreFromSessionVariables()
Select Case e.CommandName
Case "SelectCO"
intRow = grdIDCostLabor.EditIndex
Dim ddlCo As DropDownList = CType(grdIDCost.Rows(intRow).FindControl("ddlCompany"), DropDownList)
intVal = ddlCo.SelectedValue
lstIDLabor(intRow).CompanyID = intVal
lstIDLabor(intRow).Company = Company.Read(intVal)
Case Else
'
End Select
MakeSessionVariables()
BindGrids()
End Sub