前提・実現したいこと
・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には仕事テーブルに登録されている全職業名が入ります
開発環境(特に Visual Studio, .NET のバージョン、DB は何か)は必ず書くようにしましょう。それによって話が違ってくることがままあります。
DropDownList にはどのようなデータをどのように表示したいのか詳しく書いてください。よくあるケースが以下のように正規化された DB のテーブルを表示して更新をかける際にユーザーに便宜を図るためなのですが、こういうことではない?
http://surferonwww.info/BlogEngine/post/2015/10/23/dropdpwnlist-handling-null-in-database.aspx
Visual Studioは2017 Version 15.7.3で、.NETはVersion4.7.03190で、DBはOracleです。
DropDownListについては質問の一番下に追記しました。
「ユーザテーブル」の「仕事ID」が「仕事テーブル」の当該「ID」を指しているのですよね?
そして、Oracle だそうですが ODP.NET は使えますか? 以下の記事のように、それと SqlDataSource を組み合わせて使えますか? 使えれば、上に紹介した記事の応用でできると思うのですが。
https://stackoverflow.com/questions/40909461/asp-net-c-sharp-sqldatasource-and-oracle-the-network-path-was-not-found
「OnRowDataBoundでDropDownListの値を編集したい」ということですが、見当違いの方向にはまり込んで迷走しているように思えます。紹介した記事 http://surferonwww.info/BlogEngine/post/2015/10/23/dropdpwnlist-handling-null-in-database.aspx をよく読んでください。これがやりたいことと異なる場合は、どこがどう異なるのか書いてください。
回答1件
あなたの回答
tips
プレビュー
