[基础文章]浅谈文件拖放

.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事件
 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注册失败”异常,这个问题是由于目标控件是在另外一个独立线程中打开。解决方法也很简单,只需表明当前线程为单线程单元即可。
   Thread loadThread = new Thread(new ThreadStart(Connect));
           loadThread.IsBackground 
= true;
           
//表明将当前线程设置为单线程单元
           loadThread.ApartmentState = ApartmentState.STA;
           loadThread.Start();

posted on 2008-05-21 09:28  seek  阅读(511)  评论(1编辑  收藏  举报

导航