Memo Tree View

Memo アプリのデーターファイルを Tree View に登録します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. SplitContainer を使ってウインドウに TreeView と RichTextBox を貼り付けます。
    ウインドウのレイアウトは Layout を参照して下さい。
    Memo2 アプリのデーターファイル(memo2.mem)を切り分けて ArrayList に格納します。
    ArrayList に格納は memo Read File を参照して下さい。
    ArrayList の t_lev, t_ttl を参照して TreeView に登録します。
  2. CSForm.cs のソースコードの抜粋です。
    t_ で始まる領域は ArrayList です。
    m_ で始まる領域はプログラム全体に共通する大域変数です。
    領域の定義は memo Guide を参照して下さい。
    /*★ Tree View にタイトルを表示    前田 稔 ★*/
        ・・・
    //using System.Management;
    using System.IO;            // for File, StreamReader
    using System.Text;          // for Encoding
    using System.Collections;   // ArrayList
    
    public class MyForm : Form
    {
        private     MenuStrip menuStrip1;
        private     ToolStrip toolStrip1;
        private     SplitContainer splitContainer1;
        private     TreeView treeView1;
        private     RichTextBox richTextBox1;
        private     TextBox Title;
        ArrayList   t_lev = new ArrayList();    // Level
        ArrayList   t_ttl = new ArrayList();    // Title
        ArrayList   t_ymd = new ArrayList();    // YYMMDD
        ArrayList   t_txt = new ArrayList();    // Text Data
        ArrayList   t_node = new ArrayList();   // TreeView node
        int         m_Idx;                      // Table Index
    
        public MyForm()
        {
            InitializeComponent();
            this.Resize += new System.EventHandler(this.FormResize);
            this.Load += new System.EventHandler(MyForm_Load);
        }
    
        // アプリケーションの初期化
        private void MyForm_Load(object sender, System.EventArgs e)
        {
            ReadFile("C:\\TMP\\test2.mem");
            m_Idx = 0;
            treeView1.TopNode.Expand();
        }
    
        //  memo2.mem を切り分けて ArrayList に格納する
        private void ReadFile(string file)
        {
            StreamReader reader;
            string str;
            int pt, wk;
    
            reader = new StreamReader(file, Encoding.GetEncoding("Shift_JIS"));
            str = reader.ReadToEnd();
            reader.Close();
            if (str[0] != '@') str = str.Replace("", "@");
    
            t_lev.Clear();
            t_ttl.Clear();
            t_ymd.Clear();
            t_txt.Clear();
            t_node.Clear();
            pt = str.IndexOf("@@");
            if (pt < 0)
            {
                MessageBox.Show("memo file ではありません", "Error");
                return;
            }
            for (pt = 0; pt < str.Length; )
            {
                pt = str.IndexOf("@@", pt);
                if (pt < 0) break;
                for (wk = pt; str[pt] == '@'; pt++) ;
                t_lev.Add(pt - wk);
                for (wk = pt; str[pt] != ':'; pt++) ;
                t_ttl.Add(str.Substring(wk, pt - wk));
                pt++;
                for (wk = pt; str[pt] != '\n'; pt++) ;
                t_ymd.Add(str.Substring(wk, pt - wk));
                pt++;
                wk = pt;
                pt = str.IndexOf("@@", wk);
                if (pt < 0) pt = str.Length;
                t_txt.Add(str.Substring(wk, pt - wk));
            }
            treeView1.Nodes.Clear();
            m_Idx = 0;
            Set_TVFunc(treeView1, 2);
        }
    
        // TreeView に登録する関数(lev=2 で呼ばれる)
        private void Set_TVFunc(TreeView node, int lev)
        {
            TreeNode wk;
            int key;
    
            if (m_Idx >= t_ttl.Count) return;
            key = (int)t_lev[m_Idx];
            if (key == 2)
            {
                t_node.Add(new TreeNode((string)t_ttl[m_Idx]));
                node.Nodes.Add((TreeNode)t_node[m_Idx]);
                m_Idx++;
                Set_TVFunc(node, key);
            }
            if (key > lev)
            {
                wk = node.TopNode;
                while (wk.NextNode != null) wk = wk.NextNode;
                Set_TVFunc(wk, key);
            }
            if (key == lev) Set_TVFunc(node, lev);
        }
    
    
        // TreeView に登録する再帰関数
        private void Set_TVFunc(TreeNode node, int lev)
        {
            int key;
    
            if (m_Idx >= t_ttl.Count) return;
            key = (int)t_lev[m_Idx];
            //Console.WriteLine("lev=" + lev + "  key=" + key + "  m_Idx=" + m_Idx);
            if (key == lev)
            {
                t_node.Add(new TreeNode((string)t_ttl[m_Idx]));
                node.Nodes.Add((TreeNode)t_node[m_Idx]);
                m_Idx++;
                Set_TVFunc(node, lev);
            }
            if (key > lev) Set_TVFunc(node.LastNode, key);
            // 関数が return すると、ここに制御が戻ります
            if (key == lev) Set_TVFunc(node, lev);
        }
    }
    
    class form01
    {
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    
  3. MyForm() でプログラムをロードするときに一度だけ呼ばれる MyForm_Load を設定します。
        public MyForm()
        {
            InitializeComponent();
            this.Resize += new System.EventHandler(this.FormResize);
            Load += new System.EventHandler(MyForm_Load);
        }
    
  4. MyForm_Load() 関数から ReadFile() を呼び出して test2.mem を切り分けて ArrayList に格納します。
    テストするときは C:\TMP\ のフォルダーに test2.mem ファイルを格納して下さい。
        private void MyForm_Load(object sender, System.EventArgs e)
        {
            ReadFile("C:\\TMP\\test2.mem");
            treeView1.TopNode.Expand();
        }
    
  5. ReadFile() 関数から Set_TVFunc() で ArrayList を TreeView に展開します。
        //  memo2.mem を切り分けて ArrayList に格納する
        private void ReadFile(string file)
        {
            StreamReader reader;
    
            ・・・
    
            treeView1.Nodes.Clear();
            m_Idx = 0;
            Set_TVFunc(treeView1, 2);
        }
    
  6. TreeView に登録する Set_TVFunc() 関数です。
    TreeView を引数にする関数と TreeNode を引数にする関数を使い分けています。
    詳細は Struct を tree view に登録 を参照して下さい。
        // TreeView に登録する関数(lev=2 で呼ばれる)
        private void Set_TVFunc(TreeView node, int lev)
        {   ・・・
        }
    
        // TreeView に登録する再帰関数
        private void Set_TVFunc(TreeNode node, int lev)
        {   ・・・
        }
    

[Next Chapter ↓] RichTextBox
[Previous Chapter ↑] Layout

超初心者のプログラム入門(C# Frame Work)