2011-07-01 34 views
1

我有一個DGV,其數據源設置爲BindingList。還有一個ContextMenu分配給DGV中的一列。在ContextMenu上設置了一個MenuItem,它在click事件上調用MessageBox。DataGridView與ContextMenu分配給列和MessageBox

一切工作正常,調用方法和帶有YesNo響應的MessageBox做他們所懷疑的事情。

我遇到的問題是,當MessageBox的點擊事件發生時(是或否)它確實是工作並消失。如果第二次調用相同的例程,則它再次執行沒有問題的任務,然後再次出現。如果我點擊是或否,它會消失。如果我第三次調用它,MessageBox再次出現它的工作並再次出現兩次。就好像每次它被稱爲迭代並重新調用自己的次數一樣。每次調用時都會發生這種情況。

BindingList是使用具有嵌套屬性的類構建的,並且存在所有數據元素。

我試過只用一個空白的MessageBox而沒有使用DialogResults而沒有任何改變。我甚至嘗試在ContextMenu點擊事件和DGV的Cell Enter Click事件中使用DGV的RaiseListChangedEvents = false。

我已經通過我的代碼,並且無論具有嵌套屬性的類總是被調用並導致ContextMenu的單擊事件被一次又一次調用......我認爲這是設計,因爲BindingList會當單元格的值被訪問或更改時,總是自動更新。

ContextMenu的列是一個按鈕,是隻讀的。

那麼我該如何在第一次運行之後捕獲MessageBox或者停止自動更新BindingList。我的列表從Web引用中繪製其數據,並通過API提供的方法處理更新。我使用BindingList的唯一原因是因爲DGV不適用於List。

感謝您的幫助或指導。 (第一次發帖,但收集和使用大量的信息從這裏)

下面是一些代碼:

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

回答

0

只是想更新這個並關閉它。我想出了一個解決方案,在被調用的不同階段設置布爾真或假。如果布爾值設置爲true,我只是做一個返回來擺脫方法。