Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CheckOnClick不';在实现拖放时不工作_C#_Winforms_Drag And Drop_Click_Checkedlistbox - Fatal编程技术网

C# CheckOnClick不';在实现拖放时不工作

C# CheckOnClick不';在实现拖放时不工作,c#,winforms,drag-and-drop,click,checkedlistbox,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 =

我遇到的问题是,我需要一个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);
}
但是,穆塞普永远不会被解雇

你能告诉我如何让它正常工作吗(只需点击一个项目就可以勾选/取消勾选,并且应该使用拖放来更改顺序)? 有人知道为什么没有触发MouseUp事件吗

谢谢

编辑:

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

private void chLB_BenötigteProzesse_DragOver(对象发送方,DragEventArgs e)
{
e、 效果=DragDropEffects.Move;
}
私有void chLB_BenötigteProzesse_DragDrop(对象发送方,DragEventArgs e)
{
Point Point=Chlbu BenötigteProzesse.PointToClient(新点(e.X,e.Y));
int index=this.chLB_BenötigteProzesse.IndexFromPoint(点);
如果(索引<0)索引=this.chLB_BenötigteProzesse.Items.Count-1;
如果(索引==索引之前)
{
this.chlbu BenötigteProzesse.SetItemChecked(索引,!this.chlbu BenötigteProzesse.GetItemChecked(索引));
返回;
}
objectdata=e.data.GetData(typeof(string));
bool checkState=chLB_BenötigteProzesse.GetItemChecked(indexBefore);
this.chLB_BenötigteProzesse.Items.Remove(数据);
this.chLB_BenötigteProzesse.Items.Insert(索引,数据);
this.chLB_BenötigteProzesse.SetItemChecked(索引,检查状态);
}
私有void chLB_BenötigteProzesse_MouseMove(对象发送方,MouseEventArgs e)
{
如果(!dragDropEnabled | this.chLB_BenötigteProzesse.SelectedItem==null | | e.Location==mouseLocation)
返回;
indexBefore=this.chLB_Benötigtefrozesse.SelectedIndex;
dragDropEnabled=错误;
this.chlbu BenötigteProzesse.DoDragDrop(this.chlbu BenötigteProzesse.SelectedItem,DragDropEffects.Move);
}
私有void chLB_BenötigteProzesse_MouseDown(对象发送方,MouseEventArgs e)
{
if(e.Button==System.Windows.Forms.MouseButtons.Left)
{
dragDropEnabled=真;
鼠标位置=e.位置;
}
}

我宁愿使用OnMouseMove而不是OnMouseDown,然后检查是否按了鼠标左键来启动darag和drop操作,如上所述

因此,您的问题的解决方案应该是将Chlbu Benötigrezesse_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处理程序

建议:方法和变量应使用英文名称。至少在StackOverflow这里,你是绝对正确的。代码是用非常糟糕的丹格利什语写的…很好,这很有效。因此,我要理解为什么没有触发
\u MouseUp
:是不是
DoDragDrop()
阻止了事件?
    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;
        }
    }
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);    
}