【IT168技术文档】
.NetFramework2.0中为我们提供好了丰富的"后台资源",以便提高我们的编程效率.这里本人也结合自己做的聊天程序(见置顶文章)中遇到的问题来浅谈一下文件拖放.
步奏:
1、将拖放目标控件AllowDrop属性设置为True(并不是所有的控件都支持文件拖放哦^_^)
2、写拖放目标控件的DragEnter事件。this.AllowDrop=True;
3、写拖放目标控件的DragDrop事件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("请选择一个用户"); } }
到此,一个简单的文件拖放功能可以算是完成了。但是在实际应用中常常会出现“DragDrop注册失败”异常,这个问题是由于目标控件是在另外一个独立线程中打开。解决方法也很简单,只需表明当前线程为单线程单元即可。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("请选择一个用户"); } }
Thread loadThread = new Thread(new ThreadStart(Connect)); loadThread.IsBackground = true; //表明将当前线程设置为单线程单元 loadThread.ApartmentState = ApartmentState.STA; loadThread.Start();