実装したいこと
ASP.NET Web Formsで以下の一連の流れを実装したいです。
- 画面左側にTreeView表示、画面右側にTreeView詳細情報表示用divを用意
- DBから取得したデータをTreeViewにバインド
- 各ノードのvalue値にテーブルの主キーを設定
- 画面上で選択されたノードのvalue値を取得
- value値(主キー)に該当するテーブルのレコードを取得
- 取得した値を詳細画面表示用divに表示
上記の流れの中でTreeViewから選択したノードのvalue値を取得する方法がわかりません。
どなたかご教授いただければ幸いです。
また、不足している情報がありましたら随時更新しますので、ご指摘ください。
TreeView表示コード
HTML
1<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.Master" AutoEventWireup="true" CodeBehind="TreeView.aspx.cs" Inherits="TreeView.TreeView" %> 2 3<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5</asp:Content> 6 7<asp:Content ID="Content2" ContentPlaceHolderID="holder" runat="server"> 8 <div class="board-body-margin"> 9 <div class="caption board-margin-bottom"> 10 <asp:Label ID="lblTitle" runat="server" Text="掲示板" CssClass="title"></asp:Label> 11 </div> 12 <asp:LinkButton ID="btnRegist" runat="server" OnClick="btnRegist_Click" OnClientClick="return btnRegister_Click()" class="portalBtn board-margin-bottom">新規登録</asp:LinkButton> 13 <hr /> 14 <div id="divTree" runat="server" style="width: 20%; float: left"> 15 <asp:TreeView ID="TreeView1" runat="server"></asp:TreeView> 16 </div> 17 <div id="divDetail" runat="server" style="width: 80%; float: right"></div> 18 </div> 19</asp:Content>
C#
1using System; 2using System.Collections.Generic; 3using System.Data; 4using System.Linq; 5using System.Web; 6using System.Web.UI; 7using System.Web.UI.WebControls; 8 9namespace TreeView 10{ 11 public partial class TreeView : System.Web.UI.Page 12 { 13 protected void Page_Load(object sender, EventArgs e) 14 { 15 if (IsPostBack == true) { return; } 16 set_treeMenuList(); 17 } 18 19 protected void btnRegist_Click(object sender, EventArgs e) 20 { 21 22 } 23 24 public void set_treeMenuList() 25 { 26 TreeNode parent = new TreeNode(); 27 TreeNode child = new TreeNode(); 28 29 string strSql = $" SELECT p.parentID as pID,p.BoardName as pName,c.childID as cID,c.TreadName as cName" 30 + $" FROM parent p" 31 + $" INNER JOIN child c" 32 + $" ON p.parentID=c.childID"; 33 34 //データベースに接続 35 DataTable dtTree = ----; 36 37 foreach (DataRow rowParent in dtTree.Rows) 38 { 39 // 親ノード作成 40 if (parent.Value != rowParent["pID"].ToString()) 41 { 42 parent = new TreeNode(); 43 parent.Value = rowParent["pID"].ToString(); 44 parent.Text = rowParent["pName"].ToString(); 45 TreeView1.Nodes.Add(parent); 46 47 foreach (DataRow rowChild in dtTree.Rows) 48 { 49 // 子ノード作成 50 if (parent.Value == rowChild["pID"].ToString()) 51 { 52 child = new TreeNode(); 53 child.Value = rowChild["cID"].ToString(); 54 child.Text = rowChild["cName"].ToString(); 55 parent.ChildNodes.Add(child); 56 } 57 } 58 } 59 } 60 } 61 } 62} 63 64
環境
ASP.net
C#
VisualStudio2017
Windows10
.NET 4.8
SQLServer
→エディション:MicrosoftSQLServerDeveloper(64-bit)
→バージョン:15.0.2000.5
SQLServerManagementStudio2019
TreeView ということは ASP.NET Web Forms アプリの話ということで良いのですよね?
開発環境を書いてください。OS, .NET のバージョン、DB サーバーは何でそのバージョン・エディションは何かなど。(SQL Server Management Studio は DB サーバーではなく単なるツールです)
ご指摘ありがとうございます。
ご指摘の通り、ASP.NET Web Forms アプリの話です。
環境情報を修正いたしました。ご確認いただければ幸いです。
> ASP.NET Web Forms アプリの話です
それも質問欄を編集して追記していただくようお願いします。
> .NET 4.0
.NET 4.0 は間違いないですか? すでにサポートされてないはずですけど。
再度ご指摘いただきありがとうございます。
>それも質問欄を編集して追記していただくようお願いします。
追記いたしました。
>.NET 4.0 は間違いないですか? すでにサポートされてないはずですけど。
確認する箇所を間違えておりました。再度確認したところ.NET4.8でした。失礼いたしました。
動的に TreeView を作って pnlTree に Page_Load イベントで初期画面の時だけ Add しているようですが、動的にやる意味があるのですか? そのやり方ですと、ポストバックしたときは TreeView は表示されなくなってしまうはずですけど?(動的に生成したコントロールは、ポストバックの際も毎回動的に生成する必要があります。また、そうすると毎回クエリを SQL Server に投げて動的に TreeView を生成するという無駄なことになります) そのあたりから見直した方がよさそうです。
> 3. 画面上でクリックされたノードの情報を取得
「ノードの情報」とは具体的に何ですか? コードを見る限り分からなかったのですが・・・
ご指摘ありがとうございます。
初心者ゆえ解釈違いがありましたらご指摘ください。
>動的に TreeView を作って pnlTree に Page_Load イベントで初期画面の時だけ Add しているようで
>すが、動的にやる意味があるのですか?
ノードの追加が多く、その度にコードに追加分を書き足すのが手間だと思いました。DBに値を追加すれば、自動でノードが追加されるようにしたく、動的にしています。
>「ノードの情報」とは具体的に何ですか? コードを見る限り分からなかったのですが・・・
情報が不足しておりました。
valueに値を設定し、その値からDBのデータを取得しようと考えておりました。
> ノードの追加が多く、その度にコードに追加分を書き足すのが手間だと思いました。DBに値を追加すれば、自動でノードが追加されるようにしたく、動的にしています。
私の言っていることが理解できてないようです。
C# のコードで new TreeView してそれを Panel に Add するのがダメなのです。静的にページに TreeView を配置し(ツールボックスから TreeView をページにドラッグ&ドロップするのと同じ)、その TreeView に DB から取得したデータをバインドするのです。わかります? Microsoft のドキュメントなどにサンプルがあると思いますので探してみてください。
> valueに値を設定し、その値からDBのデータを取得しようと考えておりました。
例えば(あくまで例えばです)、Value に設定する値というのはテーブルの主キーで、クリックされた Node から Value すなわち主キーの値を取得し、それで DB のテーブルから主キーに該当するレコードを取得して別の Panel に表示するいうような話ですか? ← この例のレベルで、きちんと書いてください。
>C# のコードで new TreeView してそれを Panel に Add するのがダメなのです。静的にページに TreeView を配置し(ツールボックスから TreeView をページにドラッグ&ドロップするのと同じ)、その TreeView に DB から取得したデータをバインドするのです。わかります?
おっしゃっていることが理解できました。
>例えば(あくまで例えばです)、Value に設定する値というのはテーブルの主キーで、クリックされた Node から Value すなわち主キーの値を取得し、それで DB のテーブルから主キーに該当するレコードを取得して別の Panel に表示するいうような話ですか?
またしても説明不足でした。まさにそのような動作を実装したいと考えております。
では、それらをベースに考え直して、質問を表題の「動的に追加したTreeview」から書き換えるようにしてください。今のままでは、少なくとも自分はとてもフォローできる内容でありませんので、書き換えていただけない限り撤退します。
ご指摘ありがとうございます。
全体的に修正をしてみました。
ご確認をお願いいたします。
よろしければご助言をお願いいたします。
TreeView.SelectedNodeChanged イベントにハンドラをアタッチして、そのハンドラの中で TreeView.SelectedNode プロパティで選択された TreeNode を取得し、TreeNode.Value プロパティで「value値(主キー)」を取得できるか試してみてください。
それで期待通り主キーが取得できていれば、その後取得した主キーを使って DB のテーブルからレコードが取得できるはずです。
ご助言ありがとうございます。
現在、開発環境が手元に無いため、明日改めて試させていただきます。
TreeView.SelectedNodeChanged イベントにハンドラをアタッチ、ハンドラの中で「TreeView1.SelectedNode.Value」とする事で無事にvalue値を取得する事が出来ました。
この度は大変お世話になりました。また機会がありましたらご助言いただければと思います。
本質問とは関係の無い事お許しください。
SurferOnWww様をベストアンサーとして選択したいのですが、回答にコメントが無い為選択する事ができません。この場合どうするべきでしょうか?
お手数ですが、ご自分で上の質問者さんのコメントの解決策を解答欄に書いてベストアンサーを付けてクローズしていただくようお願いします。
承知いたしました。ありがとうございます。
回答1件
あなたの回答
tips
プレビュー