タブ パネルに一連の GridViews があり、ビジネス オブジェクトの一般的なリストにデータ バインドされています。
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 の行で Edit ode に入ると、Griview が水平方向に拡大して画面サイズの 2 倍になることがあります (マスター ページと CSS の幅制限を超えていますが、これは関連する問題にすぎません)。
必要なのは ModalPopup のようなものですが、それを EditItemTemplate の ID に関連付けようとすると、ページのレンダリング時にエラーが発生します (その時点で「ddlXXXX」が存在しないため)。さらに、パネルから応答を取得できるようにパネルに動的にデータを入力する方法がわかりません (選択した会社の ID など)。
また、JavaScript を回避しようとしており、これを「純粋な」aspx/コード ビハインド ソリューションにしたいと考えています (特に単純化のため)。
私が見つけたすべての例は、パネルが事前定義されたモーダルポップアップです。それ (ポップアップ パネル) がチェックボックスのリストのようなものであったとしても、SortedList にデータ バインドすることができ、OK/キャンセル ボタンの組み合わせを受け入れたり無視したりすることができます。何がどこにあるのかわからないだけです。
私は提案を受け入れます。前もって感謝します。
編集:最終的な解決策は次のようになります。
<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 は、GridView にバインドされているデータ行の汎用リスト (Company は、ビジネス オブジェクトでもあるプロパティの 1 つです) です。
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