Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 上下文菜单多次单击事件触发_C#_Contextmenu - Fatal编程技术网

C# 上下文菜单多次单击事件触发

C# 上下文菜单多次单击事件触发,c#,contextmenu,C#,Contextmenu,这真的很奇怪,出于某种原因,我的上下文菜单点击不止一次。我将contextmenu绑定到一个按钮上,因此当单击按钮时,contextmenu将显示在其下方,并带有更多选项 一个选项是将listview保存到Excel,另一个选项是保存到.csv 所以基本上这里发生的是多个excel工作表将被打开。当然,我只想打开一个excel: 这是我的密码: private void toolButtonNoBorder3_Click(object sender, EventArgs e) { contexM

这真的很奇怪,出于某种原因,我的上下文菜单点击不止一次。我将contextmenu绑定到一个按钮上,因此当单击按钮时,contextmenu将显示在其下方,并带有更多选项

一个选项是将listview保存到Excel,另一个选项是保存到.csv

所以基本上这里发生的是多个excel工作表将被打开。当然,我只想打开一个excel:

这是我的密码:

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:该代码属于构造函数