C#で、テキストファイルをドラッグ&ドロップで入力する
前回の続きっぽい。
CSVときたら、次はファイル入出力でしょ。
環境
Windows 7 Pro
Visual Studio 2010
参考にしたサイトは
C#で作る、あなただけのメモ帳 ~ドラッグ・アンド・ドロップ機能の実装~ - 帝国の野望ブログ - ものえおさむ - builder
まず、Windowsフォームアプリケーションを作るのは当たり前。
GUI部分の準備開始。
フォームにドロップした時点でファイルを読みたいなら
フォームのプロパティを選択しAllowDropをTrueにする。(これ大事!)
フォームのイベントハンドラ(雷マーク)の
DragDropイベントとDragEnterイベントをダブルクリックしてイベントを生成する。
今回は読み込んだテキストファイルのテキストをRichTextBoxで表示させるので、
フォームのコンポーネントに追加しておく。
これでGUIの準備は完了。
次はソース部分。
今回は、File関連のラッパークラス(?)としてmyFile.csを作ったので、まずそれを読み込む事にする。
プロジェクトに下記のクラスを作成。
クラスの追加について詳しくは
C#で、プロジェクトにクラスを追加する
を参照。
myFile.cs
using System; using System.Text; using System.Windows.Forms; namespace WindowsFormApplication1 { class MyFile { // fileNumは複数ドロップされた時、何番目のファイルパスを読み込むかを決める。 // ファイルパスは配列で入って来る。普通は最初のだから0を指定。 public string returnfilePath(DragEventArgs e, int fileNum) { string[] dragFilePathArr = (string[])e.Data.GetData(DataFormats.FileDrop, false); string filePath = dragFilePathArr[fileNum]; return filePath; } public bool checkFileType(string filePath) { //読み込みを許可するファイルの拡張子を指定 (app.config に定義した方が本当は便利。) string[] extnArray = { "txt", "cs", "vb", "htm", "html", "xml", "csv", "js", "vbs", "wsh" }; foreach (string extn in extnArray) { int dotLen = extn.Length; if (extn == filePath.Substring(filePath.Length - dotLen, dotLen)) { return true; } } return false; } public bool isDropedFileAccessible(DragEventArgs e) { //ドラッグされたのがファイルであるか確認 if ((e.Data.GetDataPresent(DataFormats.FileDrop))) { //ドラッグされたデータを受け取る return true; } else { //ドラッグされたデータを受け取らない return false; } } } }
あとはProgram.csの各イベントにソースを追加する。
using節にIOの追加を忘れずに。
今回のフォーム名はMainForm.csにしているので注意。
Program.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; //これの追加を忘れない using System.IO; namespace WindowsFormApplication1 { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } // 自分用のファイルクラスの読込 MyFile myFile = new MyFile(); private void MainForm_DragDrop(object sender, DragEventArgs e) { string fileName = myFile.returnfilePath(e, 0); if (myFile.checkFileType(fileName)) { richTextBox1.Text = File.ReadAllText(fileName, Encoding.Default); } } private void MainForm_DragEnter(object sender, DragEventArgs e) { //ドラッグされたのがファイルであるか確認 if (myFile.isDropedFileAccessible(e)) { //ドラッグされたデータを受け取る e.Effect = DragDropEffects.All; } else { //ドラッグされたデータを受け取らない e.Effect = DragDropEffects.None; } } } }
これで再生ボタンから実行すれば動作が確認できるはずだ。