C# DataGridView,将ContextMenu分配给列和MessageBox

C# DataGridView,将ContextMenu分配给列和MessageBox,c#,winforms,c#-3.0,C#,Winforms,C# 3.0,我有一个DGV,它的数据源设置为BindingList。还有一个上下文菜单指定给DGV中的列。ContextMenu上有一个MenuItem集合,用于在click事件中调用MessageBox 一切正常,方法被调用,带有YesNo响应的MessageBox执行它们所需要的操作 我遇到的问题是,当MessageBox的click事件发生(是或否)时,它完成了它的工作并消失了。如果第二次调用同一个例程,它会毫无问题地再次执行其任务,然后重新出现。如果我单击是或否,它就会消失。如果我第三次调用它,Me

我有一个DGV,它的数据源设置为BindingList。还有一个上下文菜单指定给DGV中的列。ContextMenu上有一个MenuItem集合,用于在click事件中调用MessageBox

一切正常,方法被调用,带有YesNo响应的MessageBox执行它们所需要的操作

我遇到的问题是,当MessageBox的click事件发生(是或否)时,它完成了它的工作并消失了。如果第二次调用同一个例程,它会毫无问题地再次执行其任务,然后重新出现。如果我单击是或否,它就会消失。如果我第三次调用它,MessageBox会再次出现并执行其任务,然后重新出现两次。好像每次它被调用时,它都会重复调用,并再次调用它自己。每次调用时都会发生这种情况

BindingList是使用具有嵌套属性的类构建的,并且所有数据元素都存在

我试着只使用一个空白的消息框,没有对话框结果,也没有更改。我甚至尝试在ContextMenu click事件和DGV的单元格Enter click事件中使用DGV的RaiseListChangedEvents=false

我已经仔细阅读了我的代码,不管是什么,具有嵌套属性的类总是被调用,并导致ContextMenu的click事件被一次又一次地调用。。。我认为这是出于设计,因为当访问或更改单元格的值时,BindingList将始终自动更新

ContextMenu的列是一个按钮,是只读的

那么,我如何在MessageBox第一次运行后捕获它,或者停止BindingList的自动更新呢。我的列表从Web引用中提取数据,并通过API提供的方法处理更新。我使用BindingList的唯一原因是DGV不能仅使用列表

谢谢你的帮助和指导。(第一次发布,但从这里收集并使用了大量信息)

下面是一些代码:

_requestsView.AutoGenerateColumns = false;
            _edit.DataPropertyName = "RequestId";
            _patient.DataPropertyName = "Patient";
            _dateSubmitted.DataPropertyName = "Date";
            _completedBy.DataPropertyName = "CompletedBy";
            _completedOn.DataPropertyName = "CompletedOn";
            _procedure.DataPropertyName = "Procedure";
            _stat.DataPropertyName = "Stat";
            _viewReport.DataPropertyName = "ViewReport";
            _selectedSpecialist.DataPropertyName = "SelectedSpecialist";
            _status.DataPropertyName = "Status";
            _rate.DataPropertyName = "Rating";

            _requestsView.DataSource = _requestsBinding;
// _cancelRequest_Click is ContextMenu MenuItem

void _cancelRequest_Click(object sender, EventArgs e)
    {

        MessageBox.Show("test");
    }

private void _requestsView_CellEnter(object sender, DataGridViewCellEventArgs e)
    {

        if (_requestsView.CurrentRow != null)
            if (_requestsView.CurrentRow.Cells["_viewReport"].Selected)
                try
                {
                 var requestNumber = (int)_requestsView.CurrentRow.Cells ["_viewReport"].Value;
                    var letter = Api.Client.getCompletedLetter(UseSession.SessionId,  requestNumber);
                    var convertedLetter = Convert.FromBase64String(letter);
                    var requestNumberToString = Convert.ToString(requestNumber);
                    var tmpfile = System.IO.Path.Combine(System.IO.Path.GetTempPath(), requestNumberToString + @".pdf");
                    var view = new ViewLetter(requestNumberToString, tmpfile);

                    File.WriteAllBytes(tmpfile, convertedLetter);

                    view._pdf.LoadFile(tmpfile);
                    view._pdf.PerformLayout();
                    view._pdf.Refresh();
                    view._pdf.setShowToolbar(true);
                    view._pdf.setZoom(100);
                    view.Show();
                    view.Activate();
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.Message);
                }

        if (_requestsView.CurrentRow != null)
            if (_requestsView.CurrentRow.Cells["_edit"].Selected)
                _edit.ContextMenuStrip.Show(Cursor.Position.X, Cursor.Position.Y);

        if (_requestsView.CurrentRow != null)
            if (_requestsView.CurrentRow.Cells["_rate"].Selected)
                _rate.ContextMenuStrip.Show(Cursor.Position.X, Cursor.Position.Y);

    }

public class Requests
{
    private int _requestId;
    private DateTime _date;
    private string _patient;
    private string _completedBy;
    private string _completedOn;
    private string _procedure;
    private string _stat;
    private int _viewReport;
    private Specialists _selectedSpecialist;
    private string _status;
    private int _rating;

    public Requests()
    { }

    public Requests(string stat)
    {
        _stat = stat;
    }

    public int RequestId
    {
        get { return _requestId; }
        set { _requestId = value; }
    }

    public DateTime Date
    {
        get { return _date; }
        set { _date = value; }
    }

    public string Patient
    {
        get { return _patient; }
        set { _patient = value; }
    }

    public string CompletedBy
    {
        get { return _completedBy; }
        set { _completedBy = value; }
    }

    public string CompletedOn
    {
        get { return _completedOn; }
        set { _completedOn = value; }
    }

    public string Procedure
    {
        get { return _procedure; }
        set { _procedure = value; }
    }

    public string Stat
    {
        get { return _stat; }
        set { _stat = value; }
    }

    public int ViewReport
    {
        get { return _viewReport; }
        set { _viewReport = value; }
    }

    public Specialists SelectedSpecialist
    {
        get { return _selectedSpecialist; }
        set { _selectedSpecialist = value; }
    }

    public string Status
    {
        get { return _status; }
        set { _status = value; }
    }
    public int Rating
    {
        get { return _rating; }
        set { _rating = value; }
    }
}

只是想更新并关闭它。我找到了一个解决办法,在调用事件的不同阶段设置布尔值true或false。如果布尔值设置为true,我只需返回一个值即可退出这些方法