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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

3035閲覧

ASP.NETのListViewに最初から文字を入力しておきたい。

tamata

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2020/08/31 09:34

編集2020/09/02 07:01

前提・実現したいこと

こちらのページを開いた際にTimeTextBoxに現在時刻を表示させておき、そのまま挿入したいのですが、どのようにすればいいのか分かりません。

該当のソースコード

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Bord.aspx.cs" Inherits="Bord.Bord" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <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:ListView ID="List1" runat="server" DataKeyNames="Time" DataSourceID="DB1" InsertItemPosition="LastItem" OnSelectedIndexChanged="List1_SelectedIndexChanged"> <AlternatingItemTemplate> <tr style=""> <td> <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="削除" /> <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="編集" /> </td> <td> <asp:Label ID="UserNameLabel" runat="server" Text='<%# Eval("UserName") %>' /> </td> <td> <asp:Label ID="TitleLabel" runat="server" Text='<%# Eval("Title") %>' /> </td> <td> <asp:Label ID="TextLabel" runat="server" Text='<%# Eval("Text") %>' /> </td> <td> <asp:Label ID="TimeLabel" runat="server" Text='<%# Eval("Time") %>' /> </td> </tr> </AlternatingItemTemplate> <EditItemTemplate> <tr style=""> <td> <asp:Button ID="UpdateButton" runat="server" CommandName="Update" Text="更新" /> <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="キャンセル" /> </td> <td> <asp:TextBox ID="UserNameTextBox" runat="server" Text='<%# Bind("UserName") %>' /> </td> <td> <asp:TextBox ID="TitleTextBox" runat="server" Text='<%# Bind("Title") %>' /> </td> <td> <asp:TextBox ID="TextTextBox" runat="server" Text='<%# Bind("Text") %>' /> </td> <td> <asp:Label ID="TimeLabel1" runat="server" Text='<%# Eval("Time") %>' /> </td> </tr> </EditItemTemplate> <EmptyDataTemplate> <table runat="server" style=""> <tr> <td>データは返されませんでした。</td> </tr> </table> </EmptyDataTemplate> <InsertItemTemplate> <tr style=""> <td> <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="挿入" /> <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="クリア" /> </td> <td> <asp:TextBox ID="UserNameTextBox" runat="server" Text='<%# Bind("UserName") %>' /> </td> <td> <asp:TextBox ID="TitleTextBox" runat="server" Text='<%# Bind("Title") %>' /> </td> <td> <asp:TextBox ID="TextTextBox" runat="server" Text='<%# Bind("Text") %>' /> </td> <td> <asp:TextBox ID="TimeTextBox" runat="server" Text='<%# Bind("Time") %>' /> </td> </tr> </InsertItemTemplate> <ItemTemplate> <tr style=""> <td> <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="削除" /> <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="編集" /> </td> <td> <asp:Label ID="UserNameLabel" runat="server" Text='<%# Eval("UserName") %>' /> </td> <td> <asp:Label ID="TitleLabel" runat="server" Text='<%# Eval("Title") %>' /> </td> <td> <asp:Label ID="TextLabel" runat="server" Text='<%# Eval("Text") %>' /> </td> <td> <asp:Label ID="TimeLabel" runat="server" Text='<%# Eval("Time") %>' /> </td> </tr> </ItemTemplate> <LayoutTemplate> <table runat="server"> <tr runat="server"> <td runat="server"> <table id="itemPlaceholderContainer" runat="server" border="0" style=""> <tr runat="server" style=""> <th runat="server"></th> <th runat="server">UserName</th> <th runat="server">Title</th> <th runat="server">Text</th> <th runat="server">Time</th> </tr> <tr id="itemPlaceholder" runat="server"> </tr> </table> </td> </tr> <tr runat="server"> <td runat="server" style=""> </td> </tr> </table> </LayoutTemplate> <SelectedItemTemplate> <tr style=""> <td> <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="削除" /> <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="編集" /> </td> <td> <asp:Label ID="UserNameLabel" runat="server" Text='<%# Eval("UserName") %>' /> </td> <td> <asp:Label ID="TitleLabel" runat="server" Text='<%# Eval("Title") %>' /> </td> <td> <asp:Label ID="TextLabel" runat="server" Text='<%# Eval("Text") %>' /> </td> <td> <asp:Label ID="TimeLabel" runat="server" Text='<%# Eval("Time") %>' /> </td> </tr> </SelectedItemTemplate> </asp:ListView> <asp:SqlDataSource ID="DB1" runat="server" ConnectionString='<%$ ConnectionStrings:DefaultConnection %>' SelectCommand="SELECT * FROM [BordDB]" DeleteCommand="DELETE FROM [BordDB] WHERE [Time] = @Time" InsertCommand="INSERT INTO [BordDB] ([UserName], [Title], [Text], [Time]) VALUES (@UserName, @Title, @Text, @Time)" UpdateCommand="UPDATE [BordDB] SET [UserName] = @UserName, [Title] = @Title, [Text] = @Text WHERE [Time] = @Time"> <DeleteParameters> <asp:Parameter Name="Time" Type="String" /> </DeleteParameters> <InsertParameters> <asp:Parameter Name="UserName" Type="String" /> <asp:Parameter Name="Title" Type="String" /> <asp:Parameter Name="Text" Type="String" /> <asp:Parameter Name="Time" Type="String" /> </InsertParameters> <UpdateParameters> <asp:Parameter Name="UserName" Type="String" /> <asp:Parameter Name="Title" Type="String" /> <asp:Parameter Name="Text" Type="String" /> <asp:Parameter Name="Time" Type="String" /> </UpdateParameters> </asp:SqlDataSource> </div> </form> </body> </html>

