所以我有一个richtextbox和一个表单,并附加了一个拖放输入和放下事件。我已经确定它们的代码完全相同,但是由于某些原因,richtextbox事件激活了Text Changed事件。表单也将激活文本更改事件,但是我从阻止它的拖动事件调用的方法中有一个变量。我试图以另一种形式重现它,但是主要的缺点是表单拖放事件的代码与richtextbox拖放事件完全相同。它们怎么可能不同?这是放置代码:
private void TestBox_DragEnter(object sender,DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
}
private async void TestBox_DragDrop(object sender,DragEventArgs e)
{
string filePath = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
await AsyncStuff();
}
private async Task AsyncStuff()
{
block = true;
await OtherAsyncMethodThatactivatesTextChanged();
block = false;
}
private bool block;
private void TestBox_TextChanged(object sender,EventArgs e)
{
if (block) return;
MessageBox.Show("Text Changed called"); //activates on the richtextbox drag,doesn't on the form
}
我现在可以复制它,这是代码。我附加了表单拖放并通过设计器输入事件。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
richTextBox1.AllowDrop = true;
richTextBox1.TextChanged += TestBox_TextChanged;
richTextBox1.DragDrop += TestBox_DragDrop;
richTextBox1.DragEnter += TestBox_DragEnter;
AllowDrop = true;
}
private void TestBox_DragEnter(object sender,DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
}
private async void TestBox_DragDrop(object sender,DragEventArgs e)
{
string filePath = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
await AsyncStuff();
}
private async Task AsyncStuff()
{
block = true;
richTextBox1.AppendText("asd");
block = false;
}
private bool block;
private void TestBox_TextChanged(object sender,EventArgs e)
{
if (block) return;
MessageBox.Show("Text Changed called"); //activates on the richtextbox drag,doesn't on the form
}
private async void Form1_DragDrop(object sender,DragEventArgs e)
{
string filePath = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
await AsyncStuff();
}
private void Form1_DragEnter(object sender,DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
}
}