Я создал интерфейс для определения RangeSelectionTarget следующим образом:
public interface IRangeSelectionTarget
{
void OnRangeSelection(Excel.Range target);
}
В другом классе (ExcelController, инкапсулируя поведение взаимодействия Excel), у меня есть метод, чтобы передать выбор диапазона рабочего листа (используя мышь для выбора ячеек) к цели:
public void SelectCaptureOn(IRangeSelectionTarget target)
{
_selectionCallback += new SelectionCallback(target.OnRangeSelection);
_selectionCallback += new SelectionCallback(SelectionCallback2);
int limit = _workbook.Worksheets.Count;
for (int i = 1; i <= limit; i++)
{
Excel.Worksheet worksheet = _workbook.Worksheets.get_Item(i);
string worksheetName = worksheet.Name;
worksheet.SelectionChange
+= new Excel.DocEvents_SelectionChangeEventHandler(OnXlSelectionCallback);
}
}
Цель, форма, реализует OnRangeSelection () следующим образом для отображения адресов ячеек:
public void OnRangeSelection(Excel.Range target)
{
if (this.InvokeRequired)
{
RangeSelectionDelegate rsDel = new RangeSelectionDelegate(OnRangeSelection);
this.Invoke(rsDel, new object[] { target });
}
else
{
txtRange.Text = target.AddressLocal;
txtRange.Tag = target;
}
}
Это прекрасно работает, кроме случаев, когда это не так. После вызова SelectCaptureOn () OnRangeSelection () начинает вызываться для IRangeSelectionTarget, которая затем отображает адреса выбранных ячеек. OnRangeSelection () проверяет InvokeRequired, чтобы избежать проблем с многопоточностью .... или я так надеюсь.
Проблема в том, что после нескольких успешных выборок поведение останавливается полностью.
Есть идеи, почему или с чего начать расследование?
Спасибо!