C# 上下文菜单多次单击事件触发
这真的很奇怪,出于某种原因,我的上下文菜单点击不止一次。我将contextmenu绑定到一个按钮上,因此当单击按钮时,contextmenu将显示在其下方,并带有更多选项 一个选项是将listview保存到Excel,另一个选项是保存到.csv 所以基本上这里发生的是多个excel工作表将被打开。当然,我只想打开一个excel: 这是我的密码:C# 上下文菜单多次单击事件触发,c#,contextmenu,C#,Contextmenu,这真的很奇怪,出于某种原因,我的上下文菜单点击不止一次。我将contextmenu绑定到一个按钮上,因此当单击按钮时,contextmenu将显示在其下方,并带有更多选项 一个选项是将listview保存到Excel,另一个选项是保存到.csv 所以基本上这里发生的是多个excel工作表将被打开。当然,我只想打开一个excel: 这是我的密码: private void toolButtonNoBorder3_Click(object sender, EventArgs e) { contexM
private void toolButtonNoBorder3_Click(object sender, EventArgs e)
{
contexMenuuu.Show(toolButtonNoBorder3,
new Point(0, toolButtonNoBorder3.Height));
contexMenuuu.ItemClicked +=
new ToolStripItemClickedEventHandler(contexMenuuu_ItemClickedd);
}
void contexMenuuu_ItemClickedd(object sender, ToolStripItemClickedEventArgs e)
{
contexMenuuu.Hide();
contexMenuuu.Close();
if (e.ClickedItem.Text == "Excel")
{
Microsoft.Office.Interop.Excel.Application app =
new Microsoft.Office.Interop.Excel.Application();
app.Visible = true;
Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(1);
Microsoft.Office.Interop.Excel.Worksheet ws =
(Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1];
int i = 1;
int i2 = 1;
int iad = 1;
foreach (ListViewItem lvi in flatListView1.Items)
{
i = 1;
foreach (ListViewItem.ListViewSubItem lvs in lvi.SubItems)
{
if (i2 == 1)
{
iad = 1;
foreach (ColumnHeader lvfi in flatListView1.Columns)
{
try
{
ws.Cells[i2, iad] = lvfi.Text;
}
catch (Exception ee)
{
}
iad++;
}
}
else
{
try
{
ws.Cells[i2, i] = lvs.Text;
}
catch (Exception ee)
{
}
}
i++;
}
i2++;
}
}
else if (e.ClickedItem.Text == "CSV")
{
Stream myStream;
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "csv files (*.csv)|*.csv";
saveFileDialog1.FilterIndex = 2;
saveFileDialog1.RestoreDirectory = true;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
if ((myStream = saveFileDialog1.OpenFile()) != null)
{
myStream.Close();
ListViewToCSV(flatListView1, saveFileDialog1.FileName, true);
}
}
}
}
它应该位于窗口的构造函数中:
public MyWindow()
{
//here inicialization
contexMenuuu.ItemClicked +=
new ToolStripItemClickedEventHandler(contexMenuuu_ItemClickedd);
}
多次添加事件处理程序是一个非常常见的错误,下次要小心,它应该位于窗口的构造函数中:
public MyWindow()
{
//here inicialization
contexMenuuu.ItemClicked +=
new ToolStripItemClickedEventHandler(contexMenuuu_ItemClickedd);
}
多次添加事件处理程序是一个非常常见的错误,下次请小心在我的情况下,我使用以下语句解决了它- e、 已处理=正确
这将明显地将事件标记为已处理。在我的情况下,我使用以下语句解决了它- e、 已处理=正确
这将明显地将事件标记为已处理。是的,当您多次订阅单击事件时会发生这种情况。就像你在代码中做的那样。每次用户单击toolButtonNoBorder3按钮时,您都会向同一单击事件添加另一个事件处理程序。该代码属于构造函数,因此只能执行一次。Quote:该代码属于构造函数,当您多次订阅Click事件时会发生这种情况。就像你在代码中做的那样。每次用户单击toolButtonNoBorder3按钮时,您都会向同一单击事件添加另一个事件处理程序。该代码属于构造函数,因此只能执行一次。Quote:该代码属于构造函数