質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

1回答

1961閲覧

treeViewに相対パス以下のデータを表示し、追加削除できるようにしたいです。

estcube

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2018/12/30 14:59

編集2018/12/31 07:33

現在 Visual C# で勉強中のものです。
Visual C#で、TreeViewを用いたメモ帳の作成をしています。

参考にしているメモ帳は Mac のメモです。
NewProject Project でディレクトリを作ります。
File でファイルを作ります。

ディレクトリもファイルも、作る際に、ノードを増やしてからそのまま保存という風にしたいので、以下のメソッドを作りました。

現在出来ているところは、ディレクトリの保存と、ファイルの保存です。

カレントディレクトリを string型 で作っているので、string WorkSpace を使って、Formの展開時に、相対パスの下にあるデータを呼び出し、二次元配列で適切な場所に配置し、メモをいつでも開いて編集。みたいなことをしたいと思っています。

ですが、理屈は大体わかるのですが、やり方がわかりません。
テキストファイルのデータなら、StreamReader とかを使うのですが、
TreeView の TreeNode に 自動的に Add したりするためには、どういうコードを描くのが良いのでしょうか。

以下のコードは保存の際に使うメソッドです。
コンテキストメニューには、
New Project //相対パス直下のセレクトできない場所に作るディレクトリ
Project //エクスプローラのように増やしていけるディレクトリ
File //txtファイル

の3つがあり、Make して Save するという流れで、そのまま保存できるようにしました。

C#

1 int pnum = 0; //無名projectの一時判別用 2 int fnum = 0; //無名fileの一時判別用 3 string CurrentDirectory = System.IO.Directory.GetCurrentDirectory(); 4 TreeNode ftn; 5 6 void MakeNewProject() 7 { 8 TreeNode tn = new TreeNode(); 9 if (tb.Text != "") 10 { 11 tn.Text = tb.Text; 12 } 13 else 14 { 15 pnum += 1; 16 tn.Text = "new project( " + pnum.ToString() + " )"; 17 } 18 tv.Nodes.Add(tn); 19 ftn = tn; 20 } 21 22 void SaveNewProject() 23 { 24 TreeNode tn = ftn; 25 string ProjectName = tn.Text; 26 string WorkSpace = CurrentDirectory + "../../../../memo/"; 27 System.IO.DirectoryInfo di = System.IO.Directory.CreateDirectory(WorkSpace + ProjectName); 28 } 29 30 void MakeProject() 31 { 32 TreeNode tn = new TreeNode(); 33 if (tb.Text != "") 34 { 35 tn.Text = tb.Text; 36 } 37 else 38 { 39 pnum += 1; 40 tn.Text = "new project( " + pnum.ToString() + " )"; 41 } 42 tv.SelectedNode.Nodes.Add(tn); 43 ftn = tn; 44 } 45 46 void SaveProject() 47 { 48 TreeNode tn = ftn; 49 string ProjectName = tn.Text; 50 string WorkSpace = CurrentDirectory + "../../../../memo/"; 51 tv.PathSeparator = "\"; 52 System.IO.DirectoryInfo di = System.IO.Directory.CreateDirectory(WorkSpace + tv.SelectedNode.FullPath + "\" + ProjectName); 53 } 54 55 void MakeFile() 56 { 57 TreeNode tn = new TreeNode(); 58 if(tb.Text != "") 59 { 60 tn.Text = tb.Text; 61 } 62 else 63 { 64 fnum += 1; 65 tn.Text = "new document( " + fnum.ToString() + " )"; 66 } 67 tv.SelectedNode.Nodes.Add(tn); 68 } 69 70 void SaveFIle() 71 { 72 TreeNode tn = ftn; 73 string FileName = tn.Text; 74 string WorkSpace = CurrentDirectory + "../../../../memo/"; 75 if(tv.SelectedNode != null) 76 { 77 tv.PathSeparator = "\"; 78 string FilePath = WorkSpace + tv.SelectedNode.FullPath + "\" + FileName + ".txt"; 79 using (System.IO.FileStream hStream = System.IO.File.Create(FilePath)) 80 { 81 if (hStream != null) 82 { 83 hStream.Close(); 84 } 85 } 86 87 System.IO.StreamWriter sw = new System.IO.StreamWriter( 88 FilePath, 89 false, 90 System.Text.Encoding.GetEncoding("shift_jis") 91 ); 92 sw.Write(rtb.Text); 93 sw.Close(); 94 } 95 else 96 { 97 98 } 99 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2018/12/30 16:08

データとは何なのか、保存とは何をどう保存するのか等、第三者からは分かりません。 Form展開時とは、作成されているアプリを起動するということですか?何かアプリ上での画面遷移で、一旦TreeViewがあるFormを閉じて、再度そのFormを開いた時ですか? 第三者でも理解できるよう説明するか、コードを示して説明するかしてください。
estcube

2018/12/31 03:00

