كيفية يمكنني منع السحب "الذات" وانخفاض في داتاغريدفيف؟

StackOverflow https://stackoverflow.com/questions/614404

سؤال

وأنا تنفيذ السحب والإسقاط وظيفة بين اثنين datagridviews. وهذا يعمل على النحو المنشود مع استثناء واحد: فمن الممكن لسحب وإسقاط داخل نفس داتاغريدفيف. وهذا يؤدي إلى صفوف المكررة. أريد أن تقييد وظيفة حتى أتمكن من سحب فقط من داتاغريدفيف واحد إلى آخر. لا أحد يعرف كيف يمكن تحقيق ذلك؟ انا التخمين مطلوب نوع من الاختبار ضرب ولكني لست متأكدا من كيفية تنفيذ هذا ...

والرمز الذي أستخدمه هو كما يلي:

Private Sub dgvFMAvailable_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles dgvFMAvailable.MouseMove

    If e.Button = Windows.Forms.MouseButtons.Left Then
        Me.dgvFMAvailable.DoDragDrop(Me.dgvFMAvailable.SelectedRows, DragDropEffects.Move)
    End If

End Sub

و

Private Sub dgvFMSelected_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles dgvFMSelected.DragDrop

    Try
        Me.SelectFM(CType(e.Data.GetData(GetType(DataGridViewSelectedRowCollection)), DataGridViewSelectedRowCollection))

    Finally
        e.Effect = DragDropEffects.None
    End Try

End Sub
هل كانت مفيدة؟

المحلول

مجرد فكرة سريعة. ماذا لو عند بدء السحب كنت تحمل اسم الشبكة الأصلية. عند القيام انخفاض تحقق من اسم، إذا كانت هي نفس الكائن ثم لا تسمح للانخفاض.

نصائح أخرى

وببساطة اختبار المساواة المرجع عند الانخفاض. شيء من هذا القبيل:

If Object.ReferenceEquals(droppedThing, thingWhereItWasDropped)
    ' Don't drop it
Else
    ' Drop it
End If

وأنا لا يمكن أن تجد إجابة جيدة لهذا، على الرغم من أنه يبدو أنه يجب أن يكون هناك مشكلة تصادفها. لذلك تستخدم الجواب gbianchi في الطريقة التالية:

public bool DraggingFromFileLinkDGV { get; set; }
void grdFiles_MouseDown(object sender, MouseEventArgs e)
{
    this.DraggingFromFileLinkDGV = true;
}
void grdFiles_MouseLeave(object sender, EventArgs e)
{
    this.DraggingFromFileLinkDGV = false;
}

void grdFiles_DragDrop(object sender, DragEventArgs e)
{
    // Avoid DragDrop's on jittery DoubleClicks
    if (this.DraggingFromFileLinkDGV) return;

    // Your DragDrop code here ...
}

والآن، أنا فعلا هذا على وجه التحديد لمنع "الحائر" نقرات مزدوجة حيث بتحريك الماوس قليلا بين النقر المزدوج. وهذا ما يمنع نقرات مزدوجة تسجيل كما قطرات السحب وكذلك الإجابة على السؤال مكتب خدمات المشاريع.

والعقل لك، فإنه لا يبدو أن العمل 100٪ من الوقت. على ما يبدو بعض الأحداث التي "فقدت" في مثل 1 من 20 حالة. أنا لم تحدد بالضبط ما يختلف في تلك الحالات التي تسجل انخفاضا على نفسها. في حالة منع نقرات مزدوجة تسجيل كما قطرات السحب، و 95٪ هي جيدة بما فيه الكفاية لأنه كان فقط يتم وضعه في المكان المناسب لتجنب الانزعاج. إذا كنت بحاجة إلى شيء غير فعالة بنسبة 100٪، قد تضطر إلى محاولة شيء آخر أو معرفة لماذا لا يعمل في الحالات القليلة.

وطريقة واحدة هي لتخزين وصفا سلسلة من ما كنت سحب في DataObject عند بدء السحب، أي:

Dim dataObj As New DataObject
...
dataObj.SetText(G_SELF_DRAG_DROP_FLAG)

وبعد ذلك على DragEnter تحقق لمعرفة ما إذا كان العلم هو هناك:

Public Sub ProcessAttachment_DragEnter(ByRef e As System.Windows.Forms.DragEventArgs)

    ' prevent dragging onto self
    Dim s = e.Data.GetData(DataFormats.Text)
    If s IsNot Nothing Then
        If s.contains(G_SELF_DRAG_DROP_FLAG) Then
            e.Effect = DragDropEffects.None
            Exit Sub
        End If
    End If

    ...

End Sub

وتعيين إشارة إلى false في حال MouseLeave لم يعمل بشكل صحيح بالنسبة لي. أبقى MouseLeave يطلق عليها في أقرب وقت دعوت DoDragDrop.

وأخيرا حصلت على عمل اليمين على النحو التالي:

A) I create a private bool DraggingFromHere flag
B) Right before calling DoDragDrop, I set this.DraggingFromHere = true
C) In the MouseUp event, I set this.DraggingFromHere = false
D) In the DragDro event, I simply to this:
    if(this.DraggingFromHere) return;

وكارلوس A Merighe

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top