Перетащить файл в текстовое поле
Я хочу перетащить файл, чтобы текстовое поле отображало полный путь к файлу. Я использовал события перетаскивания и перетаскивания, но обнаружил, что они не входят в события.
private void sslCertField_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true)
{
e.Effect = DragDropEffects.All;
}
}
private void sslCertField_DragEnter(object sender, DragEventArgs e)
{
string file = (string)e.Data.GetData(DataFormats.FileDrop);
serverURLField.Text = file;
}
Может ли кто-нибудь указать, что я делаю неправильно?
UPDATE: не работает, если программа установлена для запуска с повышенными разрешениями (vista/win 7)
Ответы
Ответ 1
Проверьте свойство AllowDrop
вашего текстового поля - оно должно быть установлено на true
.
Кроме того, конвертируйте данные перетаскивания в string[]
в случае DataFormats.FileDrop
, а не только string
:
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
if(files != null && files.Length != 0)
{
serverURLField.Text = files[0];
}
И я думаю, вы должны поменять код в обработчиках событий перетаскивания - обычно вы показываете пользователю, что перетаскивание возможно в DragEnter
и выполнять фактическую операцию на DragDrop
.
Ответ 2
Повышенные привилегии не должны иметь к этому никакого отношения. Вам также необходимо реализовать событие DragOver
в дополнение к DragDrop
, на которое ответил Макс. Это код, который следует добавить для DragDrop:
private void textBoxFile_DragOver(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
Ответ 3
Не запускайте его из visual studio... запустите .exe, который создается после создания вашего решения. Надеюсь, что это поможет:)
Ответ 4
Если вы используете WPF, и он по-прежнему не работает с ответами здесь (это был мой случай), вам нужно использовать
e.Handled = true;
в событии PreviewDragEnter
, как описано здесь и здесь (это одна и та же статья, но на всякий случай идет вниз).
Вот фрагмент кода из этого источника:
private void TextBox_PreviewDragEnter(object sender, DragEventArgs e)
{
e.Effects = DragDropEffects.Copy;
e.Handled = true;
}
private void TextBox_PreviewDrop(object sender, DragEventArgs e)
{
object text = e.Data.GetData(DataFormats.FileDrop);
TextBox tb = sender as TextBox;
if (tb != null)
{
tb.Text = string.Format("{0}", ((string[])text)[0]);
}
}
Ответ 5
Если ваша визуальная студия работает под правами администратора, функция перетаскивания кажется неработоспособной.
= > Запустите визуальную студию без прав администратора, и она будет работать