将ContextMenu分配给列和MessageBox的DataGridView
本文关键字:MessageBox DataGridView ContextMenu 分配 | 更新日期: 2023-09-27 18:00:55
我有一个DGV,它的数据源设置为BindingList。还有一个ContextMenu指定给DGV中的列。ContextMenu上设置了一个MenuItem,该MenuItem在单击事件上调用MessageBox。
一切都很好,方法被调用,带有YesNo响应的MessageBox执行它们怀疑的操作。
我遇到的问题是,当MessageBox的点击事件发生(是或否(时,它完成了它的工作并消失了。如果第二次调用相同的例程,它会再次毫无问题地完成任务,然后再次出现。如果我单击"是"或"否",它就会消失。如果我第三次调用它,则MessageBox会再次出现并执行其任务,并再次出现两次。就好像每次它被调用时,它都在迭代并再次调用自己那么多次。每次调用时都会发生这种情况。
BindingList是使用具有嵌套属性的类生成的,并且存在所有数据元素。
我尝试只使用一个空白MessageBox,没有DialogResults,也没有更改。我甚至尝试在ContextMenu点击事件和DGV的Cell Enter点击事件中使用DGV的RaiseListChangedEvents=false。
我已经逐步完成了我的代码,无论怎样,具有嵌套属性的Class总是被调用,并导致ContextMenu的click事件被一次又一次地调用。。。我认为这是故意的,因为当访问或更改单元格的值时,BindingList总是自动更新。
ContextMenu的列是一个按钮,并且是只读的。
那么,如何在MessageBox第一次运行后捕获它,或者停止BindingList的自动更新呢。我的List从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; }
}
}
我只是想更新并关闭它。我想出了一个解决方案,在调用事件的不同阶段设置布尔值true或false。如果布尔值设置为true,我只需要返回一次就可以退出这些方法。