テキストボックスにファイルのパスを手作業で入力する。不便だと思いませんか? ここではファイルをドラッグするとパスが入力されるテキストボックスを作成します。またファイルをコピーしている状態でペーストしてもファイルパスが入力されるテキストボックスを作成します。
Contents
簡単な説明
クラスの名前はFilePathTextBoxとします。
ドラッグされたファイルやコピーされているファイルが複数のときはなにもおきません。AllowOnlyFilePathプロパティで通常の文字列がドロップされたりペーストされた場合は対応するしないかを選択できるようにします。
DragOverイベントが発生したらドラッグされているものがファイルであるかどうか調べて、ドロップ可能かどうかが視覚的にわかるようにしています。そしてドロップされたらテキストボックス内にファイルパス(フォルダパスにも対応)を表示させます。
クリップボードからのペーストの場合、クリップボードのデータが何かをしらべてペースト可能なものであればペーストします。
AllowOnlyFilePath == falseのときにリッチテキストデータをドラッグ&ドロップするとテキストが表示されるようにゴニョゴニョしています。
ファイルパスを入力する前提のテキストボックスなのでドロップ、ペーストをするとテキストボックス内の文字列がすべて変更されます。
独自に作成したプロパティ
AllowOnlyFilePath
trueにするとD&Dとペーストではファイルパス、フォルダパスしか自動入力されない
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
public class FilePathTextBox : TextBox { public FilePathTextBox() { this.AllowDrop = true; } public bool AllowOnlyFilePath { get; set; } = true; protected override void OnDragOver(DragEventArgs e) { if(e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); if(files.Length == 1) e.Effect = DragDropEffects.Copy; } else if(! AllowOnlyFilePath) { if(e.Data.GetDataPresent(DataFormats.Text) || e.Data.GetDataPresent(DataFormats.UnicodeText) || e.Data.GetDataPresent(DataFormats.Rtf)) e.Effect = DragDropEffects.Copy; } else e.Effect = DragDropEffects.None; } protected override void OnDragDrop(DragEventArgs e) { if(e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); if(files.Length == 1) this.Text = files[0]; } else if(!AllowOnlyFilePath) { if(e.Data.GetDataPresent(DataFormats.Text)) { string str = (string)e.Data.GetData(DataFormats.Text); this.Text = str; } else if(e.Data.GetDataPresent(DataFormats.UnicodeText)) { string str = (string)e.Data.GetData(DataFormats.UnicodeText); this.Text = str; } else if(e.Data.GetDataPresent(DataFormats.Rtf)) { string str = (string)e.Data.GetData(DataFormats.Rtf); RichTextBox rich = new RichTextBox(); rich.Rtf = str; this.Text = rich.Text; rich.Dispose(); } } } protected override void OnKeyDown(KeyEventArgs e) { if((e.KeyCode == Keys.V && e.Control) || (e.KeyCode == Keys.Insert && e.Shift)) { e.SuppressKeyPress = true; Paste(); } base.OnKeyDown(e); } new public void Paste() { if(Clipboard.ContainsFileDropList()) { var files = Clipboard.GetFileDropList(); if(files.Count == 1) { this.Text = files[0]; } } else if(!AllowOnlyFilePath) { if(Clipboard.ContainsText()) { this.Text = Clipboard.GetText(); } } } } |
使い方
上段に貼り付けているのは先ほど作成したFilePathTextBoxです。下のチェックボックスは普通のチェックボックスです。
このサンプルではチェックボックスでファイルパスではない通常の文字列もドロップまたはペーストできるか設定できるようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); checkBoxOnlyFileOrFolderPath.CheckedChanged += CheckBoxOnlyFileOrFolderPath_CheckedChanged; checkBoxOnlyFileOrFolderPath.Checked = filePathTextBox1.AllowOnlyFilePath; } private void CheckBoxOnlyFileOrFolderPath_CheckedChanged(object sender, EventArgs e) { if(checkBoxOnlyFileOrFolderPath.Checked) filePathTextBox1.AllowOnlyFilePath = true; else filePathTextBox1.AllowOnlyFilePath = false; } } |