Excelselect更改事件触发两次C#

我尝试在Excel中调用selectionchange事件,但它触发两次。 我用编组连接到一个打开的Excel文件,所以代码如下

首先我发布Form1上的代码

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Reflection; using System.Diagnostics; using Excel = Microsoft.Office.Interop.Excel; namespace Excel_Sol_Taraf_Onaylama_V._00 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btn_Excele_Baglan_Classtan_Click(object sender, EventArgs e) { try { ExcelSinifveOlaylar myExcel = new ExcelSinifveOlaylar(); Excel.Application oXL = (Excel.Application)myExcel.oXL1("Test.xlsx"); try { myExcel.Excel_OlaylariTanimla(); MessageBox.Show("Excel Olayları Tanımlandı"); } catch (Exception) { throw; } } catch (Exception ex) { MessageBox.Show(ex.ToString()); throw; } } } } 

所以下面是ExcelSinifveOlaylar类

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Excel = Microsoft.Office.Interop.Excel; using System.Windows.Forms; using System.Reflection; using System.Threading; namespace Excel_Sol_Taraf_Onaylama_V._00 { class ExcelSinifveOlaylar { //Marshalling ile excel bağlantısı için nesneler Excel.Application oXL; Excel._Workbook oWB; Excel.Worksheet oSheet; //Excel event delegate variables: Excel.AppEvents_WorkbookBeforeCloseEventHandler EventDel_BeforeBookClose; // Excel.DocEvents_ChangeEventHandler EventDel_CellsChange; Excel.DocEvents_SelectionChangeEventHandler EventDel_SelChange; int eventtrigger = 0; public Excel._Application oXL1(string strDosyaAdi) { oXL = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); int intFileNr = 2; //This for statement part is only to connect to the test.xls for (int i = 1; i <= 3; i++) { intFileNr = i; try { oWB = (Excel._Workbook)oXL.Workbooks.get_Item(i); if (strDosyaAdi == oWB.Name) { oSheet = (Excel.Worksheet)oWB.ActiveSheet; MessageBox.Show("Connected to " + strDosyaAdi + "Aktif Sayfa: " + oSheet.Name.ToString()); } Excel_OlaylariTanimla(); break; } catch { intFileNr = i; } } return oXL; } public void Excel_OlaylariTanimla() { try { EventDel_SelChange = new Excel.DocEvents_SelectionChangeEventHandler(SelChange); oSheet.SelectionChange += EventDel_SelChange; // EventDel_CellsChange = new Excel.DocEvents_ChangeEventHandler(CellsChange); // oSheet.Change += EventDel_CellsChange; } catch (Exception ex) { throw; } } private void SelChange(Excel.Range Target) { //MessageBox.Show("Selection Changed"); eventtrigger++; MessageBox.Show(eventtrigger.ToString()); } } 

在excel中更改所选单元格时,selectionchange事件触发了两次。 所以eventtrigger变成了2而不是1。

我有感觉,也许下面的两个类的声明导致这个问题

使用Excel = Microsoft.Office.Interop.Excel;

但我不确定。 感谢您的支持。

你可以请尝试一个cell change事件吗? 直接尝试下面的代码,而不是在define events中创builddefine events

 //Add an event handler for the Change event of both worksheet objects. EventDel_CellsChange = new Excel.DocEvents_ChangeEventHandler( CellsChange); xlSheet1.Change += EventDel_CellsChange; private void CellsChange(Excel.Range Target ) { //This is called when any cell on a worksheet is changed. Debug.WriteLine("Delegate: You Changed Cells " + Target.get_Address( Missing.Value, Missing.Value, Excel.XlReferenceStyle.xlA1, Missing.Value, Missing.Value ) + " on " + Target.Worksheet.Name); } 

参考MSND :使用Visual C#.NET处理Excel的事件

只是删除

  private void btn_Excele_Baglan_Classtan_Click(object sender, EventArgs e) { try { ExcelSinifveOlaylar myExcel = new ExcelSinifveOlaylar(); Excel.Application oXL = (Excel.Application)myExcel.oXL1("Test.xlsx"); try { //because of this its occuring 2 times as its already registered from class constructor //myExcel.Excel_OlaylariTanimla(); MessageBox.Show("Excel Olayları Tanımlandı"); } catch (Exception) { throw; } } catch (Exception ex) { MessageBox.Show(ex.ToString()); throw; } }