Is it possible to attach multiple layout events to a PdfPCell?

Tags: tablescell eventiText vs iTextSharpiText 5

I'm not sure if it's possible to set multiple events. I would like to separate different cell options in separate events based on my business logic. Sometimes I want to draw an ellipse in it, sometimes a square (or anything else). It would be nice if I could simply attach the events that I need.

Posted on StackOverflow on Mar 18, 2015 by Robert

Yes, you can add multiple cell events to a cell. This is the Java code of the setCellEvent() method:

public void setCellEvent(PdfPCellEvent cellEvent) {
    if (cellEvent == null) {
        this.cellEvent = null;
    } else if (this.cellEvent == null) {
        this.cellEvent = cellEvent;
    } else if (this.cellEvent instanceof PdfPCellEventForwarder) {
        ((PdfPCellEventForwarder) this.cellEvent).addCellEvent(cellEvent);
    } else {
        PdfPCellEventForwarder forward = new PdfPCellEventForwarder();
        forward.addCellEvent(this.cellEvent);
        forward.addCellEvent(cellEvent);
        this.cellEvent = forward;
    }
}

If you pass null, then all existing events are removed from the cell. If no cell event was present, a new cell event is added. If there is already a cell event present, a PdfPCellEventForwarder is created. This is a class that stores different cell events and that eventually will execute all these events one by one.

I found the answer thanks to your response. The PdfPCellEventForwarder class is publicly available in iTextSharp. An instance of this can be set to the CellEvent property of a PdfPCell. On the instance, one can call the AddCellEvent() method.

iTextSharp (C#) is kept in sync with iText (Java), so the Java functionality also works for iTextSharp:

virtual public IPdfPCellEvent CellEvent {
    get {
        return this.cellEvent;
    }
    set {
        if (value == null) this.cellEvent = null;
        else if (this.cellEvent == null) this.cellEvent = value;
        else if (this.cellEvent is PdfPCellEventForwarder)
            ((PdfPCellEventForwarder)this.cellEvent).AddCellEvent(value);
        else {
            PdfPCellEventForwarder forward = new PdfPCellEventForwarder();
            forward.AddCellEvent(this.cellEvent);
            forward.AddCellEvent(value);
            this.cellEvent = forward;
        }
    }
}

There is no need to create your own PdfPCellEventForwarder (although you may do so if you want to), iTextSharp will take care of creating a PdfPCellEventForwarder in your place if you add multiple events to a PdfPCell.