在ListView的继承类上使用DoubleClick事件

时间:2012-05-22 17:19:03

标签: c# winforms

我有一个名为MyClass的类,它继承自ListView ...所以基本上它是一个列表视图,我可以在表单等上使用它。我已经覆盖了这个类的拖放事件所以现在如果我将其中两个控件放在一个表单上,然后将项目从一个拖到另一个,它就可以了。 我的问题在于DoubleClick,如何在此类上实施DoubleClick()?因此,稍后我将其中两个控件放在一个表单上并双击其中一个上的项目时,它会将其移动到另一个控件...它甚至可能吗?

3 个答案:

答案 0 :(得分:2)

我很好奇这是如何实现的,所以我试了一下。我创建了一个新的Windows窗体项目,并创建了一个myClass:ListView(参见下面的代码)然后我添加了两个如果控件到窗体,并使用姐妹属性(我没有真正写为属性)将它们绑在一起< / p>

我在myClass1中添加了1个项目,在myClass2中添加了2个项目。当我双击其中任何一个时,它们会移动到另一个列表视图。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        myClass1.sister = myClass2;
        myClass2.sister = myClass1;
    }
}

public class myClass : ListView
{
    //This is where we will store the information about the sister Control
    private myClass _sister;
    //**EDIT**  I changed sister into a property and now it is selectable
    //from the designer.
    public myClass sister { get { return _sister; } set { _sister = value; } }

    public myClass()
    {
    }
    //here is where we override the OnDoubleCLick Event
    protected override void OnDoubleClick(EventArgs e)
    {
        //Make sure this control has a sister 
        if (sister != null)
        {
            //add a temporary storage location for the selected Item
            ListViewItem item = this.SelectedItems[0];
            //Remove the Item from the clicked List
            this.Items.Remove(item);
            //Add the Item to the sister List
            ((myClass)sister).Items.Add(item);
        }
        base.OnDoubleClick(e);
    }

}

答案 1 :(得分:1)

你试过这个吗?:

private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ListView source = sender as ListView;
        ListViewItem item =  source.HitTest(e.Location).Item;
        if (item != null)
        {
            MessageBox.Show("Item " + item.Text + " was double clicked on " + source.Name );
        }
    }

发件人会告诉你哪个列表视图被双击,因为你已经实现了拖放,我想你应该能够以同样的方式实现转移。

答案 2 :(得分:1)

可以通过访问控件上的Parent并移动它Controls来实现这一点:

var allMyClasses = this.Parent.Controls.OfType<MyClass>().ToList();

int index = allMyClasses.IndexOf(this);

MyClass target = null;
if (index == allMyClasses.Count - 1)
{
    target = allMyClasses[0];
}
else if (allMyClasses.Count != 0)
{
    target = allMyClasses[index + 1];
}

我对确切代码(未经测试)不是100%肯定,但一般技术应该运行得很好。当然,您需要对Parent进行空检查,并且您需要将这些详细信息粘贴到MouseDoubleClick中,但它应该没有问题。