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

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

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

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

ASP.NET

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

Q&A

解決済

1回答

2239閲覧

OnRowDataBoundでDropDownListの値を編集したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

ASP.NET

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

0グッド

0クリップ

投稿2019/04/10 03:58

編集2019/04/10 06:39

前提・実現したいこと

・DBで取得した値をDropDownListで表示

困っていること

・DataTableの値を編集した後にうまく表示されない

処理の流れ

(Page_Load)
1.DBからデータを取得
2.画面表示用にDataTableを作成

C#

1DataTable userInfo = new DabaTable(); //ユーザー情報 2DataTable jobInfo = new DataTable(); //仕事情報→この中身をドロップダウンにしたい 3 4//DBからデータを取得してuserInfo, jobInfoに入れる 5//userInfoには名前と誕生日、jobInfoには職業名と~~仕事区分~~が入ります→IDが入ります 6//(取得処理の内容は省略) 7 8//画面表示用 9DataRow dr; 10 table.Columns.Add("Name", typeof(string)); 11 table.Columns.Add("Birthday", typeof(string)); 12 table.Columns.Add("Job", typeof(ListItem[])); 13 14 foreach (DataRow row in userInfo.Rows) 15 { 16 dr = table.NewRow(); 17 dr["Name"] = row["名前"]; 18 dr["Birthday"] = row["誕生日"]; 19 dr["Job"] = null; //あとでデータを入れる 20 table.Rows.Add(dr); 21 } 22 23this.UserInfoGridView.DataSource = table; 24this.UserInfoGridView.DataBind();

(画面側)
1.表示

<asp:GridView ID="UserInfoGridView" runat="server" AutoGenerateColumns="False" OnRowDataBound="Grid_RowDataBound">   <Columns> <asp:BoundField HeaderStyle-Width="300" DataField="Name" HeaderText="名前"></asp:BoundField> <asp:BoundField HeaderStyle-Width="300" DataField="Birthday" HeaderText="誕生日"></asp:BoundField> <asp:templatefield HeaderStyle-Width="300" HeaderText="仕事" > <itemtemplate> <asp:DropDownList ID="Job" runat="server" AutoPostBack="true"></asp:DropDownList>   </itemtemplate> </asp:templatefield> </Columns> </asp:GridView>

 
(OnRowDataBoundのとき)

C#

