2008-10-07 6 views
2

J'essaie de remplacer la méthode de peinture de DataGridViewTextBoxCell dans une classe dérivée afin de pouvoir mettre en retrait le texte de premier plan d'une quantité variable de pixels. Je voudrais si la largeur de la colonne ajuste de sorte que sa largeur totale est la longueur de mon texte de cellules plus le retrait de «tampon». Est-ce que quelqu'un sait d'un moyen d'accomplir cela? est répertorié Ma mise en œuvre boiteuse ci-dessous:Substitution de la méthode de peinture DataGridViewTextBoxCell

public class MyTextBoxCell : DataGridViewTextBoxCell{ .... 
     protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) { 
      clipBounds.Inflate(100, 0); 

      DataGridViewPaintParts pp = DataGridViewPaintParts.Background | DataGridViewPaintParts.Border | DataGridViewPaintParts.ContentBackground 
       | DataGridViewPaintParts.ErrorIcon; 
      base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, pp);    

       string text = formattedValue as string; 

//My lame attempt to indent 20 pixels?? 
       TextRenderer.DrawText(graphics, text, cellStyle.Font, new Point(cellBounds.Location.X + 20, cellBounds.Location.Y), cellStyle.SelectionForeColor ,TextFormatFlags.EndEllipsis); 

} 

}

Répondre

1

Si vous essayez de dimensionner automatiquement les colonnes (en fonction de la taille du contenu de la cellule), vous devez examiner la propriété Column.AutoSizeMode et la propriété Column.DefaultCellStyle.

static const int INDENTCOEFF = 5; 
DataGridViewCellStyle cellStyle = new DataGridViewCellStyle(); 

cellStyle.Padding = 
     new Padding(INDENTCOEFF , 5, INDENTCOEFF , 5); //left,top,right,bottom 
MyColumn.DefaultCellStyle = cellStyle; 
MyColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 
+0

Vivek, Merci d'avoir souligné la propriété Padding, je me sens bête d'avoir manqué en premier lieu. Je peux simplifier un peu mon code en utilisant cette technique. – sbeskur

+0

DataGridView Control est le contrôle le plus complexe que j'ai vu. Il est facile d'oublier certaines de ses caractéristiques soignées. – Vivek

2

Vous pouvez simplement brancher la CellFormattingEvent dans le datagridview et faire la mise en forme là-bas. Ou, si vous héritez de DataGridView, vous pouvez simplement remplacer la méthode OnCellFormatting. Le code ressemblerait à ceci:

  if (e.ColumnIndex == 1) 
      { 
       string val = (string)e.Value; 
       e.Value = String.Format(" {0}", val); 
       e.FormattingApplied = true; 
      } 

Juste un peu de code, mais vous avez l'idée.

+1

BFree, Je veux éviter de faire précéder le texte d'espaces vides. Si je peux mettre en retrait un certain nombre de pixels, l'effet de rendu ne sera pas perdu lorsque la police est modifiée. Aussi vouloir gérer cela au niveau de la cellule. Cela est possible avec d'autres produits de la grille en me demandant comment je peux y parvenir avec DataGridView. – sbeskur

2

Eh bien, je pense que je l'ai. Au cas où quelqu'un est ici se intéresse le code ci-dessous:

public class MyTextBoxCell : DataGridViewTextBoxCell{ .... 
     private static readonly int INDENTCOEFFICIENT = 5; 
     protected override Size GetPreferredSize(Graphics graphics, DataGridViewCellStyle cellStyle, int rowIndex, Size constraintSize) { 
      int indent = ((MyRow)OwningRow).Indent * INDENTCOEFFICIENT; 
      Size s = base.GetPreferredSize(graphics, cellStyle, rowIndex, constraintSize); 
      int textWidth = 2; //arbitrary amount 
      if (Value != null) { 
       string text = Value as string; 
       textWidth = TextRenderer.MeasureText(text, cellStyle.Font).Width; 
      } 

      s.Width += textWidth + indent; 
      return s; 
     } 

     private static readonly StringFormat strFmt = new StringFormat(StringFormatFlags.NoWrap); 

     protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) { 

      DataGridViewPaintParts pp = DataGridViewPaintParts.Background | DataGridViewPaintParts.Border | DataGridViewPaintParts.ContentBackground 
       | DataGridViewPaintParts.ErrorIcon; 

      base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, pp); 

      string text = formattedValue as string; 

      int indent = ((MyRow)OwningRow).Indent * INDENTCOEFFICIENT; 
      strFmt.Trimming = StringTrimming.EllipsisCharacter; 
      Rectangle r = cellBounds; 
      r.Offset(indent, 0); 
      r.Inflate(-indent, 0); 
      graphics.DrawString(text, cellStyle.Font, Brushes.Black, r, strFmt); 
     } 

} 

Si quelqu'un a une meilleure façon que j'aimerais voir votre solution.

+0

De quel type est MyRow dans votre code? Pouvez-vous envoyer ce code aussi s'il vous plaît? –

Questions connexes