none
「該当データなし」のメッセージボックスの出し方 RRS feed

  • 質問

  • VBを使ってASP.Netのアプリケーションを作っています。データベースはSQLServer2005Expressを使用しています。

    アプリケーションはユーザーがIDを検索テキストボックスに入力し、検索ボタンをクリックすると結果をDetailViewで出力するという簡単なプログラムです。

    そこで質問です。

    検索データ(ID)がデータベースにない場合に”該当データが見つかりません”のメッセージボックスを出力したいのですが、どうすればできますか?

    下のリンクが質問のサンプルです。

    http://www.lybonet.com/questions/

    下記がコードです。初心者なので何処にどのようなコードを書けばよいのか具体的にアドバイス頂ければ非常に助かります。

    宜しくお願いします。

    lyplus

    -----------------------------------------------------------------------------------

    <%@ Page Language="VB" %>

        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

        <script runat="server">

            Protected Sub search_Click(ByVal sender As Object, ByVal e As System.EventArgs)

            
            End Sub

        </script>

        <html xmlns="http://www.w3.org/1999/xhtml" >
        <head runat="server">
            <title>Untitled Page</title>
        </head>
        <body>
        <form id="form2" runat="server">
            <div>
                &nbsp;
                <asp:Label ID="Label1" runat="server" Style="z-index: 100; left: 120px; position: absolute;
                    top: 89px" Text="ID" Width="28px"></asp:Label>
                <asp:TextBox ID="ID" runat="server" Style="z-index: 101; left: 166px; position: absolute;
                    top: 91px"></asp:TextBox>

                <asp:Button ID="search" runat="server" Style="z-index: 102; left: 147px; position: absolute;
                    top: 134px" Text="search" OnClick="search_Click" />

                <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataSourceID="SqlDataSource1"
                    Height="50px" Style="z-index: 104; left: 119px; position: absolute; top: 185px"
                    Width="125px">

                    <Fields>
                        <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" />
                        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                    </Fields>
                </asp:DetailsView>

                <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DatabaseConnectionString1 %>"
                    SelectCommand="SELECT * FROM [Table1] WHERE ([ID] = @ID)">

                    <SelectParameters>
                        <asp:ControlParameter ControlID="ID" Name="ID" PropertyName="Text" Type="String" />
                    </SelectParameters>
                </asp:SqlDataSource>
           
            </div>
            </form>

        </body>
        </html>

    2006年10月17日 13:04

回答

  • 条件の切り分け方が間違ってるからでしょうね。
    最初にGridViewを見えないようにしたあと、PostBackが起きたときに見えるようにしてないですから。
    一番最初の表示のときはデータがないことはわかりきってますから、以下で十分じゃないですか。

    If IsPostBack = False Then

    GridView1.Visible = False

    Else

    GridView1.Visible = True

    End If

     

    2006年10月18日 16:40
  • IsPostBackで判断すると簡単で良いですね。

    Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
     If e.Row.RowType = DataControlRowType.EmptyDataRow Then
       If IsPostBack Then
         e.Row.Cells(0).Text = "無しです。"
       Else
         e.Row.Cells(0).Text = "検索して下さい。"
       End If
     End If
    End Sub

    ちなみに、Visible制御であれば、以下の一行のようにも書けますね。

    GridView1.Visible = IsPostBack

    2006年10月19日 6:02
    モデレータ

すべての返信

  • DetailsViewのEmptyDataTextかEmptyDataTemplateでメッセージを表示するというのではダメなのでしょうか。

     

    2006年10月17日 13:46
  • どっとねっとふぁん様

    早速の返答ありがとうございます。

    EmptyDataTextかEmptyDataTemplateでメッセージを表示できる機能があるんですか?

    知りませんでした。ちょっと調べてみます。

    lypus

     

    2006年10月17日 14:05
  •  

    EmptyDataTemplateを使って出来ました。

    ただページが最初にロードした時に”該当データなし”のEmptyDataTemplateが表示されてしまいます。

    どうすればこれを回避できますでしょうか?

    lyplus

     

    2006年10月17日 15:07
  • どのように回避したいのか、つまり、どのように動作すれば良いのでしょうか?
    それによって、いろいろな方法が考えられます。
    2006年10月18日 7:52
    モデレータ
  • trapemiya様

    説明不足ですいません。

    EmptyDataTemplateに”該当データがありません”というメッセージを入力しました。

    ユーザーがデータベースにないIDを検索してこのメッセージが出るのは良いのですが、
    問題は、ぺージが最初にロードした時にこのメッセージが表示してしまいます。

    どうしたらこのメッセージがページが最初にロードした時に表示しないようにできるでしょうか?
    つまり、ユーザーがデータベースにないIDを検索した時だけこのメッセージが出るようにしたいのです。

    下記が質問のサンプルです
    http://www.lybonet.com/questions/Default1.aspx

    よろしくお願いします。

    lypus


     

    2006年10月18日 10:27
  • 例えば、ページを初めて開いた時は、SqlDataSource1.SelectCommandは空だとして、検索時にここにSQL文をセットするとしたら、以下の感じでメッセージを切り替えることができます。あくまで一例ですが、メッセージの切り替え方法は以下のようにしてできるので、あとはいろいろ工夫してみて下さい。

        protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)

        {

            if (e.Row.RowType == DataControlRowType.EmptyDataRow)

            {

                if (SqlDataSource1.SelectCommand == string.Empty)

                {

                    e.Row.Cells[0].Text = "検索して下さい。";

                }

                else

                {

                    e.Row.Cells[0].Text = "無しです。";

                }

            }

        }

    2006年10月18日 10:46
    モデレータ
  • trapemiya 様

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

    上記のコードをVBに置き換えて色々試してみたのですが、ダメでした。(私の知識不足だと思います)

    PostBackを利用すればもしかして簡単に出来るかなぁと思って下記のコードを作って試してみたのですが、GridViewが完全に消えてしまってダメでした。

    何が悪いのでしょうか?

    ---------------------------------------------------------------------------------------------------------------------

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

    If IsPostBack = False Then

    If GridView1.Rows.Count = 0 Then

    GridView1.Visible = False

    Else

    GridView1.Visible = True

    End If

    End If

    End Sub

     

    2006年10月18日 16:22
  • 条件の切り分け方が間違ってるからでしょうね。
    最初にGridViewを見えないようにしたあと、PostBackが起きたときに見えるようにしてないですから。
    一番最初の表示のときはデータがないことはわかりきってますから、以下で十分じゃないですか。

    If IsPostBack = False Then

    GridView1.Visible = False

    Else

    GridView1.Visible = True

    End If

     

    2006年10月18日 16:40
  • どっとねっとふぁん様

    ありがとうごさいます。

    で、で、出来ました。本当に上記のコードだけで十分でした。

    これで今夜はゆっくり眠れます。

    本当にありがとうございました。大変助かりました。

    lyplus

    2006年10月18日 17:51
  • IsPostBackで判断すると簡単で良いですね。

    Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
     If e.Row.RowType = DataControlRowType.EmptyDataRow Then
       If IsPostBack Then
         e.Row.Cells(0).Text = "無しです。"
       Else
         e.Row.Cells(0).Text = "検索して下さい。"
       End If
     End If
    End Sub

    ちなみに、Visible制御であれば、以下の一行のようにも書けますね。

    GridView1.Visible = IsPostBack

    2006年10月19日 6:02
    モデレータ
  • trapemiya 様

    VBにコードを書き換えて下さってありがとうございます。

    早速試してみます。

    色々アドバイスを頂けて、本当に助かりました。

    ありがとうございます。

    lyplus

    2006年10月19日 16:55