Cellule personnalisée

Corps d'une cellule

ReoGrid fournit une interface qui supporte la création des cellules personnalisées.
24.png
Le corps d'une cellule dans une cellule doit toujours être inférieur à la cellule même si c'est une cellule groupée. Le corps peut utiliser les propriétés d'une cellule, comme ses données, sa formule, ses styles et d'autres ressources. Il est vivement recommandé d'utiliser les données de la cellule pour afficher un label ou n'importe quoi d'autre qui soit le text du corps.
p06.png

Exemple

23.png

Interface du corps d'une cellule

Un corps de cellule personnalisé doit hériter de CellBody ou implémenter l'interface ICellBody. La classe CellBody fournit les méthodes suivantes qui peuvent être surchargées (override) par la classe de l'utilisateur :
public class CellBody : ICellBody
{
  public ReoGridCell Cell { get; set; }

  public virtual void OnSetup() { }

  public virtual Rectangle Bounds { get; set; }
  public virtual void OnBoundsChanged() { }

  public virtual void OnMouseDown(RGCellMouseEventArgs e) { }
  public virtual void OnMouseMove(RGCellMouseEventArgs e) { }
  public virtual void OnMouseUp(RGCellMouseEventArgs e) { }
  public virtual void OnMouseEnter(RGCellMouseEventArgs e) { }
  public virtual void OnMouseLeave(RGCellMouseEventArgs e) { }
  public virtual void OnMouseWheel(RGCellMouseEventArgs e) { }

  public virtual void OnKeyDown(KeyEventArgs e) { }
  public virtual void OnKeyUp(KeyEventArgs e) { }

  public virtual void OnPaint(RGDrawingContext dc) { }

  public virtual bool OnStartEdit() { return true; }
  public virtual object OnEndEdit(object data) { return data; }
  public virtual object OnPaste(object data) { return data; }
  public virtual void OnGotFocus() { }
  public virtual void OnLostFocus() { }

  public virtual object OnSetData(object data) { return data; }
  public virtual object OnSetText(string text) { return text; }

  public virtual object GetData() { return null; }
}

Création de son corps de cellule

Hériter de la classe CellBody, et ajouter son instance dans le contrôle de la Grid.
private class MyCellBody : CellBody
{
  public MyCellBody() {
  }
}

grid["C3"] = new MyCellBody();

Dessin du propriétaire

En surchargeant la méthode OnPaint pour dessiner n'importe quoi dans la cellule:
private class MyCellBody : CellBody
{
  public override void OnPaint(RGDrawingContext dc)
  {
    // Dessin d'une ellipse dans la cellule
    dc.Graphics.DrawEllipse(Pens.Blue, base.Bounds);
  }
}
La propriété Bounds reprsente les liens du corps de la cellule qui sont géré automatiquement par le contrôle.
25.png
On doit utiliser les méthodes DCDrawingContext suivantes pour appeler le module de rendu du noyau afin d'afficher le rendu original du texte de la cellule et de son arrière-plan :
dc.DrawCellText();         // Dessin du texte de la cellule
dc.DrawCellBackground();   // Dessin de l'arrière-plan de la cellule

Désactivation de l'édition d'une cellule

On désactive l'édition d'une cellule en surchargeant la méthode OnStartEdit et en retournant une valeur fausse afin d'indiquer au contrôle que l'édition doit être annulée.
private class MyCellBody : CellBody
{
  public override bool OnStartEdit()
  {
    return false;
  }
}

Gestion des évènements souris et clavier

Pour gérer les évènements soursi et clavier, il suffit de surcharger les méthodes OnKeyDown et OnMouseDown.
public override bool OnMouseDown(RGCellMouseEventArgs e)
{
  // translation de la position du curseur en pourcentage
  int value = (int)Math.Round(x * 100f / (Bounds.Width));

  // mise à jour des données d'une cellule. Ne pas définir les données de la cellule directement, appelez les méthodes du contrôle à la place
  grid.SetCellData(e.CellPosition, value);
}

26.png

Liaison donnée en utilisant une formule

Il est possible de lier les données de deux cellules en utilisant une formule :
grid["C7"] = "=E7";

27.png

Suivant : Changer l’affichage

Last edited Feb 7, 2014 at 7:28 AM by unvell, version 6