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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

ASP.NET

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

Q&A

解決済

1回答

67198閲覧

ASP.NETのチェックボックスの実装方法

kwmr8416

総合スコア6

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

ASP.NET

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

0グッド

0クリップ

投稿2020/09/01 08:39

編集2020/09/02 11:47

前提・実現したいこと

派遣会社のスタッフ情報などを管理するシステムを作っています。
アプリケーションはasp.net(C#)でデータベースはPostgreSQLです。開発経験が浅くわかりづらい表現があるかもしれませんがどうかよろしくお願いいたします。では本題です。
スタッフ情報の一覧画面ではGridViewを利用し、一覧から特定のスタッフを選択し単票のCRUD操作についてはFormViewから、データバインド式を利用しようと思っておりました。

発生している問題・エラーメッセージ

FormViewのInsertモードでのCheckBoxは実装できましたが、EditモードのCheckBoxが実装できません。編集画面を開くとvisual studioから該当するCheckBoxの記述箇所でエラーメッセージが出力され、
「指定されたキャストは有効ではありません。」と表示されます。

該当のソースコード

<EditItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Bind("xxxxxx")' /> </EditItemTemplate>

試したこと

当該列のデータ型を当初varchar(5)で定義し、TrueまたはFalseが格納されるようにしていました(実際アプリケーションから更新を行うとTrueまたはFalseが格納されます)。そこからBoolean型とBit型の変更を試し、アプリケーション側のasp:ParameterのType属性は初期値は既に挙がっているいずれの型もStringだったものをBoolean、Objectなどに変更しましたが、上記のエラーメッセージが出力されてしまいます。参考にした情報ではデータ定義に対して初期値、not nullの設定や、Bit型で定義するとあったんですが、SQLServerを利用したものが多くPostgreSQLによるデータバインド式の利用はあきらめてロジック側(asp.cs)で最初からデータの定義をしたほうが良いのか、悩んでおります。何卒よろしくお願いいたします。

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

visual studio 2017
PostgreSQL 12.2

追記(202009022027)

ご指摘ありがとうございます。再度コードを記載します。

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:sampleConnectionString %>" DeleteCommand="DELETE FROM staffsample WHERE sscd = ?" InsertCommand="INSERT INTO staffsample (stfnm, blood, sbt, knmnikin, knmyakin) VALUES (?, ?, ?, ?, ?)" ProviderName="<%$ ConnectionStrings:sampleConnectionString.ProviderName %>" SelectCommand="SELECT * FROM staffsample" UpdateCommand="UPDATE staffsample SET stfnm = ?, blood = ?, sbt = ?, knmnikin = ?, knmyakin = ? WHERE sscd = ?"> <DeleteParameters> <asp:Parameter Name="sscd" Type="Int32" /> </DeleteParameters> <InsertParameters> <asp:Parameter Name="stfnm" Type="String" /> <asp:Parameter Name="blood" Type="String" /> <asp:Parameter Name="sbt" Type="String" /> <asp:Parameter Name="knmnikin" Type="String" /> <asp:Parameter Name="knmyakin" Type="String" /> </InsertParameters> <UpdateParameters> <asp:Parameter Name="stfnm" Type="String" /> <asp:Parameter Name="blood" Type="String" /> <asp:Parameter Name="sbt" Type="String" /> <asp:Parameter Name="knmnikin" Type="String" /> <asp:Parameter Name="knmyakin" Type="String" /> <asp:Parameter Name="sscd" Type="Int32" /> </UpdateParameters> </asp:SqlDataSource> <br /> <asp:FormView ID="FormView1" runat="server" AllowPaging="True" DataSourceID="SqlDataSource1" DataKeyNames="sscd"> <EditItemTemplate> <p>■基本情報</p> <table> <tr> <td rowspan="3">氏名</td> <td>氏名</td> <td> <asp:TextBox ID="stfnmTB" runat="server" Text='<%# Bind("stfnm") %>' /> </td> </tr> <tr> <td>血液型</td> <td> <asp:DropDownList ID="bloodDDL" runat="server" SelectedValue='<%# Bind("blood") %>'> <asp:ListItem></asp:ListItem> <asp:ListItem>A型</asp:ListItem> <asp:ListItem>B型</asp:ListItem> <asp:ListItem>O型</asp:ListItem> <asp:ListItem>AB型</asp:ListItem> <asp:ListItem>不明</asp:ListItem> </asp:DropDownList> </td> </tr> <tr> <td>性別</td> <td> <asp:DropDownList ID="sbtDDL" runat="server" SelectedValue='<%# Bind("sbt") %>'> <asp:ListItem></asp:ListItem> <asp:ListItem Value="男">男性</asp:ListItem> <asp:ListItem Value="女">女性</asp:ListItem> </asp:DropDownList> </td> </tr> </table> <p>■勤務条件</p> <table> <tr> <td>希望時間</td> <td> <!--エラーが起きる箇所--> <asp:CheckBox ID="knmnikinCB" runat="server" Checked='<%# Bind("knmnikin") %>' /> 日勤   <br /> <asp:CheckBox ID="knmyakinCB" runat="server" Checked='<%# Bind("knmyakin") %>' /> 夜勤   <br /> </td> </tr> </table> <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="更新" /> &nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="キャンセル" /> </EditItemTemplate> </asp:FormView>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/09/01 08:54

ASP ではなく ASP.NET のタグをつけてください。
退会済みユーザー

退会済みユーザー

2020/09/01 23:16 編集

> FormViewのInsertモードでのCheckBoxは実装できましたが、EditモードのCheckBoxが実装できません。 質問者さんが実装した FormView 全体のコードを質問欄に追記してください。でないとあなたの言っていることが何も分かりません。(注: コードは ``` と ``` で囲うことを忘れにようにお願いします)
退会済みユーザー

退会済みユーザー

2020/09/01 23:38

ASP.NET のタグを付けるというお願いは無視ですか? ASP は普通「クラシック ASP」のことを言います。
kwmr8416

2020/09/02 07:13

遅くなり申し訳ございません。 タグの修正実施しました。 ご指摘ありがとうございます。 全体のコードをとありますが、1000行以上に及び、社外秘事項ありますので一部の記載とさせていただきます。 ```````````````````````````````````````````````````````````````````````````` <asp:formview id="FormView1" runat="server" datasourceid="SqlDataSource1" datakeynames="sscd" onitemupdated="FormView1_ItemUpdated"> <EditItemTemplate> <p>■基本情報</p> <table> <p> <asp:Button ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="更新" /> <asp:Button ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" OnClick="UpdateCancelButton_Click" Text="取消" /> </p> <tr> <td rowspan="4">氏名</td> <td >氏名<span >必須</span></span></td> <td > <asp:TextBox ID="stfnmTB" runat="server" Text='<%# Bind("stfnm") %>' /> </td> </tr> <tr > <td >血液型</td> <td > <asp:DropDownList ID="bloodDDL" runat="server" SelectedValue='<%# Bind("blood") %>'> <asp:ListItem></asp:ListItem> <asp:ListItem>A型</asp:ListItem> <asp:ListItem>B型</asp:ListItem> <asp:ListItem>O型</asp:ListItem> <asp:ListItem>AB型</asp:ListItem> <asp:ListItem>不明</asp:ListItem> </asp:DropDownList> </td> </tr> <tr> <td >性別</td> <td colspan="2"> <asp:DropDownList ID="sbtDDL" runat="server" SelectedValue='<%# Bind("sbt") %>'> <asp:ListItem></asp:ListItem> <asp:ListItem Value="男">男性</asp:ListItem> <asp:ListItem Value="女">女性</asp:ListItem> </asp:DropDownList> </td> </tr> </table> <p>■勤務条件</p> <table> <tr> <td >希望時間</td> <td > <!--エラーが起きる箇所--> <asp:CheckBox ID="knmnikinCB" runat="server" Checked='<%# Bind("knmnikin")' %>' /> 日勤   <br /> <asp:CheckBox ID="knmyakinCB" runat="server" Checked='<%# Bind("knmyakin")' %>' /> 夜勤   <br /> </td> </tr> </table> </EditItemTemplate> </asp:formview> ```````````````````````````````````````````````````````````````````````````` 上記ではTextBoxとDropDownListとCheckBoxの3つのコントロールがありますが、RadioButtonListについてもBind メソッドを使用し実装に成功しています。CheckBoxがBindメソッドを利用するとEditモードでエラーになります。 上記のようにすべてのコントロールにBindメソッドを使用し、更新編集操作を実現したくご質問をさせていただくことになりました。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2020/09/02 07:22

> タグの修正実施しました。 ASP のまま直ってませんが?
kwmr8416

2020/09/02 07:24

失礼いたしました。私も先ほど気付いたでんすが、今再度直します。
kwmr8416

2020/09/02 07:35

今タグとタイトルをaspからasp.netに修正できたことを確認しました。よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2020/09/02 07:38 編集

2020/09/02 16:13 のコメントのコードは質問欄を編集して追記いただくようお願いします。その際、コード部分は ``` と ``` で囲ってください。インデントされて見やすくなりますので。 あと、SqlDataSource1 のコードも追加してください。問題はそちらにありそうな気がします。
退会済みユーザー

退会済みユーザー

2020/09/02 07:47

<asp:CheckBox ID="knmnikinCB" runat="server" Checked='<%# Bind("knmnikin")' %>' /> で、Bind("knmnikin")' の ' が余分では? そもそも問題のコードがそのままアップされてますか? ときどき違うものをアップする人がいますが、そういうことはないかよく確認してください。
kwmr8416

2020/09/02 12:05

追記にてコードを記載いたしました。デバッグを行い上記の発生している問題・エラーメッセージで記載した同様のエラーが発生することを確認したものです。PostgreSQLで作成したテーブル定義は以下の通りです。 CREATE TABLE staffsample ( sscd serial PRIMARY KEY, --システムコード stfnm varchar(20), --スタッフ名 blood varchar(3), --血液型 sbt varchar(1), --性別 knmnikin varchar(5) DEFAULT 'False', --勤務条件_日勤 knmyakin varchar(5) DEFAULT 'False' --勤務条件_夜勤 ); insert into staffsample (stfnm) values ('debug'); --サンプルデータ
退会済みユーザー

退会済みユーザー

2020/09/02 12:05

Checked='<%# Bind("knmnikin")' %>' は何だったのですか? そのあたりをきちんと説明してもらわないと・・・ > <asp:Parameter Name="knmnikin" Type="String" /> 何でそれが bool 型ではないのでしょう? 一体全体何がどうなっていいるのか分からないのですが・・・ はっきり言って、書いてあることは信用できないですよ。
退会済みユーザー

退会済みユーザー

2020/09/02 12:13 編集

レスが前後してしまいましたが・・・ > knmnikin varchar(5) DEFAULT 'False', --勤務条件_日勤 一体どうしたいのですか? CheckBox.Checked は bool 型なんですけど・・・ もうちょっと疲れてきたのでまた明日話をさせてください。上の私の質問に対する答えを書いておいてくださいね。
kwmr8416

2020/09/02 15:52

>Checked='<%# Bind("knmnikin")' %>' は何だったのですか? 申し訳ございません。「Checked='<%# Bind("knmnikin")' %>'」はわたしの見落としです。 なぜそのようなことが起きたのか正直に言いますが、 ご指摘された行は現状Evalで対応しており、FormView1_ItemUpdatedイベント時にロジック側でCheckedプロパティの値を取得後Insert文によって当該列に値を入れています。 この度の目的及び質問の内容はBindメソッドで更新したいができないというものであり、Bindで書いた行に差し替えた際に間違ったソースを掲載してしまい誤解を与えてしまう結果になりました。 あくまで目的と最初にぶつかった問題に立ち返ったうえで行ったことです。 > <asp:Parameter Name="knmnikin" Type="String" /> >何でそれが bool 型ではないのでしょう?  >CheckBox.Checked は bool 型なんですけど・・・ その通りです。上記質問欄の試したことの補足も含めて、 varchar(5)は何かについてですが、RadioButtonListはTrueかFalseを取得しますが、booleanで定義するとなぜかエラーになってしまったというようなが経緯があり、 簡易的にbooleanをvarcharで定義したとうのがRadioButtonList実装時の対応としてあったからです。この時点で本当は質問するべきでした。 asp:ParameterのType属性についてはテーブルのデータ型varchar(5)も含めbooleanまたはbit(1)で定義してもType属性はStringで自動定義されます。 編集時はブラウザが開かないのでわかりませんが、登録時、varcharではTrueまたはFalseがデータベースに格納され、booleanではtまたはfが格納されます(取り出すときは1か0)。 bit(1)ではERROR [22P02] ERROR: "T" is not a valid binary digit;がブラウザ上でエラー表示され、<InsertParameters>の当該TypeをBooleanに変更し実行すると1または0が格納されます。 しかし、編集時になると上記で試した型いずれも、<asp:CheckBox ID="knmnikinCB" runat="server" Checked='<%# Bind("knmnikin") %>' />のところで、吹き出しが表示されて System.InvalidCastException: '指定されたキャストは有効ではありません。'となってしまいます。 現状ではbooleanで当該列を定義し、Checked='<%# Eval("knmnikin").ToString().Equals("1") %>'でチェックボックスのオンオフを表示させ、Bindメソッドは使用しておりません。 CheckBoxに編集時もBindメソッドは利用できないものか何かわかればと思っております。 よろしくお願いいたします。
kwmr8416

2020/09/03 02:03 編集

自分のコメントの訂正です。 >ご指摘された行は現状Evalで対応しており、FormView1_ItemUpdatedイベント時にロジック側で>Checkedプロパティの値を取得後Insert文によって当該列に値を入れています。 Insert文ではなくUpdate文でした。申し訳ございません。
退会済みユーザー

退会済みユーザー

2020/09/03 02:43

上の説明を見て、やっとどうなっているのか何が問題なのか分かった気がします。理解が遅くてすみません。 以下のような話と理解しました。 > asp:ParameterのType属性についてはテーブルのデータ型varchar(5)も含めbooleanまたはbit(1)で定義してもType属性はStringで自動定義されます。 というのは、PostgreSQL のテーブルの knmnikin の型が varchar, boolean, bit(1) のいずれでも InsertParameters および UpdateParameters には <asp:Parameter Name="knmnikin" Type="String" /> というように設定される。 > varcharではTrueまたはFalseがデータベースに格納され、 > booleanではtまたはfが格納されます(取り出すときは1か0)。 > bit(1)では、<InsertParameters>の当該TypeをBooleanに変更し実行すると1または0が格納されます。 そして、FormView が登録モードなら、knmnikin の型が varchar, boolean の場合は、そのままデータバインド式 Checked='<%# Bind("knmnikin") %>' を使って問題ない。knmnikin の型が bit(1) のときは <asp:Parameter Name="knmnikin" Type="Boolean" /> と Type を変更すれば、データバインド式 Checked='<%# Bind("knmnikin") %>' を使える。 しかし、FormView を編集モードにすると InvalidCastException がスローされる。どのようにしてもその例外を解決できず、結果、データバインド式 Checked='<%# Bind("knmnikin") %>' が使えない。 そこを何とか編集モードでも、登録モードと同様に、データバインド式 Checked='<%# Bind("knmnikin") %>' を使えるようにする方法はないかというのがこのスレッドの質問。 ・・・以上、理解が違っていたら連絡ください。
退会済みユーザー

退会済みユーザー

2020/09/03 02:53

上に書いた私の理解が合っているとして・・・ varchar, boolean, bit(1) のいずれでも <asp:Parameter Name="knmnikin" Type="String" /> となるのは Visual Studio で使われている PostgreSQL 用のデザイナの仕様なのかもしれませんが、FormView を編集モードにすると InvalidCastException がスローされるというのはバグっぽいです。 他にも以下の記事のように Bind と編集モードに関係するバグはありました。 ListView と DropDownList http://surferonwww.info/BlogEngine/post/2010/10/31/DropDwonList-in-InsertItemTemplate-of-ListView.aspx 残念ながら、このスレッドの件も、上記の記事の件も、その「バグっぽい」ところそのものを直接解決する手段は自分は分かりません。 質問者さんの回避策のように Bind を使わない手段を取るのが現実的な対応と思います。
kwmr8416

2020/09/03 03:04

ありがとうございました。リンクの方拝見させていただきました。 まだ開発経験2年にも満たない者ですが、今後も頑張ります。
退会済みユーザー

退会済みユーザー

2020/09/03 03:09

データバインド式 Checked='<%# Bind("knmnikin") %>' を使えるようにする方法は分かりませんが、Eval を使っても編集結果を DB に反映する方法はあります。それを回答欄に書いておきます。 聞かなくても分かっていて、既に対応済みかもしれませんが・・・
kwmr8416

2020/09/03 03:11

ぜひお聞きしたいです。よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2020/09/03 03:24

今気が付いたのですが、前付きパラメータではなく位置パラメータマーカー '?' が使われていますね。それを SQL Server と同様 @name のような名前付きパラメータにできるでしょうか?
kwmr8416

2020/09/03 03:26

はい、エラーになります。
退会済みユーザー

退会済みユーザー

2020/09/03 03:32

位置パラメータマーカー '?' なので名前で探すことはできないが、当該パラメータの位置は分かるという前提で回答しておきます。
kwmr8416

2020/09/03 03:34

はい大丈夫です。よろしくお願いします。
guest

回答1

0

ベストアンサー

データバインド式 Checked='<%# Bind("xxxxx") %>' を使えるようにする方法は分かりませんが、Checked='<%# Eval("xxxxx") %>' を使って編集結果を DB に反映する案を書いておきます。

ただし、位置パラメータマーカー '?' しか使えないそうなですので、当該パラメータの位置(パラメータコレクションの中の当該パラメータのインデックス)は分かるというのが前提です。

SqlDataSource のイベントハンドラで対応するのが良いと思います。

質問者さんのケースでは編集モードが問題ということですので、SqlDataSource の Updating イベントのハンドラで当該 CheckBox の Checked プロパティの値を取得し、Command のパラメータに代入するという方法になります。

以下のような感じです。

protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e) { CheckBox cb = (CheckBox)FormView1.FindControl("knmnikinCB"); e.Command.Parameters[当該パラメータのインデックス].Value = cb.Checked; }

SQL Server の場合は名前付きパラメータが使えますので、上の「当該パラメータのインデックス」をパラメータ名にすれば OK なのは確認済みです。PostgreSQL は未検証・未確認です。質問者さんの方で検証願います。

パラメータに渡すのが true/false とか t/f の文字列の場合は cb.Checked はそれに応じて変更してください。

.aspx の SqlDataSource のコードに以下のハンドラをアタッチするコードを追加するのを忘れないようにしてください。

OnUpdating="SqlDataSource1_Updating"

投稿2020/09/03 03:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kwmr8416

2020/09/03 04:01

ありがとうございます。今から私の環境で検証してみます。
kwmr8416

2020/09/03 04:29

以下のソースでt/fがデータベースに格納されました。その後問題なくブラウザでもチェックボックスのオンオフが表示されることも確認しました。ちなみにPostgreSQLのOdbc接続です。ありがとうございました。 protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e) { CheckBox cb = (CheckBox)FormView1.FindControl("knmnikinCB"); e.Command.Parameters["knmnikin"].Value = cb.Checked; }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問