none
DataGridView – comment faire pour désactiver une cellule RRS feed

  • Discussion générale

  • Même si une cellule peut être en lecture seule pour l'empêcher d'être modifiable, le DataGridView n'a pas de support intégré pour la désactivation d'une cellule. Normalement, le concept de "disabled" signifie que l'utilisateur ne peut pas y naviguer et généralement a un repère visuel que la cellule est désactivée. Il n’y a pas un moyen simple de créer la navigation pour ‘disabled’, mais le repère visuel est quelque chose qui peut être fait. Alors qu’aucune cellule intégrée n’a pas une propriété ‘disabled’, l'exemple suivant étend DataGridViewButtonCell et implémente un état "désactivé" visuel avec une propriété ‘désactivé’ correspondante.

     

    public class DataGridViewDisableButtonColumn : DataGridViewButtonColumn
    {
      public DataGridViewDisableButtonColumn()
      {
        this.CellTemplate = new DataGridViewDisableButtonCell();
      }
    }
     
    public class DataGridViewDisableButtonCell : DataGridViewButtonCell
    {
      private bool enabledValue;
      public bool Enabled
      {
        get {
          return enabledValue;
        }
        set {
          enabledValue = value;
        }
      }
     
      //Remplacer la methode Clone pour copier la propriete Enabled
      public override object Clone()
      {
        DataGridViewDisableButtonCell cell =
          (DataGridViewDisableButtonCell)base.Clone();
        cell.Enabled = this.Enabled;
        return cell;
      }
     
      //Activer le ButtonCell par defaut
      public DataGridViewDisableButtonCell()
      {
        this.enabledValue = true;
      }
     
      protected override void Paint(Graphics graphics,
        Rectangle clipBounds, Rectangle cellBounds, int rowIndex,
        DataGridViewElementStates elementState, object value,
        object formattedValue, string errorText,
        DataGridViewCellStyle cellStyle,
        DataGridViewAdvancedBorderStyle advancedBorderStyle,
        DataGridViewPaintParts paintParts)
      {
        // le ButtonCell est desactive, donc on dessine la bordure,
        // l’arriere-ecran et le bouton desactive pour la cellule
        if (!this.enabledValue)
        {
          // Draw the cell background, if specified.
          if ((paintParts & DataGridViewPaintParts.Background) ==
            DataGridViewPaintParts.Background)
          {
            SolidBrush cellBackground =
              new SolidBrush(cellStyle.BackColor);
            graphics.FillRectangle(cellBackground, cellBounds);
            cellBackground.Dispose();
          }
     
          // Dessiner les bordures
          if ((paintParts & DataGridViewPaintParts.Border) ==
            DataGridViewPaintParts.Border)
          {
            PaintBorder(graphics, clipBounds, cellBounds, cellStyle,
              advancedBorderStyle);
          }
     
          // Calculer la surface sur laquelle on dessine le bouton
          Rectangle buttonArea = cellBounds;
          Rectangle buttonAdjustment =
            this.BorderWidths(advancedBorderStyle);
          buttonArea.X += buttonAdjustment.X;
          buttonArea.Y += buttonAdjustment.Y;
          buttonArea.Height -= buttonAdjustment.Height;
          buttonArea.Width -= buttonAdjustment.Width;
     
          // Dessiner le bouton desactive        
          ButtonRenderer.DrawButton(graphics, buttonArea,
            PushButtonState.Disabled);
     
          // Dessiner le texte du bouton desactive
          if (this.FormattedValue is String)
          {
            TextRenderer.DrawText(graphics,
              (string)this.FormattedValue,
              this.DataGridView.Font,
              buttonArea, SystemColors.GrayText);
          }
        }
        else
        {
          // le bouton est active, donc on laisse la classe de base
    // s’occuper du dessin
          base.Paint(graphics, clipBounds, cellBounds, rowIndex,
            elementState, value, formattedValue, errorText,
            cellStyle, advancedBorderStyle, paintParts);
        }
      }
    }

     

     

     

    Pour plusieurs questions sur la bibliothèque de classes .NET, visitez Foire aux Questions  -  Bibliothèque de classes .NET Framework

    mercredi 30 juin 2010 12:02