C# CheckOnClick不';在实现拖放时不工作
我遇到的问题是,我需要一个CheckedListBox,在这里我可以通过单击某个项目来选中该框,还可以通过拖放对项目重新排序 我用以下代码实现了这一点: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 =
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);
}