执行拖放时,CheckOnClick不起作用

时间:2013-09-17 15:11:52

标签: c# winforms drag-and-drop click checkedlistbox

我遇到了一个问题,我需要一个CheckedListBox,我可以点击一个项目来检查该框,也可以通过拖放重新排序项目。

我用以下代码实现了这个:

private void chLB_BenötigteProzesse_MouseDown(object sender, MouseEventArgs e)
{
    if (this.chLB_BenötigteProzesse.SelectedItem == null)
        return;
    indexBefore = this.chLB_BenötigteProzesse.SelectedIndex;
    this.chLB_BenötigteProzesse.DoDragDrop(this.chLB_BenötigteProzesse.SelectedItem, DragDropEffects.Move);
}

private void chLB_BenötigteProzesse_DragOver(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Move;
}

private void chLB_BenötigteProzesse_DragDrop(object sender, DragEventArgs e)
{
    Point point = chLB_BenötigteProzesse.PointToClient(new Point(e.X, e.Y));
    int index = this.chLB_BenötigteProzesse.IndexFromPoint(point);
    if (index < 0) index = this.chLB_BenötigteProzesse.Items.Count - 1;
    if (index == indexBefore)
    {
        this.chLB_BenötigteProzesse.SetItemChecked(index, !this.chLB_BenötigteProzesse.GetItemChecked(index));
        return;
    }
    object data = e.Data.GetData(typeof(string));
    this.chLB_BenötigteProzesse.Items.Remove(data);
    this.chLB_BenötigteProzesse.Items.Insert(index, data);
}

问题是,对于_MouseDown事件,CheckOnClick不再起作用。 所以我尝试用_MouseDown中的indexBefore = ...和DragDrop中的if(index == indexBefore)...来解决这个问题。 这只有在我点击一个项目并将其移动一点点以便它被拖动到与以前相同的位置时才有效。 简单的点击也无法正常工作。

接下来尝试在_MouseUp事件中使用此机制:

    private void chLB_BenötigteProzesse_MouseUp(object sender, MouseEventArgs e)
    {
        Point point = chLB_BenötigteProzesse.PointToClient(new Point(e.X, e.Y));
        int index = this.chLB_BenötigteProzesse.IndexFromPoint(point);
        if (index == indexBefore)
            this.chLB_BenötigteProzesse.SetItemChecked(index, !this.chLB_BenötigteProzesse.GetItemChecked(index));
    }

但_MouseUp永远不会被解雇。

你能告诉我如何使它正常工作(只需点击一个项目就应该检查/取消选中它,然后使用拖放操作来改变顺序)? 有谁知道为什么没有触发_MouseUp事件?

谢谢!

修改

使用此代码它正在工作(无法使用e.LeftButton,因为它的winforms不是wpf):

    private void chLB_BenötigteProzesse_DragOver(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Move;
    }

    private void chLB_BenötigteProzesse_DragDrop(object sender, DragEventArgs e)
    {
        Point point = chLB_BenötigteProzesse.PointToClient(new Point(e.X, e.Y));
        int index = this.chLB_BenötigteProzesse.IndexFromPoint(point);
        if (index < 0) index = this.chLB_BenötigteProzesse.Items.Count - 1;
        if (index == indexBefore)
        {
            this.chLB_BenötigteProzesse.SetItemChecked(index, !this.chLB_BenötigteProzesse.GetItemChecked(index));
            return;
        }

        object data = e.Data.GetData(typeof(string));
        bool checkState = chLB_BenötigteProzesse.GetItemChecked(indexBefore);
        this.chLB_BenötigteProzesse.Items.Remove(data);
        this.chLB_BenötigteProzesse.Items.Insert(index, data);
        this.chLB_BenötigteProzesse.SetItemChecked(index, checkState);
    }

    private void chLB_BenötigteProzesse_MouseMove(object sender, MouseEventArgs e)
    {
        if (!dragDropEnabled || this.chLB_BenötigteProzesse.SelectedItem == null || e.Location == mouseLocation)
            return;

        indexBefore = this.chLB_BenötigteProzesse.SelectedIndex;
        dragDropEnabled = false;
        this.chLB_BenötigteProzesse.DoDragDrop(this.chLB_BenötigteProzesse.SelectedItem, DragDropEffects.Move);
    }

    private void chLB_BenötigteProzesse_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            dragDropEnabled = true;
            mouseLocation = e.Location;
        }
    }

1 个答案:

答案 0 :(得分:0)

我宁愿使用OnMouseMove而不是OnMouseDown,然后检查是否按下了鼠标左键以启动你的d​​arag和drop操作,如MSDN所述。

因此,您的问题的解决方案应该是将chLB_BenötigteProzesse_MouseDown替换为:

private void chLB_BenötigteProzesse_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton != MouseButtonState.Pressed || this.chLB_BenötigteProzesse.SelectedItem == null)
        return;
    indexBefore = this.chLB_BenötigteProzesse.SelectedIndex;
    this.chLB_BenötigteProzesse.DoDragDrop(this.chLB_BenötigteProzesse.SelectedItem, DragDropEffects.Move);    
}

不要忘记分离mouseDown处理程序并附加新的mouseMove处理程序!