none
ListViewの中にネストされたListViewの中の追加時の検証チェックを分けたい RRS feed

  • 質問

  • いつもお世話になっております。

    ListViewの中にネストしてListViewコントロールを配置しております。子ListViewの追加機能のテキストボックス部分にバリデーションコントロールを配置しているのですが、親で子のListViewを作成すると、子のすべての追加機能のバリデーションのグループが同じになってしまうため、すべての子ListViewのバリデーション反応してしまいます。これを回避する方法があるのでしょうか。

    どうぞよろしくお願い申し上げます。

    2013年6月10日 9:45

回答

すべての返信

  • 情報不足で何がどうなっているのかぜんぜん分かりません。問題を再現できる必要最小限(あくまでに必要最小限に)にコードを絞ってアップできませんか。
    2013年6月10日 12:38
  • 子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-net

    Problem with ValidationGroup in nested databound ListView
    http://forums.asp.net/t/1718470.aspx/1


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    2013年6月11日 0:29
    モデレータ
  • ご返信ありがとうございます。

    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日 7:58