[英]How to prevent datagridview from firing UserDeletingRow-event for every selected row?
我已經消耗完第一行后,如何停止DataGridView
控件為每個選定行觸發UserDeletingRow
-event?
該網格綁定到我的wcf-webservice中的對象,我只希望對應該刪除的所有對象執行一次delete方法。
每個選定的行都會觸發此事件處理程序,它還會始終觸發“您是否真的要刪除”消息框:
private void Grid_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
switch (this.Type)
{
case AdminType.Channel:
List<Channel> channels = GrdChannel.SelectedRows.Cast<DataGridViewRow>()
.Select(row => (Channel)row.DataBoundItem).ToList();
e.Cancel = !Delete_Channels(channels);
break;
// other types ...
default:
break;
}
}
確認后,此方法調用Web服務:
private bool Delete_Channels(List<Channel> channels)
{
var msg = string.Format("Do you really want to delete {0}?", channels.Count == 1 ? "this channel" : "these channels");
var title = channels.Count == 1 ? "Delete channel" : "Delete channels";
bool yes = MessageBox.Show(msg, title, MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes;
if (yes)
{
using (var db = new ERP_ServiceClient())
db.DeleteChannels(channels, this.IdUser);
string message = string.Format("{0} deleted successfully: {1}"
, channels.Count == 1 ? "Channel" : "Channels"
, string.Join(",", channels.Select(p => p.Name)));
channelBindingSource.Remove(channels);
Main.ShowStatusMessage(message);
}
return yes;
}
好的,顯然沒有更好的方法(就可讀性而言),因此我實現了Tigrans建議,以在事件處理程序中使用count變量,並僅在最后選擇的行觸發此事件后才開始刪除。
解決方法如下:
private int _deleteCount = 0;
private bool _deleting = false;
private bool _reallyDelete = false;
private IEnumerable<object> _deleteEntities = null;
private void Grid_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
DataGridView grid = (DataGridView)sender;
if (!_deleting)
{
_deleting = true;
_deleteCount = grid.SelectedRows.Count;
_deleteEntities = grid.SelectedRows.Cast<DataGridViewRow>().Select(r => r.DataBoundItem).ToList();
string msg = "";
string title = "";
switch (this.Type)
{
case AdminType.Channel:
msg = string.Format("Do you really want to delete {0}?", _deleteCount == 1 ? "this channel" : "these channels");
title = _deleteCount == 1 ? "Delete channel" : "Delete channels";
break;
// other types ...
default:
break;
}
_reallyDelete = MessageBox.Show(msg, title, MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes;
}
e.Cancel = !_reallyDelete;
// wait until all events are triggered before starting to delete
if (--_deleteCount == 0)
{
switch (this.Type)
{
case AdminType.Channel:
List<Channel> channels = _deleteEntities.Cast<Channel>().ToList();
Delete_Channels(channels);
break;
// other types ...
default:
break;
}
_deleting = false;
_reallyDelete = false;
_deleteEntities = null;
}
}
UserDeletingRow的rplace事件與此事件key_Down
if(e.KeyValue == 46)//刪除密鑰
{e.Handled = MessageBox.Show(“您是否真的要刪除選定的行”,“ Confirm”,MessageBoxButtons.OKCancel,MessageBoxIcon.Question)!= DialogResult.OK; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.