public int Count(CellShapes shape) { int c = 0; foreach (Cell item in this) if (item.Shape == shape) c++; return c; }
/// <summary> /// Fügt den Zellen Shape der aktuellen Liste hinzu. /// </summary> /// <param name="cellShape"></param> internal void AddCellShape(CellShape cellShape) { if (CellShapes == null) { CellShapes = new List <CellShape>(); } if (cellShape != null) { CellShapes.Add(cellShape); } }
/// <summary> /// Prüft <paramref name="range"/> auf Änderungen zu den überwachten <seealso cref="CellShapes"/>. /// Sind Änderungen vorhanden, werden diese direkt umgesetzt. Es werden keine neuen Barcodes gefunden. /// </summary> /// <param name="range"></param> internal void CheckRange(Excel.Range range) { if (!range.Worksheet.Name.Equals(WorksheetName)) { throw new ArgumentException($"Worksheet range check failed: Worksheet.Name '{range.Worksheet.Name}' is not the required name '{WorksheetName}'"); } //Ist im Zellen Cache überhaupt ein Shape vorhanden? if (CellShapes?.Count > 0) { //Durch alle Zellen der Range laufen foreach (Excel.Range cell in range.Cells) { //Ist im Zellen Cache irgend eine Adresse welche der Adresse der Zelle entspricht? if (CellShapes.Any(x => x.Address.Equals(cell.Address))) { //Die geänderte Zelle ermitteln var cllShp = CellShapes.First(x => x.Address.Equals(cell.Address)); //Wurde der Inhalt geändert if (!cllShp?.Value?.Equals(cell.Value)) { /* * Ja hier müssen wir einen neuen Shape erstellen, die Formatierung, Wert und Position * des alten übernehmen und diesen im Cache und im Tabellenblatt ersetzen. * Am Ende wird der alte Shape gelöscht. */ //System.Windows.Forms.MessageBox.Show($"Die Zelle {cell.Address} wurde geändert.\nAktueller Worksheet: {range.Worksheet.Name}\nAlter Wert: {cllShp.Value}\nNeuer Wert: {cell.Value}"); try { //Wenn der alte Shape != null ist if (cllShp.Shape != null) { //Hier picken wir die Formatierungsoptionen des alten Shapes auf //Das kann zu einem Fehler führen, weil z.B. das Bild gelöscht wurde try { cllShp.Shape.PickUp(); } catch (Exception) { //Dann löschen wir dies aus dem Cache und //lassen die nächste Zelle prüfen CellShapes.Remove(cllShp); continue; } //Dann erzeugen wir einen neuen Shape CellShape newShape = CellShape.AddShape(cell, cllShp.Shape.Placement, false, false); //Wenn der nicht null ist //Diese Prüfung bewirkt, dass bei einem Löschen des Zelleninhaltes auch der Barcode gelöscht wird if (newShape?.Shape != null) { //dann übernehmen wir Position und Größe des alten newShape.Shape.Top = cllShp.Shape.Top; newShape.Shape.Left = cllShp.Shape.Left; newShape.Shape.Width = cllShp.Shape.Width; newShape.Shape.Height = cllShp.Shape.Height; //Und wir ersetzen die Formatierungsoptionen durch die Optionen welche oben //gepickt wurden newShape.Shape.Apply(); //Dann fügen wir den neuen Shape unserem Cache hinzu CellShapes.Add(newShape); } //Wir löschen den alten Shape cllShp.Shape.Delete(); } //Der Cache wird trotzdem um den alten Cacheeintrag erleichtert. CellShapes.Remove(cllShp); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show( $"Error on replace a barcode in the worksheet\n\n{ex.Message}" , "Error in OBIforExcel" , System.Windows.Forms.MessageBoxButtons.OK , System.Windows.Forms.MessageBoxIcon.Error); } } } } } }