さて、チョコチョコとサンプルを触ってきて
本実装を開始しようかと思っています。。
何を作ろうか。というか、決まってる。
自分用のデスクトップツールを作ろう。
じゃ、メニューを作ろう。
ExtはloderでdataURL指定できるので
UIはすべてExtでやろうと決めた。
メニュー用のツリーを作ろう。
設定可能にするため、ツリー構造もDBに定義してみよう。
とりあえずこんなんでよいだろう。
あとは最上位情報から取得と
末尾を検索する再帰関数を作ってノードを作ればOK。
いっこはまったのはJSONの値を整形する際の文法。
何を書いてやればOKなん?
っていうのがわからんチン。
とりあえず現状の解決としては、
子供要素はChild[]でくくれ。
ということでしょうか。
本日作ったサンプルコード張ってみる。
/// <summary> /// メニューツリーの構築 /// </summary> /// <returns></returns> private string createTrees() { string result = ""; string node = ""; string nodes = ""; string sqlStatement = ""; sqlStatement = "select * from TM_メニューデータ WHERE 上位メニューコード = '-' AND 末尾フラグ = 'false' ORDER BY 表示順, メニューコード"; DataTable dt = _sqlClientAccess.ReadDataTable(sqlStatement, "TM_メニューデータ"); foreach (DataRow dr in dt.Rows) { //--- JSONノード化 --- node = createJsonMenuNode(dr, dt.Columns); if (Convert.ToBoolean(dr["末尾フラグ"]) == true) { // NOP } else { node += ",children:["; //--- 末尾情報検索再帰関数呼び出し --- node += searchLeafData(dr["メニューコード"].ToString()); node += "]"; } nodes += addNodeSeparator(node, "{", "},"); } nodes = trimEndToken(nodes, ","); nodes = addNodeSeparator(nodes, "[", "]"); result = nodes; return result; } /// <summary> /// メニューツリー構築用再帰関数 /// </summary> /// <param name="parentCode"></param> /// <returns></returns> private string searchLeafData(string parentCode) { string result = ""; string nodes = ""; string node = ""; string sqlStatement = ""; sqlStatement = "select * from TM_メニューデータ WHERE 上位メニューコード = '" + parentCode + "'"; sqlStatement += " ORDER BY 表示順"; DataTable dt_children = _sqlClientAccess.ReadDataTable(sqlStatement, "TM_メニューデータ_CHILD"); foreach (DataRow dr in dt_children.Rows) { //--- JSONノード化 --- node = createJsonMenuNode(dr, dt_children.Columns); if (Convert.ToBoolean(dr["末尾フラグ"]) == true) { // NOP } else { node += ",children:["; //--- 再帰呼び出し --- node += searchLeafData(dr["メニューコード"].ToString()); node += "]"; } nodes += addNodeSeparator(node, "{", "},"); } nodes = trimEndToken(nodes, ","); result = nodes; return result; }
private static string createJsonMenuNode(DataRow dr, DataColumnCollection dcCollenction) { string result = ""; //--- 初期化 --- string nodeinfo = ""; foreach (DataColumn dc in dcCollenction) { switch (dc.ToString()) { case "メニューコード": nodeinfo = nodeinfo + "id:" + "'menu_" + dr[dc] + "'" + ","; break; case "項目名": nodeinfo = nodeinfo + "text:" + "'" + dr[dc] + "'" + ","; break; case "末尾フラグ": nodeinfo = nodeinfo + "leaf:" + dr[dc] + ","; break; case "ドラッグ設定": nodeinfo = nodeinfo + "draggable:" + dr[dc] + ","; break; } } //--- 末尾カンマ排除 --- if (nodeinfo.EndsWith(",")) { nodeinfo = nodeinfo.Substring(0, nodeinfo.Length - 1); } //--- 終期化 --- result = nodeinfo; return result; }
private static string addNodeSeparator(string node, string start_token, string end_token) { node = node.Insert(0, start_token); node = node.Insert(node.Length, end_token); return node; }
private static string trimEndToken(string token, string trinToken) { //--- 末尾カンマ排除 --- if (token.EndsWith(trinToken)) { token = token.Substring(0, token.Length - 1); } return token; }
さて、このツリーからクリックされたら指定URIをタブを追加して
表示するというのはまた今度。
今日得たこと。
①ASP.NET側でのDBアクセスモジュール
②ExtからLoader指定でaspx指定し、DBデータを取得できていること。
①、②でDataSet→JSONはすでにあるし、
Gridのサンプルはあるのでこれで少しはさきにすすめるかな。
まずまずの進捗だね。
あ。もうひとつ。
せっかく作ったJSONデータ、aspxからResponse.Writeしてるのに
なんでひょうじされんのじゃ。
ってはまった。
Response.End()してないでやんの。
子一時間、右往左往してました。
はぁ。