DataGridView с ContextMenu, назначенным столбцу и MessageBox - PullRequest
1 голос
/ 01 июля 2011

У меня есть DGV, для которого в качестве источника данных задан BindingList. Существует также ContextMenu, назначенное столбцу в DGV. В ContextMenu установлен элемент MenuItem, который вызывает MessageBox для события click.

Все работает нормально, методы вызываются, а MessageBox с ответами YesNo делает то, к чему они относятся.

Проблема, с которой я столкнулся, заключается в том, что, когда происходит событие щелчка MessageBox (да или нет), оно выполняет свою работу и уходит. Если та же самая процедура вызывается во второй раз, она снова делает свою работу без проблем, а затем появляется снова. Если я нажму Да или Нет, это исчезнет. Если я вызываю его в третий раз, MessageBox появляется снова, выполняет свою работу и появляется дважды. Как будто каждый раз, когда он вызывается, он повторяется и снова вызывает себя столько раз. Это будет происходить при каждом вызове.

BindingList создается с использованием класса с вложенными свойствами, и все элементы данных присутствуют.

Я попытался использовать только пустой MessageBox без DialogResults и без изменений. Я даже пытался использовать RaiseListChangedEvents = false DGV в событии щелчка ContextMenu и в событии Click для ячейки DGV.

Я прошел через мой код и, независимо от того, какой класс с вложенными свойствами всегда вызывается и вызывает событие click ContextMenu, которое вызывается снова и снова ... Я думаю, что это сделано специально, поскольку BindingList всегда будет Автообновление при доступе или изменении значения ячейки.

Столбец ContextMenu является кнопкой и доступен только для чтения.

Итак, как мне перехватить MessageBox после его первого запуска или остановить автоматическое обновление BindingList. Мой список черпает свои данные из веб-ссылки, и я обрабатываю обновления с помощью методов, предоставляемых из 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; }
    }
}

1 Ответ

0 голосов
/ 10 октября 2011

Просто хотел обновить это и закрыть его. Я разобрался с обходом, который устанавливает логическое значение true или false на разных этапах вызываемых событий Если логическое значение установлено в true, я просто возвращаюсь, чтобы выйти из методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...