質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.33%

ASP.NET ListView(挿入)のテキストボックスの中身をチェックしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 638

pinamon

score 5

前提・実現したいこと

ASP.NET C#でListViewとNorthWind(テーブル:Region)を用いてテーブルの内容を表示し、削除・編集・挿入できるプログラムを作成しています。検証コントロールは使用していません。
テーブルの表示、削除、編集、挿入の実装ができ、それぞれのコマンドを実装する前にメッセージを表示することができました。ですが、挿入のときに、テキストボックスの中身が空だとエラーが発生(error:NULLを挿入できません)しました。
これを、テキストボックスの中身が空のときにエラーをキャッチし、メッセージを表示する方法が分かりません。

なお、削除、編集、挿入は、ListViewのスマートタグから設置しています。

試したこと

以下のようにif文を記述したところ、ClientScript~のところで「到達できないコードが検出されました」と出てしまいました。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default2.aspx.cs" Inherits="****" %>

<!DOCTYPE html>

<html xmlns="****">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            ASP.NET Do-It-Yourself</div>
        <hr/>
        <asp:ListView ID="ListView1" runat="server" DataKeyNames="RegionID" DataSourceID="SqlDataSource1" InsertItemPosition="LastItem">
            <AlternatingItemTemplate>
                <tr style="background-color: #FFFFFF;color: #284775;">
                    <td>
                        <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="削除"/>
                        <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="編集" />
                    </td>
                    <td>
                        <asp:Label ID="RegionIDLabel" runat="server" Text='<%# Eval("RegionID") %>' />
                    </td>
                    <td>
                        <asp:Label ID="RegionDescriptionLabel" runat="server" Text='<%# Eval("RegionDescription") %>' />
                    </td>
                </tr>
            </AlternatingItemTemplate>
            <EditItemTemplate>
                <tr style="background-color: #999999;">
                    <td>
                        <asp:Button ID="UpdateButton" runat="server" CommandName="Update" Text="更新" OnClientClick="return confirm('更新しますか?')"/>
                        <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="キャンセル" />
                    </td>
                    <td>
                        <asp:Label ID="RegionIDLabel1" runat="server" Text='<%# Eval("RegionID") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="RegionDescriptionTextBox" runat="server" Text='<%# Bind("RegionDescription") %>' />
                    </td>
                </tr>
            </EditItemTemplate>
            <EmptyDataTemplate>
                <table runat="server" style="background-color: #FFFFFF;border-collapse: collapse;border-color: #999999;border-style:none;border-width:1px;">
                    <tr>
                        <td>データは返されませんでした。</td>
                    </tr>
                </table>
            </EmptyDataTemplate>
            <InsertItemTemplate>
                <tr style="">
                    <td>
                        <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="挿入" OnClientClick="return confirm('挿入しますか?')"/>
                        <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="クリア" OnClientClick="return confirm('クリアしますか?')"/>
                    <%if ("RegionIDTextBox" == "")  
                        {
                            ClientScript.RegisterClientScriptBlock(this.GetType(), "key", "alert('入力されていません。');", true);
                            return;
                        }
                    %>

                    </td>
                    <td>
                        <asp:TextBox ID="RegionIDTextBox" runat="server" Text='<%# Bind("RegionID") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="RegionDescriptionTextBox" runat="server" Text='<%# Bind("RegionDescription") %>' />
                    </td>
                </tr>
            </InsertItemTemplate>
            <ItemTemplate>
                <tr style="background-color: #E0FFFF;color: #333333;">
                    <td>
                        <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="削除" OnClientClick="return confirm('削除しますか?')"/>
                        <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="編集" />
                    </td>
                    <td>
                        <asp:Label ID="RegionIDLabel" runat="server" Text='<%# Eval("RegionID") %>' />
                    </td>
                    <td>
                        <asp:Label ID="RegionDescriptionLabel" runat="server" Text='<%# Eval("RegionDescription") %>' />
                    </td>
                </tr>
            </ItemTemplate>
            <LayoutTemplate>
                <table runat="server">
                    <tr runat="server">
                        <td runat="server">
                            <table id="itemPlaceholderContainer" runat="server" border="1" style="background-color: #FFFFFF;border-collapse: collapse;border-color: #999999;border-style:none;border-width:1px;font-family: Verdana, Arial, Helvetica, sans-serif;">
                                <tr runat="server" style="background-color: #E0FFFF;color: #333333;">
                                    <th runat="server"></th>
                                    <th runat="server">RegionID</th>
                                    <th runat="server">RegionDescription</th>
                                </tr>
                                <tr id="itemPlaceholder" runat="server">
                                </tr>
                            </table>
                        </td>
                    </tr>
                    <tr runat="server">
                        <td runat="server" style="text-align: center;background-color: #5D7B9D;font-family: Verdana, Arial, Helvetica, sans-serif;color: #FFFFFF">
                            <asp:DataPager ID="DataPager1" runat="server">
                                <Fields>
                                    <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="True" ShowLastPageButton="True" />
                                </Fields>
                            </asp:DataPager>
                        </td>
                    </tr>
                </table>
            </LayoutTemplate>
            <SelectedItemTemplate>
                <tr style="background-color: #E2DED6;font-weight: bold;color: #333333;">
                    <td>
                        <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="削除"/>
                        <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="編集" />
                    </td>
                    <td>
                        <asp:Label ID="RegionIDLabel" runat="server" Text='<%# Eval("RegionID") %>' />
                    </td>
                    <td>
                        <asp:Label ID="RegionDescriptionLabel" runat="server" Text='<%# Eval("RegionDescription") %>' />
                    </td>
                </tr>
            </SelectedItemTemplate>
        </asp:ListView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString1 %>" DeleteCommand="DELETE FROM [Region] WHERE [RegionID] = @RegionID" InsertCommand="INSERT INTO [Region] ([RegionID], [RegionDescription]) VALUES (@RegionID, @RegionDescription)" ProviderName="<%$ ConnectionStrings:NorthwindConnectionString1.ProviderName %>" SelectCommand="SELECT [RegionID], [RegionDescription] FROM [Region]" UpdateCommand="UPDATE [Region] SET [RegionDescription] = @RegionDescription WHERE [RegionID] = @RegionID">
            <DeleteParameters>
                <asp:Parameter Name="RegionID" Type="Int32" />
            </DeleteParameters>
            <InsertParameters>
                <asp:Parameter Name="RegionID" Type="Int32" />
                <asp:Parameter Name="RegionDescription" Type="String" />
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="RegionDescription" Type="String" />
                <asp:Parameter Name="RegionID" Type="Int32" />
            </UpdateParameters>
        </asp:SqlDataSource>
    </form>
