1

最初の行をすでに消費した後、選択したすべての行に対してコントロールが-eventをDataGridViewトリガーしないようにするにはどうすればよいですか?UserDeletingRow

このグリッドはwcf-webserviceのオブジェクトにバインドされています。削除する必要のあるすべてのオブジェクトに対して、deleteメソッドを1回だけ実行したいと思います。

このイベントハンドラーは、選択されたすべての行に対してトリガーされ、常に「本当に削除しますか」をトリガーします-メッセージボックス:

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;
}
4

2 に答える 2

1

わかりました、どうやら(読みやすさの点で)より良いアプローチはないので、イベントハンドラーでカウント変数を使用し、最後に選択した行がこのイベントをトリガーした後にのみ削除を開始するというTigransの提案を実装しました。

回避策は次のとおりです。

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;
    }
}
于 2013-03-18T11:25:53.607 に答える
0

UserDeletingRow のイベントをこのイベント key_Down に置き換えます

if ( e.KeyValue == 46 ) // キーを削除

{ e.Handled = MessageBox.Show( "選択した行を本当に削除しますか", "確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Question ) != DialogResult.OK; }

于 2015-12-31T23:54:59.740 に答える