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

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

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

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

Visual Studio

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

ASP.NET

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

Q&A

解決済

1回答

2498閲覧

DBから項目を取得するようにデータバインドさせたCheckBoxListは、個々にボックスを指定することは出来ませんか?

UShow

総合スコア4

C#

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

Visual Studio

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

ASP.NET

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

0グッド

0クリップ

投稿2020/11/22 09:26

編集2020/11/22 23:56

前提・実現したいこと

######ASP.NETのCheckBoxListについてです。
CheckBoxListを用い、血液型によってユーザーを検索するようなプログラムが書けないか試しています。そのことで2点質問があります。

プログラムの要件は以下になります。
①チェックボックスを5つ作る(「不明」、「A型」、「B型」、「O型」「AB型」のボックス)
②「不明」ボックスにチェックが入っているとき、他ボックスをグレーアウトで非活性にする。
③「不明」ボックスのチェックを外した時、他のボックスを活性にする。
④「A型」、「B型」、「O型」、「AB型」のボックスは複数選択できるようにする。
⑤チェックボックスはSQLServerのDBから取得する。

######前提的な質問になります。
要件⑤を満たすためにサーバーコントロールのSqlDataSourceを使い、DBに登録してある血液型のチェックボックスが作られるようにしたのですが、このデータバインドしたチェックボックスは個々に挙動を設定できるのでしょうか?
現在、aspx.csにチェックボックスのボックスに関するコードが生成されていなかったので、もしかしたらできないのでは、と思いました。
個々の挙動は要件②のために必要なので、データバインドで自動的に作られるボックスの一つ目のボックスをボックス1として指定することは可能でしょうか?ということになります。

自動生成されるチェックボックスなので、aspx.cs側にソースがなく、載せることが出来ません。

何卒宜しくお願い致します。

#####質問の追記・補足
まず今回のプログラムはSQL serverのDBありきになっています。
DBには以下のテーブルがあります。
【table】
ex_master_item
テーブルには以下の列名とレコードがあります。
【列名】  
:list_id、item_order、item_text、item_value
【レコード】
:0、0、'不明'、0
:1、1、'A型'、1
:1、1、'B型'、2
:1、1、'O型'、3
:1、1、'AB型'、4
このデータをSqlDataSourceとリソースファイル(SELECT文で上記レコードを指定)を使って汲み上げています。

【aspx】
<asp:SqlDataSource ID="BloodType" runat="server" SelectCommand="<%$ Resources:sdsBloodType_SelectCommand %>" OnSelecting="sdsBloodType_Selecting" CancelSelectOnNullParameter="false" />
<asp:CheckBoxList ID="chlBloodType" runat="server" DataSourceID="BloodType" DataTextField="item_text" DataValueField="item_value" ondatabound="chlBloodBind_DataBound" RepeatDirection="Horizontal" />

この結果、「不明」~「AB型」までのチェックボックスが自動生成され、DBに例えば「0、0、'Rh- O型'、0」などを加えたらそれも追加されていきます。
今回、その自動生成されるチェックボックスたちにIDを割り振り、挙動をプログラミングしたいのです。
自動生成されるためか、aspc.cs側にチェックボックスのソースがないので、自動生成されるチェックボックスを順にID=1、2、3、4、5と割り振り、ID=1(これを「不明」ボックスとする)に他のチェックボックス非活性にするようなコードを書きたいです。

試したこと

GoogleやMicroSoft、Youtubeなどでもチェックボックスリストについて調べたのですが、データバインドで自動生成されるチェックボックスに、個々にボックスIDを振れるかについて書かれた記事が一つも見つかりませんでした。

もし、5つのチェックボックスを作ってしまった方がよい、や、「不明」チェックボックスだけ別に作って他4つはDBから取得の形が良い、などアドバイスございましたらよろしくお願いいたします。

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

質問者:ASP.Net、C#ともに触れて1カ月の超初心者。
使用環境:Visual Studio2017、.NET Framework4.6.2以降

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/11/22 11:22 編集

> DBから項目を取得するようにデータバインドさせたCheckBoxListは、個々にボックスを指定することは出来ませんか? > ⑤チェックボックスはSQLServerのDBから取得する。 どういう意味でしょう?????
UShow

2020/11/22 17:06

追記・修正依頼ありがとうございます。 まず今回のプログラムはSQL serverのDBありきになっています。 DBには以下のテーブルがあります。 table: ex_master_item テーブルには以下の列名とレコードがあります。 列名  :list_id、item_order、item_text、item_value レコード:0、0、'不明'、0     :1、1、'A型'、1     :1、1、'B型'、2     :1、1、'O型'、3     :1、1、'AB型'、4 このデータをSqlDataSourceとリソースファイル(SELECT文で上記レコードを指定)を使って汲み上げています。 【aspx】 <asp:SqlDataSource ID="BloodType" runat="server" SelectCommand="<%$ Resources:sdsBloodType_SelectCommand %>" OnSelecting="sdsBloodType_Selecting" CancelSelectOnNullParameter="false" /> <asp:CheckBoxList ID="chlBloodType" runat="server" DataSourceID="BloodType" DataTextField="item_text" DataValueField="item_value" ondatabound="chlBloodBind_DataBound" RepeatDirection="Horizontal" /> この結果、「不明」~「AB型」までのチェックボックスが自動生成され、DBに例えば「0、0、'Rh- O型'、0」などを加えたらそれも追加されていきます。 今回、その自動生成されるチェックボックスたちにIDを割り振り、挙動をプログラミングしたいのです。 自動生成されるためか、aspc.cs側にチェックボックスのソースがないので、自動生成されるチェックボックスを順にID=1、2、3、4、5と割り振り、ID=1(これを「不明」ボックスとする)に他のチェックボックス非活性にするようなコードを書きたいです。
退会済みユーザー

