C# 将listview中的项目拖动到表单中

C# 将listview中的项目拖动到表单中,c#,winforms,listview,drag-and-drop,telerik,C#,Winforms,Listview,Drag And Drop,Telerik,我有两种形式;其中一个包含listview,另一个只是表单 我想做一件事: 如果我将listview中的一个项目拖到表单中,就会弹出一个messagebox。 信息将是项目的文本 但是我不知道为什么'SelectedItem'为空。当我跟踪SelectedItem时,它是空的 我发现我必须使用MouseDown和DragDrop事件,但我不知道如何使用 第一个是listview的代码: rListCtrl.MouseDown += rListCtrl_MouseDown; rListCtrl.D

我有两种形式;其中一个包含listview,另一个只是表单

我想做一件事: 如果我将listview中的一个项目拖到表单中,就会弹出一个messagebox。 信息将是项目的文本

但是我不知道为什么'SelectedItem'为空。当我跟踪SelectedItem时,它是空的

我发现我必须使用MouseDown和DragDrop事件,但我不知道如何使用

第一个是listview的代码:

rListCtrl.MouseDown += rListCtrl_MouseDown;
rListCtrl.DragDrop += rListCtrl_DragDrop;


private void rListCtrl_MouseDown(object sender, MouseEventArgs e)
{
    StringBuilder sb = new STringBuilder();
    sb.Append(radListView1.SelectedItem.ToString());
    testName = sb.ToString();
}

private void rListCtrl_DragDrop(object sender, DragEventArgs e){
{
    MessageBox.Show(testName);
}

radListView1是listview的名称。

之所以
SelectedItem
为空,是因为只有在实际执行单击时才选择该项,而不仅仅是
鼠标向下
。 但是,您可以使用
IndexFromPoint
方法获取在调用
MouseDown
事件时鼠标放置的项目:

private void radListView1_MouseDown(object sender, MouseEventArgs e)
{
    int index = radListView1.IndexFromPoint(e.Location);
    radListView1.SelectedIndex = index;
    testName = radListView1.Items[index].ToString();
}

private void rListCtrl_DragDrop(object sender, DragEventArgs e){
{
    MessageBox.Show(testName);
}
表格1:

表格2:

public partial class Form2 : Form
{
    public string data = string.Empty;
    public Form2()
    {
        InitializeComponent();
        listView1.ItemDrag += doDaragItem;
    }

    private void doDaragItem(Object sender, ItemDragEventArgs e)
    {
        data = e.Item.ToString();
    }
}
罗恩

WinForms suite的Telerik UI中的RadListView通过其ListViewDragDropService处理整个拖放操作。它的PreviewDragOver事件允许您控制要拖动的项目可以放置在哪些目标上。PreviewDragDrop事件允许您获得拖放操作、源(拖动)列表视图、目标(目标)控件以及正在拖动的项的所有方面的句柄。以下帮助文章中提供了其他信息:

您还可以将RadDragDropService与OLE拖放功能结合使用:

至于特定的代码片段,实际上,如果您在RadListView中没有选定的项,MouseDown事件中的代码将不会提取该项的文本。您需要在鼠标下获取元素并将项目设置为选中:

        private void radListView1_MouseDown(object sender, MouseEventArgs e)
    {
        SimpleListViewVisualItem elementUnderMouse = this.radListView1.ElementTree.GetElementAtPoint(e.Location) as SimpleListViewVisualItem;
        if (elementUnderMouse != null)
        {
            this.radListView1.SelectedItem = elementUnderMouse.Data ;
        }
        StringBuilder sb = new StringBuilder();
        sb.Append(radListView1.SelectedItem.Text.ToString());
        {
            testName = sb.ToString();
        }
        MessageBox.Show(testName);
    }

我希望这些信息能有所帮助。

什么是radListView1?这是listviewOk的名称,什么是rListCtrl?请阅读供应商的文档。可能在选择项目之前触发
MouseDown
。这就是为什么它仍然是空的。但是,应该有类似“SelectionChanged”(或类似)的事件;然后将项目从form2.listView1拖动到form1中,form1\u MouseEnter方法将处于活动状态。您还可以检查数据是否为空,然后在form1中显示noting。我已经更新了代码,以便在拖动后始终显示form1消息框。
        private void radListView1_MouseDown(object sender, MouseEventArgs e)
    {
        SimpleListViewVisualItem elementUnderMouse = this.radListView1.ElementTree.GetElementAtPoint(e.Location) as SimpleListViewVisualItem;
        if (elementUnderMouse != null)
        {
            this.radListView1.SelectedItem = elementUnderMouse.Data ;
        }
        StringBuilder sb = new StringBuilder();
        sb.Append(radListView1.SelectedItem.Text.ToString());
        {
            testName = sb.ToString();
        }
        MessageBox.Show(testName);
    }