كيفية يمكنني منع السحب "الذات" وانخفاض في داتاغريدفيف؟
-
03-07-2019 - |
سؤال
وأنا تنفيذ السحب والإسقاط وظيفة بين اثنين 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