</body>
</html>

補足情報(FW/ツールのバージョンなど)

SQLserver ASP.NET、C#、Visual Studio2019(16.6.2)、Northwind(テーブル:Region)
.NET Framework(4.8) sqlDataSource

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2020/06/17 08:55

    検証コントロールは使ってないとのことですが、それを使う案は質問者さんにとって受け入れられないと言うわけではないですよね?

    検証コントロールを使う案を回答に書こうと思ってますが、何か訳があって受け入れられないと言うことですとむだになるのでお聞きしてます。

    キャンセル

  • pinamon

    2020/06/17 09:04

    検証コントロールというものをこのコメントで初めて知りました。そういったものがあるのですね。受け入れられないものではありません。
    現在、MicrosoftのDoItYourselfを使用して研修中だったもので、これからそのコントロールが出てくるのか出てこないのか…いずれにしても、検証コントロールというものを調べてみたいと思います。ありがとうございます。

    キャンセル

  • pinamon

    2020/06/17 09:30

    申し訳ありません。検証コントロールのControlToValidateに入力する検証先のIDは、ListVewの挿入のためのテキストボックスの場合どのようにしたらよいのでしょうか?

    キャンセル

回答 1

checkベストアンサー

0

検証コントロールを使う案を書きます。ユーザー入力の検証は必須なので必ず検証コントロールを使ってサーバー側でも検証を行うことをお勧めします。

ASP.NET Web Forms アプリに標準で用意されている検証コントロールを使えば、クライアント側での JavaScript / jQuery による検証と、サーバー側での検証の両方が有効になります。

今回の課題「INSERT 時に空白の場合はクライアント側のスクリプトでエラーメッセージを出したい」については RequiredFieldValidator を利用できます。

ツールボックスから RequiredFieldValidator を対象の TextBox の下にドラグ&ドロップして、ControlToValidate プロパティを検証対象の TextBox の ID に設定します。ソース画面で行うのが簡単です。以下の画像を見てください。

イメージ説明

そのうえでアプリを実行して TextBox が空白のまま[挿入]ボタンをクリックするとクライアント側で検証がかかって下の画像のように ErrorMessage プロパティに設定したメッセージが表示されます(画像はデフォルトのままです。もちろん変更可能です)

イメージ説明

上記画像の例はクライアント側での検証が NG となった場合です。その場合[挿入]ボタンによるポストバックはキャンセルされます。

検証コントロールにはいろいろ種類があって、その使い方は深い話になるのですが、とりあえず今回はこのスレッドの課題の対応のみレスします。勉強してみてください。

【追記】

一つ大事なことを書くのを忘れてました。

ASP.NET 4.5 以降、クライアントスクリプトを利用するサーバーコントロールが正しく機能するには、必要なクライアントスクリプトの ScriptManager への登録と、全ページでの ScriptManager の配置が必要です。詳しくは以下の記事を見てください。

ASP.NET 4.5 ScriptManager
http://surferonwww.info/BlogEngine/post/2018/04/23/aspnet-45-scriptmanager.aspx

Visual Studio 2019 の「Web Forms」テンプレートを利用して ASP.NET Web フォームアプリケーションを作成した場合、マスターページを使えばその設定がされた ScriptManager が利用できますので、そうすることをお勧めします。

マスターページを使わない場合、「空」のテンプレートでプロジェクトを作った場合は自力で対応することになります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/17 10:51

    大変参考になりました。
    URL先、また自分でも調べながら勉強していきたいと思います。
    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る