試したこと

InsertItemTemplateのTimeTextBoxの箇所をこのように変更
<asp:TextBox ID="TimeTextBox" runat="server" Text='<%# DateTime.Now.ToString() %>' />
してみましたが、挿入時にNULLになるようでエラー画面が表示されます。
イメージ説明

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

webフォーム
.NET Framework 4.8
Windows10
Visual Studio 2019 コミュニティ

完成予想画面
イメージ説明

解決案を試した結果
イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/31 10:06 編集

開発環境(OS, .NET Framework, Visual Studio のバージョンなど)を書いてください。 > こちらのページを開いた際にTimeTextBoxに現在時刻を表示させておき 「現在時刻」というのはどの時点のものなのですか? どのように取得してどのように表示したいのですか? 表示するのは必須なんですか? 表示などしないで、黙って INSERT 操作をした時点での DateTime.Now を取得して INSERT するのでは要件を満たさないのですか?
tamata

2020/08/31 10:07

情報追加いたしました。 現在時刻はこちらのページを開いたときのものです。 どのように取得しては分からないのですが、Timeのテキストボックスに自動で入力させておきたいです。
退会済みユーザー

退会済みユーザー

2020/08/31 10:17

.NET Framework のバージョンを書いてください。 表示するのは必須なんですか? 表示などしないで、黙って INSERT 操作をした時点での DateTime.Now を取得して INSERT するのでは要件を満たさないのですか?
tamata

2020/08/31 10:37

バージョンについて記載いたしました。 はい。追記した完成予想画面のような状態にしたいのですが難しいでしょうか?
退会済みユーザー

退会済みユーザー

2020/08/31 10:47

Text='<%# DateTime.Now.ToString() %>' として「完成予想画面」のように表示されたにもかかわらず「挿入時にNULLになる」のですよね? その理由が分かりませんが、そこが何故か調べて解決できないとどうしようもないかと・・・ SqlDataSource のイベントで実際にどうなっているか調べるなどできませんか?
tamata

2020/08/31 11:00

はい。入力欄に時間表示はされるのですが、挿入時に記載したエラー画面になってしまいます。 >SqlDataSource のイベントで実際にどうなっているか調べるなどできませんか? 大変申し訳ないのですが、どのようにして調べるのか教えてください。 上記のソースコードにブレークポイントを追加することはできませんでした。
tamata

2020/08/31 11:35

何度も読みましたが、いまいち調べ方が分かりません。 申し訳ありません。
退会済みユーザー

退会済みユーザー

2020/08/31 12:00 編集

テキストボックスが未入力の場合、DB の当該フィールドには NULL が INSERT されるのがデフォルトの動きで、DB の当該フィールドが NULL 不可なので SqlException がスローされたということがエラーメッセージから想像できることです。 見かけテキストボックスには値が入っているようですが、ボタンクリックでポストバックされた際、サーバーには何が送信されたのか、どこでどう NULL に変わってしまうのか調べないと話がはじまりません。 それを調べてください。 下流から調べるなら、上のコメントで書いたように、SqlDataSource の Inserting イベントのハンドラで調べてください。 上流から調べるなら、Fiddler などのキャプチャツールを使ってブラウザからサーバーに何が送信されているか調べてください。 それが簡単にできるのは質問者さんだけです。調べることさえできないということなら諦めざるを得ないかと思います。
退会済みユーザー

退会済みユーザー

2020/09/01 01:24 編集

上のコメントで「ボタンクリックでポストバックされた際、サーバーには何が送信されたのか、どこでどう NULL に変わってしまうのか調べないと話がはじまりません」と書きましたが、調べた結果はどうだったのでしょうか? 上流のブラウザからサーバーへの送信では期待通りデータが渡されているが、下流の SqlDataSource の Inserting イベントのハンドラで調べたら DBNull.Value が渡されていたという結果になると想像してますが・・・ その想像ベースで、後で回答欄に解決策(案)を書いておきます。想像が違っていたら、バイリターンで連絡ください。
退会済みユーザー

退会済みユーザー

2020/09/02 00:35

質問者さん、無言になってしまいましたが、回答したのでそれに対するフィードバックを回答のコメント欄に書いてください。役に立った/立たなかったぐらいはすぐにでも返事できるのでは? 役に立たなかったなら、何が期待する答えと違ったかを書いてもらえると、別の回答が出せるかもしれません。とにかく無言は NG です。
tamata