退会済みユーザー

2020/11/22 22:09 編集

上記は質問欄を編集して追記してください。 質問のコメント欄は上に書いてあるように「質問への追記・修正の依頼」を行う場所です。
UShow

2020/11/22 23:56

失礼いたしました。 補足・追記を質問欄に追記致しました。
guest

回答1

0

ベストアンサー

JavaScript / jQuery を使ってクライアント側で処理するのがよさそうですが、今回はポストバックしてサーバー側で処理するのが希望と理解してレスします。

①チェックボックスを5つ作る(「不明」、「A型」、「B型」、「O型」「AB型」のボックス)
②「不明」ボックスにチェックが入っているとき、他ボックスをグレーアウトで非活性にする。
③「不明」ボックスのチェックを外した時、他のボックスを活性にする。
④「A型」、「B型」、「O型」、「AB型」のボックスは複数選択できるようにする。

上の ② では「他ボックスをグレーアウト」するだけでなく、チェックを外す必要があると思いますが、それを含めて以下のようにすれば希望通りになると思います。

(1) チェックボックスのどれかをクリックしたときポストバックされるるように CheckBoxList の AutoPostBack プロパティを true に設定。

(2) 処理は CheckBoxList.SelectedIndexChanged イベントのハンドラで行うのでその設定(ハンドラのコードの生成とイベントへのアタッチ)を行う。

(3) イベントハンドラ内で ChecBoxList.Items プロパティを使って ListItemCollection を取得。

(4) ListItemCollection の FindByText または FindByValue メソッドで「不明」に該当する ListItem を取得。

(5) 上記 (4) で取得した ListItem の Selected プロパティが ture であれば、その他の ListItem の Selected プロパティと Enabled プロパティを false に設定する。

(6) 上記 (4) で取得した ListItem の Selected プロパティが false の場合は、その他の ListItem の Enabled プロパティを true に設定する。

コードは自分で考えてみてください。どうしてもわからなければ下のコメント欄で質問してください。

上のやり方に不都合があれば下のコメント欄で具体的に何が不都合かを書いてください。

上に JavaScript / jQuery を使ってクライアント側で処理するのがよさそうと書きましたが、そちらの方向に進みたいのならこのスレッドはクローズして、html, javascript の質問として新たに別のスレッドを立てて質問してください。

投稿2020/11/23 01:37

編集2020/11/23 01:46
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

UShow

2020/11/23 02:27

すみません、基本的な質問で恐縮なのですが、頂いた回答の(1)はaspx、(2)~(6)はaspx.cs側の処理でしょうか…? 私はまだコードを1から書いたことがないので、コードはググりつつ書こうと思います。
退会済みユーザー

退会済みユーザー

2020/11/23 05:00

> 頂いた回答の(1)はaspx、(2)~(6)はaspx.cs側の処理でしょうか…? それでいいです。 ググってください。キーワードは回答の中にあります。基本的なことは聞かないで自助努力でお願いします。
UShow

2020/11/23 09:05

ご回答ありがとうございました。 BAにさせていただきます。
UShow

2020/11/24 09:33

(3)以下のコードがどうしてもわかりません。 解決済みにしてしまい恐縮なのですが、コードを書いてくださるととても助かります…
退会済みユーザー

退会済みユーザー

2020/11/24 09:41

> (3)以下のコードがどうしてもわかりません。 自分ではどこまで書けたかコードを質問欄に追記して、そのどこで躓いていて、何か分かれば解決するかを書いてください。丸投げは NG です。
UShow

2020/11/24 09:51

ご返信ありがとうございます。 大変失礼いたしました。私が現在書いているコードは以下になります。 //追加 ListItemCollectionを取得したい protected void chlBloodType_SelectedIndexChanged(object sender,EventArgs e) { foreach(ListItem item in chlBloodType.Items) { if(item.Selected) { //FindByで「不明」のlistitemsを取得 } } } 全然書けてなくて恐縮です… まず(3)のitemsプロパティはforeach(ListItem item in chlBloodType.Items)であってますでしょうか? また(4)以降はこの中にFindByxxを書いていけばよろしいのでしょうか?
退会済みユーザー

退会済みユーザー

2020/11/24 10:10

書いた通りやってないじゃないですか・・・ (3) イベントハンドラ内で ChecBoxList.Items プロパティを使って ListItemCollection を取得。 ListItemCollection collection = chlBloodType.Items; (4) ListItemCollection の FindByText または FindByValue メソッドで「不明」に該当する ListItem を取得。 ListItem itemUnknown = collection.FindByText("不明"); (5) 上記 (4) で取得した ListItem の Selected プロパティが ture であれば・・・ if (itemUnknown.Selected) { itemUnknown 以外の ListItem の Selected プロパティと Enabled プロパティを false に設定 } else { false であれば、itemUnknown 以外の ListItem の Enabled プロパティを true に設定 }
UShow

2020/11/24 13:13

コードありがとうございます! とても助かります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問