Winforms 拖放不';行不通

Winforms 拖放不';行不通,winforms,c#-3.0,Winforms,C# 3.0,在windows窗体中,我有Listview和FlowLayoutPanel 我想从Listview拖动到FlowLayoutPanel,以便 在listview中,我使用DragEnter事件 private void listViewGUI_DragEnter(object sender, DragEventArgs e) { } 在FlowLayoutPanel中,我激活了DragDrop private void fpnlDisplayedGUI_DragDrop(ob

在windows窗体中,我有Listview和FlowLayoutPanel

我想从Listview拖动到FlowLayoutPanel,以便

在listview中,我使用DragEnter事件

private void listViewGUI_DragEnter(object sender, DragEventArgs e)
        {
}
在FlowLayoutPanel中,我激活了DragDrop

private void fpnlDisplayedGUI_DragDrop(object sender, DragEventArgs e)
        {
}
问题是,如果他们中的任何一个人不输入任何事件,那么它就不起作用了。你知道如何让他们输入吗?我是否缺少任何属性


致意

以下是一个简单的示例,展示您所需的基本知识:

public Form1()
{
    InitializeComponent();

    panel1.MouseDown += new MouseEventHandler(panel1_MouseDown);
    panel2.AllowDrop = true;
    panel2.DragEnter += new DragEventHandler(panel2_DragEnter);
    panel2.DragDrop += new DragEventHandler(panel2_DragDrop);
}

void panel2_DragDrop(object sender, DragEventArgs e)
{
    //handle the drop here.
}

void panel2_DragEnter(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Move;
}

void panel1_MouseDown(object sender, MouseEventArgs e)
{
    panel1.DoDragDrop("whatever you want draged.", DragDropEffects.Move);
}

以下是一个简单的示例,展示了您所需的基本知识:

public Form1()
{
    InitializeComponent();

    panel1.MouseDown += new MouseEventHandler(panel1_MouseDown);
    panel2.AllowDrop = true;
    panel2.DragEnter += new DragEventHandler(panel2_DragEnter);
    panel2.DragDrop += new DragEventHandler(panel2_DragDrop);
}

void panel2_DragDrop(object sender, DragEventArgs e)
{
    //handle the drop here.
}

void panel2_DragEnter(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Move;
}

void panel1_MouseDown(object sender, MouseEventArgs e)
{
    panel1.DoDragDrop("whatever you want draged.", DragDropEffects.Move);
}

如果将DragEnter事件置于错误的控件上,则必须使用面板的。我想我知道你是怎么陷入这个麻烦的,ListView没有任何事件表明用户开始拖动项目。你需要自己综合这些。基本方法是记录鼠标的向下位置,并使用MouseMove事件检查用户是否已将鼠标移动到足以开始拖动的程度。像这样:

    private Point dragMousePos;

    private void listView1_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) dragMousePos = e.Location;
    }

    private void listView1_MouseMove(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) {
            int dx = Math.Abs(e.X - dragMousePos.X);
            int dy = Math.Abs(e.Y - dragMousePos.Y);
            if (dx >= SystemInformation.DoubleClickSize.Width ||
                dy >= SystemInformation.DoubleClickSize.Height) {
                var item = listView1.GetItemAt(dragMousePos.X, dragMousePos.Y);
                if (item != null) listView1.DoDragDrop(item, DragDropEffects.Move);
            }
        }
    }

如果将DragEnter事件置于错误的控件上,则必须使用面板的。我想我知道你是怎么陷入这个麻烦的,ListView没有任何事件表明用户开始拖动项目。你需要自己综合这些。基本方法是记录鼠标的向下位置,并使用MouseMove事件检查用户是否已将鼠标移动到足以开始拖动的程度。像这样:

    private Point dragMousePos;

    private void listView1_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) dragMousePos = e.Location;
    }

    private void listView1_MouseMove(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) {
            int dx = Math.Abs(e.X - dragMousePos.X);
            int dy = Math.Abs(e.Y - dragMousePos.Y);
            if (dx >= SystemInformation.DoubleClickSize.Width ||
                dy >= SystemInformation.DoubleClickSize.Height) {
                var item = listView1.GetItemAt(dragMousePos.X, dragMousePos.Y);
                if (item != null) listView1.DoDragDrop(item, DragDropEffects.Move);
            }
        }
    }