Редактирование строки Gridview с раскрывающимися списками становится слишком широким - как я могу вместо этого использовать всплывающие панели? - PullRequest
2 голосов
/ 16 апреля 2010

У меня есть серия 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

1 Ответ

0 голосов
/ 17 апреля 2010

Как насчет этого?

<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="EditBtn" runat="server" Text='<%# Eval("Company.ShortName") %>' />
      <asp:Panel ID="Panel1" runat="server" Style="display: none" CssClass="modalPopup">
        <div>
          <asp:DropDownList ID="ddlCompany" runat="server"  SelectedValue='<%# Bind("Company.ID")></asp:DropDownList><br/>
          <asp:ImageButton ID="OkButton" runat="server" ImageUrl="~/Images/OkBtn.png"  />
          <asp:ImageButton ID="CancelButton" runat="server" ImageUrl="~/Images/Cancel.png" />

          </div>
        </div>
      </asp:Panel>
      <act:ModalPopupExtender ID="ModalPopupExtender" runat="server" TargetControlID="EditBtn"
        PopupControlID="Panel1" BackgroundCssClass="modalBackground" CancelControlID="CancelButton"
        DropShadow="true" PopupDragHandleControlID="Panel1" />
</EditItemTemplate>

Поэтому, когда вы редактируете, вы видите компанию в виде кнопки ссылки, а при нажатии вы получаете всплывающее окно с выпадающим списком, который уже привязан к идентификатору компании

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...