none
GridViewでのRequiredFieldValidatorの使用方法について RRS feed

  • 質問

  • GridViewのTemplateFieldに配置しているTextBoxに対して検証を行いたいと思ってます。

    TemlateFieldにはLinkButtonも配置しており、LinkButtonが押されるとTextBoxの検証を行うようにしたいです。

    そこで、TexBoxに対してRequiredFieldValidatorを設定しました。

    しかし、LinkButtonを押すと検証を行いたい行だけではなく、すべての行に対して検証が行われてしまいます。

    このため、このようなやり方が正しいのかわかりませんが、以下のようにRowCreatedでTextBoxのIDを各行ごとに変更し、
    RequiredFieldValidatorのControlToValidateを変更したIDに設定しました。

    しかし、「ControlToValidateプロパティで参照されたコントロール IDが見つかりません。」とエラーになってしまします。

    Protected Sub GridView_RowCreated(...) Handles GridView.RowCreated
        If e.Row.RowType = DataControlRowType.DataRow Then
            Dim text As TextBox = CType(e.Row.FindControl("TextBox"), TextBox)
            text.ID = text.ID + e.Row.RowIndex.ToString()
            Dim validator As RequiredFieldValidator = CType(e.Row.FindControl("RequiredFieldValidator"), RequiredFieldValidator)
            validator.ControlToValidate = text.ID
        End If
    End Sub

    LinkButtonが押された行に対してのみ検証を行いたいのですが、どのようにすれば良いのでしょうか?

    ご教示をお願いします。

    2009年11月6日 0:54

回答

  • > GridViewのTemplateFieldに配置しているTextBoxに対して検証を行いたいと思ってます。
    > TemlateFieldにはLinkButtonも配置しており、LinkButtonが押されるとTextBoxの検証を行うようにしたいです。
    > そこで、TexBoxに対してRequiredFieldValidatorを設定しました。
    > しかし、と検証を行いたい行だけではなく、すべての行に対して検証が行われてしまいます。

    「LinkButtonを押す」ということはポストバックがかかるということですので、その前にはすべての TextBox に入
    力は完了しているはずで、「すべての行に対して検証が行われ」るようにするのが当然だと思いますけど。

    なぜ、各行に配置した LinkButton で各行独自に検証を行う必要があるのでしょう? その必要が無ければ、ボタ
    ンは一つにして、それをクリックしたときにすべての行を一度に検証するようにすべきと思います。

    > LinkButtonが押された行に対してのみ検証を行いたいのですが、どのようにすれば良いのでしょうか?

    どうしてもそうする必要があるのなら、RequiredFieldValidator.ValidationGroup プロパティを使ってはいかがで
    すか? 詳しい使い方については、以下のページが参考になると思います。

    BaseValidator.ValidationGroup プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.basevalidator.validationgroup.aspx

    • 回答としてマーク kmirage 2009年11月9日 0:51
    2009年11月6日 13:35

すべての返信

  • > GridViewのTemplateFieldに配置しているTextBoxに対して検証を行いたいと思ってます。
    > TemlateFieldにはLinkButtonも配置しており、LinkButtonが押されるとTextBoxの検証を行うようにしたいです。
    > そこで、TexBoxに対してRequiredFieldValidatorを設定しました。
    > しかし、と検証を行いたい行だけではなく、すべての行に対して検証が行われてしまいます。

    「LinkButtonを押す」ということはポストバックがかかるということですので、その前にはすべての TextBox に入
    力は完了しているはずで、「すべての行に対して検証が行われ」るようにするのが当然だと思いますけど。

    なぜ、各行に配置した LinkButton で各行独自に検証を行う必要があるのでしょう? その必要が無ければ、ボタ
    ンは一つにして、それをクリックしたときにすべての行を一度に検証するようにすべきと思います。

    > LinkButtonが押された行に対してのみ検証を行いたいのですが、どのようにすれば良いのでしょうか?

    どうしてもそうする必要があるのなら、RequiredFieldValidator.ValidationGroup プロパティを使ってはいかがで
    すか? 詳しい使い方については、以下のページが参考になると思います。

    BaseValidator.ValidationGroup プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.basevalidator.validationgroup.aspx

    • 回答としてマーク kmirage 2009年11月9日 0:51
    2009年11月6日 13:35
  • SurferOnWwwさん:

    返信ありがとうございます。

    > 「LinkButtonを押す」ということはポストバックがかかるということですので、その前にはすべての TextBox に入
    > 力は完了しているはずで、「すべての行に対して検証が行われ」るようにするのが当然だと思いますけど。
    > なぜ、各行に配置した LinkButton で各行独自に検証を行う必要があるのでしょう? その必要が無ければ、ボタ
    > ンは一つにして、それをクリックしたときにすべての行を一度に検証するようにすべきと思います。

    なぜ各行独自で検証を行う必要があるのかといいますと、更新したい行は1行のみであり、一度に複数行を更新することがないからです。
    このため各行にLinkButtonを配置し、各行独自で検証を行うようにしています。
    このような場合は、FormViewを使用すれば良いと思うのですが、他の行も表示したいがためにGridViewを使用しています。
    他に良い方法があるのかもしれませんが、思いつかなかったため、このような方法を取っています。


    > どうしてもそうする必要があるのなら、RequiredFieldValidator.ValidationGroup プロパティを使ってはいかがで
    > すか? 詳しい使い方については、以下のページが参考になると思います。

    ValidationGroupを設定することでできました。
    ありがとうございました。

    2009年11月9日 0:51
  • > なぜ各行独自で検証を行う必要があるのかといいますと、更新したい行は1行のみであり、一度に複数行
    > を更新することがないからです。
    > このため各行にLinkButtonを配置し、各行独自で検証を行うようにしています。

    そうであれば、EditItemTemplate を設けて、そのなかに TextBox と RequiredFieldValidator を配置する
    というのではダメなんですか? 以下のような感じです。

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
        DataKeyNames="id" DataSourceID="SqlDataSource1">
        <Columns>
            <asp:CommandField ShowDeleteButton="True" ShowEditButton="True"
                ShowSelectButton="True" />
            <asp:TemplateField HeaderText="id" InsertVisible="False" SortExpression="id">
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("id") %>'></asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Eval("id") %>'></asp:Label>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="memo" SortExpression="memo">
                <ItemTemplate>
                    <asp:Label ID="Label4" runat="server" Text='<%# Bind("memo") %>'></asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("memo") %>'></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
                        ErrorMessage="RequiredFieldValidator" ControlToValidate="TextBox3"
                        Display="Dynamic">*</asp:RequiredFieldValidator>
                </EditItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

    2009年11月9日 13:59
  • SurferOnWwwさん:

    返信ありがとうございます。

    現状はItemTemplateにTextBox、RequiredFieldValidator、LinkButtonを配置して、
    LinkButtonの実行でUpdateQuaryが実行されるようにしています。

    動作的にはEditItemTemplateと同じだと思います。

    作成している時点ではEditItemTemplateを使用することを思いつきませんでした。

    EditItemTemplateに変更するか検討してみます。

    アドバイスありがとうございます。
    2009年11月10日 1:58
  • レスが遅くなりました。

    > 動作的にはEditItemTemplateと同じだと思います。

    動作は大幅に違います。

    例えば、先にアップしたコードでは、最初にロードしたときは全行 ItemTemplate でデータは Label に
    表示されますが、ある行の[編集」リンクボタンをクリックするとその行のみ EditItemTemplate に変わ
    って、データは TextBox に表示されます。

    一度試してみるとわかると思いますが・・・

    2009年11月14日 4:33