1protected void Grid_RowDataBound(object sender, GridViewRowEventArgs e) 2{ 3 if (e.Row.RowType == DataControlRowType.DataRow) 4 { 5 int cnt = jobInfo.Rows.Count; 6 ListItem[] list = new ListItem[cnt]; 7 var num = 0; 8 foreach (DataRow jobRow in jobInfo.Rows) 9 { 10    list[num] = new ListItem { Text = jobRow.ItemArray[0].ToString(), Value = jobRow.ItemArray[1].ToString() }; 11 num++; 12 } 13 //ListItem[]の入れ方がこれでいいのかがわからない 14 int tmp = e.Row.DataItemIndex; 15 table.Rows[tmp][2] = list; 16 17 var jobList = e.Row.FindControl("Job") as DropDownList; 18 jobList.DataSource = table; 19 //"Text"や"Value"を入れると「Textという名前のプロパティは含まれません」とエラーになる。。 20 jobList.DataTextField = "Job"; 21 jobList.DataValueField = "Job"; 22 jobList.DataBind(); 23 } 24}

結果

ドロップダウン自体は表示されますが、System.Web.UI.WebControls.ListItem[]という値がドロップダウンに表示されます。タスケテクダサイ。。

追記

DropDownListには職業名の一覧が入ります。
登録されたユーザーの職業を選択するイメージです。

DBデータ
ユーザテーブル
カラム:ID、名前、誕生日、仕事ID

仕事テーブル
カラム:ID、職業名、区分
~~
jobInfoにはユーザテーブル.仕事ID=仕事テーブル.IDで検索したデータが入っています。~~
jobInfoには仕事テーブルに登録されている全職業名が入ります

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/04/10 05:34

開発環境(特に Visual Studio, .NET のバージョン、DB は何か)は必ず書くようにしましょう。それによって話が違ってくることがままあります。
退会済みユーザー

退会済みユーザー

2019/04/10 06:29

Visual Studioは2017 Version 15.7.3で、.NETはVersion4.7.03190で、DBはOracleです。 DropDownListについては質問の一番下に追記しました。
退会済みユーザー

退会済みユーザー

2019/04/10 07:25

「ユーザテーブル」の「仕事ID」が「仕事テーブル」の当該「ID」を指しているのですよね?  そして、Oracle だそうですが ODP.NET は使えますか? 以下の記事のように、それと SqlDataSource を組み合わせて使えますか? 使えれば、上に紹介した記事の応用でできると思うのですが。 https://stackoverflow.com/questions/40909461/asp-net-c-sharp-sqldatasource-and-oracle-the-network-path-was-not-found
guest

回答1

0

ベストアンサー

上の質問に対するコメントに返事がないので、ODP.NET + SqlDataSource が質問者さんの環境で使えるのかどうか不明ですが、使えるのであれば以下の記事の応用で簡単に実現できると思います。

DropDownList での NULL の処置
http://surferonwww.info/BlogEngine/post/2015/10/23/dropdpwnlist-handling-null-in-database.aspx

これが絶対的にお勧めです。ODP.NET + SqlDataSource が使えないということであれば、使えるように環境を整備すべきです。

もし、どうしても使えないということであれば・・・

Oracle DB より必要な DataTable は取得できているようですので、取得するためのコードをビジネスロジックとしてまとめ、ObjectDataSource 経由で GridView, DropDownList にバインドするのがお勧めです。

具体例は以下の通りです。

まず、ビジネスロジックを格納するクラスファイルを追加し、その中に DB より必要なデータを取得して DataTable を生成して返すメソッドのコードを書きます。

コードは以下のような感じです。DB は持ってないので、代わりに、質問の情報をベースにコードで DataTable を組み立てています。

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data; /// <summary> /// UserAndJobInfo の概要の説明です /// </summary> public class UserAndJobInfo { public UserAndJobInfo() { // // TODO: コンストラクター ロジックをここに追加します // } public DataTable GetUserInfo() { DataTable table = new DataTable(); table.Columns.Add(new DataColumn("Id", typeof(int))); table.Columns.Add(new DataColumn("Name", typeof(string))); table.Columns.Add(new DataColumn("Birthday", typeof(string))); table.Columns.Add(new DataColumn("JobId", typeof(int))); for (int i = 0; i < 5; i++) { DataRow row = table.NewRow(); row["Id"] = i + 1; row["Name"] = "名前-" + (i + 1).ToString(); row["Birthday"] = "1990/1/" + (i + 1).ToString(); row["JobId"] = 5 - i; table.Rows.Add(row); } return table; } public DataTable GetJobInfo() { DataTable table = new DataTable(); table.Columns.Add(new DataColumn("Id", typeof(int))); table.Columns.Add(new DataColumn("JobName", typeof(string))); table.Columns.Add(new DataColumn("Class", typeof(string))); for (int i = 0; i < 5; i++) { DataRow row = table.NewRow(); row["Id"] = i + 1; row["JobName"] = "職業名-" + (i + 1).ToString(); row["Class"] = "区分" + (i + 1).ToString(); table.Rows.Add(row); } return table; } }

.aspx のコードは以下のようになります。(.aspx.cs のコードは自動生成されたまま手を加えませんので割愛)

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="0067-DropDownListInGridView.aspx.cs" Inherits="_0067_DropDownListInGridView" %> <!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:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetUserInfo" TypeName="UserAndJobInfo"> </asp:ObjectDataSource> <asp:ObjectDataSource ID="ObjectDataSource2" runat="server" SelectMethod="GetJobInfo" TypeName="UserAndJobInfo"> </asp:ObjectDataSource> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="ObjectDataSource1"> <Columns> <asp:BoundField DataField="Id" HeaderText="ID" /> <asp:BoundField DataField="Name" HeaderText="名前" /> <asp:BoundField DataField="Birthday" HeaderText="誕生日" /> <asp:BoundField DataField="JobId" HeaderText="仕事ID" /> <asp:TemplateField HeaderText="職業名"> <ItemTemplate> <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="ObjectDataSource2" DataTextField="JobName" DataValueField="Id" SelectedValue='<%# Bind("JobId") %>'> </asp:DropDownList> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </div> </form> </body> </html>

実行結果は以下の通りです。

イメージ説明

投稿2019/04/11 02:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/04/11 06:49

回答が遅くなり申し訳ありません。 ODP.NET + SqlDataSourceが使えない環境で。。。ですが、上記の方法で解決できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問