知道鼠标左键是否在同一个列表框中被释放

时间:2011-09-21 14:28:25

标签: c# winforms

我有两个列表框,一个用于可用项目,另一个用于选定项目,因此用户可以通过拖放或双击在这两个项目之间移动项目。 它不是一个完美的代码,大多数逻辑是用MouseMove事件编写的,我可以在这里有鼠标位置的X和Y ...我正在寻找这个场景来防止它:用户在左侧列表中按住鼠标左键框并选择一个项目但是他在同一个列表框上再次释放鼠标按钮,所以我需要一种方法来知道它是否仍然在同一个列表框中然后不要拖放...所以是否有一些方法可以告诉我可以使用的列表框的边界?或者你有任何其他更好的想法?

private void lstAvailable_MouseMove(Object eventSender, MouseEventArgs eventArgs)
{
    //*************** FUNCTION DETAILS ***************
    //User moves mouse in the Available list
    //***************** INSTRUCTIONS *****************
    MouseButtons Button = eventArgs.Button;
    int Shift = (int)Control.ModifierKeys / 0x10000;
    float X = (float)VB6.PixelsToTwipsX(eventArgs.X);
    float Y = (float)VB6.PixelsToTwipsY(eventArgs.Y);
    moDualListBox.List1_MouseMove(Button, Shift, X, Y);


    if (eventArgs.Button == MouseButtons.Left )
    {
        if (!mbClickProcessed) // it is a DragDrop
        {
            this.lstAvailable.DoDragDrop(this.lstAvailable.SelectedItems, DragDropEffects.Move);
            mbClickProcessed = true;
        }
        if (mbClickProcessed) // it is a DoubleClick
        {
            MoveClick();
            MoveLostFocus();
            mbClickProcessed = true;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

拖放示例(无错误检查):

private ListBox _DraggingListBox = null;

private void listBox1_DragDrop(object sender, DragEventArgs e)
{
  if (_DraggingListBox != listBox1)
    MoveItem(listBox2, listBox1, (int)e.Data.GetData(typeof(int)));
}

private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
  _DraggingListBox = listBox1;
  listBox1.DoDragDrop(listBox1.IndexFromPoint(e.X,e.Y), DragDropEffects.Move);    
}

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

private void listBox2_DragDrop(object sender, DragEventArgs e)
{
  if (_DraggingListBox != listBox2)
    MoveItem(listBox1, listBox2, (int)e.Data.GetData(typeof(int)));
}

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

private void listBox2_MouseDown(object sender, MouseEventArgs e)
{
  _DraggingListBox = listBox2;
  listBox2.DoDragDrop(listBox2.IndexFromPoint(e.X,e.Y), DragDropEffects.Move);
}

private void MoveItem(ListBox fromLB, ListBox toLB, int index)
{
  toLB.Items.Add(fromLB.Items[index]);
  fromLB.Items.RemoveAt(index);
}

答案 1 :(得分:0)

如果您发现DragDrop事件,则您拥有拖放操作的发件人 因此,如果发件人与目标控件相同,您可以轻松地放弃操作(或不执行任何操作)...

如果您想知道鼠标是否正在离开控件(并根据此设置变量),您可以捕获MouseLeave事件,而MouseEnter事件可以方便地知道鼠标何时从中输入控件另一个。