Переопределение метода рисования DataGridViewTextBoxCell - PullRequest
3 голосов
/ 07 октября 2008

Я пытаюсь переопределить метод рисования 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);

}

}

Ответы [ 3 ]

2 голосов
/ 08 октября 2008

Ну, я думаю, у меня это есть. Если кто-то заинтересован, вот код ниже:

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);
        }

}

Если у кого-то есть способ получше, я бы хотел увидеть ваше решение.

2 голосов
/ 07 октября 2008

Вы можете просто подключиться к CellFormattingEvent в сетке данных и выполнить там свое форматирование. Или, если вы наследуете от DataGridView, вы можете просто переопределить метод OnCellFormatting. Код будет выглядеть примерно так:

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

Просто грубый код, но вы поняли.

1 голос
/ 08 октября 2008

Если вы пытаетесь автоматически изменять размер столбцов (в зависимости от размера содержимого ячейки), вам следует обратить внимание на свойства Column.AutoSizeMode и 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...