2020/09/02 06:50

お返事が遅くなり申し訳ないです。 また、初心者のため調べるのが難しく困っていたところ、解決案を提示していただき感謝しております。 教えていただいたソースコードを.csファイルに書きましたが、NULLが挿入されるようです。
退会済みユーザー

退会済みユーザー

2020/09/02 07:29 編集

回答のコメント欄に書いてください。 その際、どういうコードを書いたのか、NULL が挿入されるというのはどのようにしてどこを見てそう判断したのかできるだけ詳しく書いてください。
guest

回答1

0

ベストアンサー

上のコメントで「上流のブラウザからサーバーへの送信では期待通りデータが渡されているが、下流の SqlDataSource の Inserting イベントのハンドラで調べたら DBNull.Value が渡されていたという結果になると想像してます」と書きましたが、その想像ベースで回答を解決案を書いておきます。

問題部分だけを絞って状況を書くと以下のようなことだと理解しています。

最初にページを作ったときには ListView の InsertItemTemplate の問題のコードは、質問の「該当のソースコード」にある、

<asp:TextBox ID="TimeTextBox" runat="server" Text='<%# Bind("Time") %>' />

となっていた。初期画面では当該テキストボックスは空白で、それに正しい形式で日時を入力して[挿入]ボタンをクリックすると DB には結果が期待通り反映されていた。

そこから、「ページを開いた際にTimeTextBoxに現在時刻を表示」ということを行うために、上のコードを以下のように書き換えた。

<asp:TextBox ID="TimeTextBox" runat="server" Text='<%# DateTime.Now.ToString() %>' />

テキストボックスには日時が表示されるが、[挿入]ボタンをクリックすると質問に書いてある「NULL は Time 列に INSERT できない」という SqlException がスローされる。

何故そうなっかたと言うと、データバインド式 <%# Bind("Time") %> が無くなってしまったので、ListView から SqlDataSource に TextBox.Text プロパティの値を渡すことができず、結果、SQL Server には NULL を INSERT しようとしたが当該フィールドは NULL 不可でエラーになったということだと思います。

(注: データバインド式で Bind を使用すると、テキストボックスの値を抽出して、挿入モードでは Values コレクション経由で SqlDataSource に値を渡します)

解決策(案)は以下が考えられます。

(1) 元の通り Text='<%# Bind("Time") %>' としておき、「ページを開いた際にTimeTextBoxに現在時刻を表示」は、

(1-1) サーバー側で当該 TextBox を探し、その Text に DateTime.Now.ToString() を代入する。

(1-2) JavaScript を使ってページ内の当該 TextBox を探し、それの value にクライアント側で JavaScript で取得した現在日時を設定する。

(2) Text='<%# DateTime.Now.ToString() %>' とするのであれば、ListView の ItemInserting イベントまたは SqlDataSource の Inserting イベントのハンドラで当該 TextBox の Text プロパティからデータを取得して、前者なら Values コレクションに、後者なら SqlCommand のパラメータに渡す。

上記の内では (1-1) が簡単だと思います。(取得できるのはサーバーの時間(サーバーが米国にあったりすると米国の時間)というのが問題かもしれませんが、質問のコードも同じことになりますし・・・)

どのようにするかというと、まず、Text プロパティの設定を元に戻して Text='<%# Bind("Time") %>' にしてください。

「サーバー側で当該 TextBox を探し」というのは ListView の ItemCreated イベントのハンドラで ListViewItem が InsertItem の時、ListViewItem の中から FindControl メソッドで当該 TextBox オブジェクトへの参照を取得できます。

当該 TextBox の ID が "DateTextBox" の場合、以下のようにして当該 TextBox に「現在時刻を表示」をでき、[挿入]ボタンクリックで期待通り DB に INSERT されるはずです。

protected void ListView1_ItemCreated(object sender, ListViewItemEventArgs e) { if (e.Item.ItemType == ListViewItemType.InsertItem) { TextBox tb = (TextBox)e.Item.FindControl("DateTextBox"); if (tb != null) { tb.Text = DateTime.Now.ToString(); } } }

投稿2020/09/01 03:15

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tamata

2020/09/02 08:01

教えていただいたコードのままとListView1をList1に変更したもの2種類試しました。 どこか変更するべきだったのでしょうか…? 初心者のため何も分からずすみません。 NULLが挿入されたと判断した理由は情報追加した「解決案を試した結果」画像のようになったためです。
退会済みユーザー

退会済みユーザー

2020/09/02 08:09 編集

ひょっとして上の回答に書いたコードを .asp.cs にコピペしただけとか? それではもちろんダメですよ。 .aspx の ListView に OnItemCreated="ListView1_ItemCreated" というような設定はありますか? "DateTextBox" は質問者さんのケースに合わせて書き換えないとダメですよ。
tamata

2020/09/02 08:35

ありがとうございます。 仰る通りにしたら完成予想画面の通りになりました。 丁寧に対応していただき本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問