ご回答ありがとうございます。 お見苦しい文章で大変申し訳ないと思います。 コードに関しましては、保存までしかできておらず、そもそもどのように作るのかが知りたかっただけなので、載せようにも載せられませんでした。 ご回答ありがとうございました。
guest

回答1

0

どこでデータを作っているか知りませんが、開いた時に作るよう変更してください。
そうすれば開くたびにデータが作成されます。

投稿2018/12/30 22:02

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/12/30 22:04

他のプロセスから自由に変更できるファイルシステムが対象なので、本来はファイルの変更を監視して変更があるたびに読み直すのが理想です。
estcube

2018/12/31 03:23

ご回答ありがとうございます。 私の頭では2つほどわからない点がありました。 1つ目は、開いた時に string型 の二次元配列を作るか、 int型 の二次元配列を作るかして、変更があるたびに配列の中身が入れ替わる仕組みを作ればいいという解釈なのでしょうか。 2つ目は、1つ目で二次元配列のデータを作れたとして、それを treeNode に追加するには、何かイベントがあるのでしょうか?と言う点です。  失礼ながら、テキストファイルの内容を表示する事くらいしかファイルの中身を見るという事をしたことが無いので、どういう風にしたらいいか、よくわかりません。
Zuishin

2018/12/31 03:25

質問に書いてある「ここまでできた」という部分と矛盾するように感じますが、実際どこまでできたのですか?
Zuishin

2018/12/31 04:09

見づらいし他の回答者からも見えにくいので質問を編集してコードブロックを使って追記してください。
estcube

2018/12/31 05:22

ご回答ありがとうございます。 ご指摘ありがとうございます。 質問に自分の作ったコードを載せました。 先のコメント(長いコードの描いているコメント)は削除致します。
Zuishin

2018/12/31 05:42

tv は TreeView ですか? tb は何でしょう? これらのメソッドにはどんな意味があり、どこからどう呼ばれているのですか?
estcube

2018/12/31 05:57

ご回答ありがとうございます。 tv は treeView です。 tb は TextBox です。 rtb は RichTextBox です。 コンテキストメニューの New Project Project File というボタンを推すと、対応したメソッドが、Make 、 Save と言う順番で実行できるようにしています。 Make は tv の ノードに追加するために作りました。New Project の存在意義は、ノードのセレクトが外れなかったので、相対パスより一つ下の親ノードを作るために設けています。 Save は、保存するためです。 string CurrentDirectory = System.IO.Directory.GetCurrentDirectory(); で、string型のカレントディレクトリを作り、Save事に相対パスとしてstring WorkSpaceを作りました。
Zuishin

2018/12/31 06:11

Project というのがディレクトリで File がファイルということですか?
estcube

2018/12/31 06:14

ご回答ありがとうございます。 大丈夫です。 私がディレクトリと言う言葉を知っていたらもう少し楽に答えられていたかもしれません。
Zuishin

2018/12/31 06:14

ftn にはどういう意味がありますか?
Zuishin

2018/12/31 06:17

また、保存するのは一項目ずつ指定して保存する仕様になっていますが、通常は保存ボタン一つでそれまで編集したものがすべて保存される仕様のものが多いと思います。これを採用しないのは何か意味があってのことですか?
estcube

2018/12/31 06:28

ご回答ありがとうございます。 ftn は FocusTreeNode のイニシャルを取った変数名です。 今見ているノードを返すだけです。 tb は ディレクトリ名とファイル名を決める役割を持っていて、 rtb は 現在はテキストドキュメント?(ファイルの中の文字データ)を保存する為だけに存在しています。 ノード追加時に ノードを作り、作ったノードを ftn に 代入します。 そして、Save の時に、ftn からタイトル等を取得する流れになっています。
estcube

2018/12/31 06:35

ご回答ありがとうございます。 また、保存するのは一項目ずつ指定して保存する仕様になっていますが、通常は保存ボタン一つでそれまで編集したものがすべて保存される仕様のものが多いと思います。これを採用しないのは何か意味があってのことですか? はい。これは簡単なメモソフトでして、言ってしまえば Mac のメモの類似品みたいなものです。TreeView のようなデザインに憧れを抱いていましたので TreeView を使っています。 保存ボタンという機能を最初は考えましたが、手軽に使えるという事を考えていたので、ノードの追加時に勝手に保存しようと思って作りました。 フォームを閉じるときに一斉に保存したらいいという考えもあったのですが、今のレベルでは多分コードを描くことができないと思いました。
Zuishin

2018/12/31 06:47

つまりノードを追加して保存ボタンを押すのではなく、ノードの追加と同時に保存されるということですね? なるほど理解しました。 かなり勘違いをしていたようです。 これから出なければいけないので時間がありませんが、時間が取れたらサンプルを出してみたいと思います。回答へのコメントではなく質問を整理しておくと他の人の回答があるかもしれません。
estcube

2018/12/31 06:51

ご回答ありがとうございます。 ありがとうございました。 自分の説明力が低いことが知れてよかったです。 サンプル、楽しみにしています! 本日は、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問