[基础文章]浅谈文件拖放
.NetFramework2.0中为我们提供好了丰富的"后台资源",以便提高我们的编程效率.这里本人也结合自己做的聊天程序(见置顶文章)中遇到的问题来浅谈一下文件拖放.
步奏:
1、将拖放目标控件AllowDrop属性设置为True(并不是所有的控件都支持文件拖放哦^_^)
this.AllowDrop=True;
2、写拖放目标控件的DragEnter事件。private void Frm_Chat_DragEnter(object sender, DragEventArgs e)
{
if (listBox.SelectedIndex != -1)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Link;
}
else
{
e.Effect = DragDropEffects.None;
}
}
else
{
MessageBox.Show("请选择一个用户");
}
}
3、写拖放目标控件的DragDrop事件{
if (listBox.SelectedIndex != -1)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Link;
}
else
{
e.Effect = DragDropEffects.None;
}
}
else
{
MessageBox.Show("请选择一个用户");
}
}
private void Frm_Chat_DragDrop(object sender, DragEventArgs e)
{
if (listBox.SelectedIndex != -1)
{
//关键语句
receiveFileName = ((Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
string[] filename = sendFile.Split('\\');
//MessageBox.Show(filename[filename.Length - 1]);
string text = "FILE|" + listBox.SelectedItem.ToString() + "|" + username + "|" + filename[filename.Length - 1] + "|RQ|";
byte[] buffer = System.Text.Encoding.Default.GetBytes(text);
Form1.netStream.Write(buffer, 0, buffer.Length);
btnFileTrans.Enabled = false;
}
else
{
MessageBox.Show("请选择一个用户");
}
}
到此,一个简单的文件拖放功能可以算是完成了。但是在实际应用中常常会出现“DragDrop注册失败”异常,这个问题是由于目标控件是在另外一个独立线程中打开。解决方法也很简单,只需表明当前线程为单线程单元即可。{
if (listBox.SelectedIndex != -1)
{
//关键语句
receiveFileName = ((Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
string[] filename = sendFile.Split('\\');
//MessageBox.Show(filename[filename.Length - 1]);
string text = "FILE|" + listBox.SelectedItem.ToString() + "|" + username + "|" + filename[filename.Length - 1] + "|RQ|";
byte[] buffer = System.Text.Encoding.Default.GetBytes(text);
Form1.netStream.Write(buffer, 0, buffer.Length);
btnFileTrans.Enabled = false;
}
else
{
MessageBox.Show("请选择一个用户");
}
}
Thread loadThread = new Thread(new ThreadStart(Connect));
loadThread.IsBackground = true;
//表明将当前线程设置为单线程单元
loadThread.ApartmentState = ApartmentState.STA;
loadThread.Start();
loadThread.IsBackground = true;
//表明将当前线程设置为单线程单元
loadThread.ApartmentState = ApartmentState.STA;
loadThread.Start();
SIGNATRUE-----------------------------------
龟看上去很慢很慢,而且还有些憨,虽然没有兔子跑的快,但是只要有坚持不懈的毅力,就一定会到达成功的比彼岸.如果自己是龟,就不要试图把自己变成兔子,我就是那只憨龟。
龟看上去很慢很慢,而且还有些憨,虽然没有兔子跑的快,但是只要有坚持不懈的毅力,就一定会到达成功的比彼岸.如果自己是龟,就不要试图把自己变成兔子,我就是那只憨龟。