2008年3月17日月曜日

ExtJs-8 DBとメニューと

さて、チョコチョコとサンプルを触ってきて


本実装を開始しようかと思っています。。


何を作ろうか。というか、決まってる。


自分用のデスクトップツールを作ろう。





じゃ、メニューを作ろう。


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()してないでやんの。
子一時間、右往左往してました。

はぁ。

0 件のコメント: