【问题标题】:Drag an item in listview to a form将列表视图中的项目拖到表单中
【发布时间】:2020-02-25 11:16:42
【问题描述】:

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

我想做一件事: 如果我将列表视图中的项目拖到表单中,则会弹出一个消息框。 并且消息将是项目的文本。

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

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

第一个是列表视图的代码:

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 是列表视图的名称。

【问题讨论】:

  • 什么是 radListView1?
  • 这是列表视图的名称
  • 好的,rListCtrl 是什么?
  • 阅读供应商的文档。 ListViewDragDropService
  • MouseDown 可能会在选择项目之前触发。这就是为什么它仍然是空的。然而,应该有一个像“SelectionChanged”(或类似)这样的事件。

标签: c# winforms listview drag-and-drop telerik


【解决方案1】:

SelectedItem 为空的原因是,只有在您实际执行点击时才会选择 Item,而不仅仅是 MouseDown。 但是,您可以使用 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);
}

【讨论】:

    【解决方案2】:

    表格1:

    public partial class Form1 : Form
    {
        Form2 f = new Form2();
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            f.Show();
        }
    
        private void Form1_MouseEnter(object sender, EventArgs e)
        {
            if(f.data!= string.Empty)
            {
                MessageBox.Show(f.data);
                f.data = string.Empty;
            }
    
        }
    }
    

    表格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();
        }
    }
    

    【讨论】:

    • 通过使用事件listView1.ItemDrag;然后将一个项目从 form2.listView1 拖到 form1 中,Form1_MouseEnter 方法将处于活动状态。您也可以检查数据是否为空,然后在form1中显示注释。
    • 我已经更新了代码,让form1消息框在拖拽后总是会显示出来。
    【解决方案3】:

    罗恩,

    来自 WinForms 套件的 Telerik UI 的 RadListView 通过其 ListViewDragDropService 处理整个拖放操作。它的 PreviewDragOver 事件允许您控制被拖动的项目可以放在哪些目标上。 PreviewDragDrop 事件允许您处理拖放操作、源(拖动)列表视图、目标(目标)控件以及被拖动项目的所有方面。以下帮助文章中提供了更多信息:https://docs.telerik.com/devtools/winforms/controls/listview/drag-and-drop/listviewdragdropservice https://docs.telerik.com/devtools/winforms/controls/listview/drag-and-drop/drag-and-drop-using-raddragdropservice

    您还可以结合使用 RadDragDropService 和 OLE 拖放功能:https://docs.telerik.com/devtools/winforms/controls/listview/drag-and-drop/combining-raddragdropservice-and-ole-drag-and-drop

    至于具体的代码sn-p,确实,如果RadListView中没有选中的item,MouseDown事件中的代码不会提取item的文本。您需要获取鼠标下的元素并将项目设置为选中:

            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);
        }
    

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

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多