トップ回答者
ListViewの中にネストされたListViewの中の追加時の検証チェックを分けたい

質問
回答
-
子ListViewのItemとして生成されるバリデーションコントロールのValidationGroupに、それぞれ違う値を割り当てるしか無さそうな感じですね。以下の2つはそれぞれ違う考え方でこれを実現していますが、最初のstackoveflowの考え方が簡単だと思います。つまり、子ListViewのItemDataBound時にバリデーションコントロールを探し、あれば毎回違う値をValidationGroupに設定しています。
(参考)
Problem with ValidationGroup in nested ListView in ASP.NET
http://stackoverflow.com/questions/7344689/problem-with-validationgroup-in-nested-listview-in-asp-netProblem with ValidationGroup in nested databound ListView
http://forums.asp.net/t/1718470.aspx/1
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2013年6月11日 0:45 本文訂正
- 回答としてマーク ディープインパクト 2013年6月11日 7:58
すべての返信
-
子ListViewのItemとして生成されるバリデーションコントロールのValidationGroupに、それぞれ違う値を割り当てるしか無さそうな感じですね。以下の2つはそれぞれ違う考え方でこれを実現していますが、最初のstackoveflowの考え方が簡単だと思います。つまり、子ListViewのItemDataBound時にバリデーションコントロールを探し、あれば毎回違う値をValidationGroupに設定しています。
(参考)
Problem with ValidationGroup in nested ListView in ASP.NET
http://stackoverflow.com/questions/7344689/problem-with-validationgroup-in-nested-listview-in-asp-netProblem with ValidationGroup in nested databound ListView
http://forums.asp.net/t/1718470.aspx/1
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2013年6月11日 0:45 本文訂正
- 回答としてマーク ディープインパクト 2013年6月11日 7:58
-
ご返信ありがとうございます。
SurferOnWwwwさま、情報不足についてお詫び申し上げます。
最初はわかりやすいと思い画面をキャプチャーし、その中に説明書きをしたものを用意したのですが
私には画像を表示させる権利がないようでしたのでアップするのを断念しました。
簡略化したソースコードを提供するべきでした。誠に申し訳ございません。trapemiyaさま
ご教示ありがとうございます。
stackoveflowのほうを参考にいろいろ試行錯誤しましたら出来るようになりました。・親ListViewのItemDataBoundに記述
・子ListViewが存在する場合のみ処理を実施(親ListView自身のEdit時にも反応するため)
・子ListViewの追加ボタン右側に配置されるキャンセルボタンは廃止
親ListViewの編集ボタンを押したタイミングと子ListViewの追加ボタンを押したタイミングの両方で
当該イベントが動くため、反応の分岐を致しました。e.Item.ItemType で判断したかったのですが、
「編集時」という判定がなかったため、子ListViewが存在するかどうかで判断することにしました。
子ListViewは親ListViewのItemtemplate内にのみ存在しており、EditItemTemplate内には存在しないためです。また、子ListViewのInsertItemTemplate内に設置してあるキャンセルボタンがありましたが、
これを押されるとその行から上のバリデーショングループまでもリセットされるような動きになってしまったため
廃止しました。時間があるときにリセットを回避できる方法がないか取り組んでみたいと思います。大変ありがとうございました。感謝申し上げます。
Private Sub lvOya_ItemDataBound(sender As Object, e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles lvOya.ItemDataBound Dim vlGroup As String Dim lvKo As ListView = CType(e.Item.FindControl("lvKo"), ListView) If Not IsNothing(lvKo) Then Dim btnInsert As Button = CType(lvKo.InsertItem.FindControl("btnInsert"), Button) Dim rfvTxtName As RequiredFieldValidator = CType(lvKo.InsertItem.FindControl("rfvTxtName"), RequiredFieldValidator) vlGroup = "GroupC" & e.Item.DataItemIndex btnInsert.ValidationGroup = vlGroup rfvTxtName.ValidationGroup = vlGroup End If End Sub
<div id="busho" class="tbMargin"> <div>【部署/担当者】</div> <asp:ListView ID="lvOya" runat="server" DataSourceID="odsBusho" InsertItemPosition="LastItem" DataKeyNames="BushoID"> <EditItemTemplate> (----- 省略 -----) </EditItemTemplate> <EmptyDataTemplate> (----- 省略 -----) </EmptyDataTemplate> <InsertItemTemplate> (----- 省略 -----) </InsertItemTemplate> <ItemTemplate> <tr class="tpl_it"> <td> <asp:Button ID="btnDelete" runat="server" CommandName="Delete" Text="削除" /> </td> <td> <asp:Button ID="btnEdit" runat="server" CommandName="Edit" Text="編集" /> </td> <td class="txtLeft"> <asp:Label ID="lbBusho" runat="server" Text='<%# Eval("W_ShoruiBusho_ShoruiBushoName") %>' /> </td> </tr> <tr> <td colspan="3"> <!-- ネスト --> <asp:ListView ID="lvKo" runat="server" DataSourceID="odsCharge" InsertItemPosition="LastItem" DataKeyNames="ChargeID"> <EditItemTemplate> (----- 省略 -----) </EditItemTemplate> <AlternatingItemTemplate> (----- 省略 -----) </AlternatingItemTemplate> <EmptyDataTemplate> (----- 省略 -----) </EmptyDataTemplate> <InsertItemTemplate> <tr class="tpl_ins"> <td class="txtTop"> <asp:Button ID="btnInsertBushoCharge" runat="server" CommandName="Insert" Text="追加" ValidationGroup="GroupC" /> </td> <td class="txtTop hidden"> <asp:Button ID="btnCancelBushoCharge" runat="server" CommandName="Cancel" Text="消去" /> </td> <td class="txtTop"> <asp:TextBox ID="txtChargeName" runat="server" Text='<%# Bind("W_Charge_ChargeName") %>' MaxLength="20" CssClass="wid6" /><asp:RequiredFieldValidator ID="rfvTxtName" runat="server" ErrorMessage="必須" ValidationGroup="GroupC" ControlToValidate="txtChargeName" Display="Dynamic" CssClass="color1"></asp:RequiredFieldValidator> </td> </tr> </InsertItemTemplate> <ItemTemplate> (----- 省略 -----) </ItemTemplate> <LayoutTemplate> (----- 省略 -----) </LayoutTemplate> </asp:ListView> <!-- データソース --> <!-- 担当者 --> <asp:ObjectDataSource ID="odsCharge" runat="server" InsertMethod="InsertCharge" SelectMethod="GetCharge" DeleteMethod="DeleteCharge" UpdateMethod="UpdateCharge" TypeName="app.clsDb"> (----- 省略 -----) </asp:ObjectDataSource> <!-- データソースE --> <!-- ネストE --> </td> </tr> </ItemTemplate> <LayoutTemplate> (----- 省略 -----) </LayoutTemplate> </asp:ListView> </div>
trapemiyaさま
子ListViewのイベントで処理すというところを見落としておりました。親ListViewでやってしまいました。ネストされたコントロールのイベントはどうやって処理できるのか(記述できるのか)といったところから調べていきたいと思います。ありがとうございました。
- 編集済み ディープインパクト 2013年6月11日 8:47 追記