Изменить цвет кнопки в datagridview в клетку

у меня есть большой элемент управления datagridview, который имеет несколько ячеек, большинство из которых содержат кнопки. Как я могу изменить цвет этих кнопок?

это изменяет "контур" кнопки, но не саму кнопку.

row.Cells[2].Style.BackColor = System.Drawing.Color.Red;

это, похоже, не меняет ничего, что видно:

row.Cells[2].Style.ForeColor = System.Drawing.Color.Red;

Если невозможно изменить фон, можно ли изменить шрифт на кнопке?

использование .NET 2.0.

6 ответов


по состоянию на MSDN:

Если визуальные стили включены, кнопки в колонке кнопок окрашены использование ButtonRenderer и ячейки стили, заданные через свойства например, DefaultCellStyle нет эффект.

таким образом, у вас есть два варианта. в вашей программе.CS вы можете удалить эту строку:

Application.EnableVisualStyles();

что заставит его работать, но все остальное будет выглядеть как дерьмо. Другой вариант, и вы не понравится этот, чтобы унаследовать от DataGridViewButtonCell и переопределить метод Paint (). Затем вы можете использовать статический метод на ButtonRenderer класс DrawButton, чтобы нарисовать кнопку самому. Это означает, что выяснить, в каком состоянии находится ячейка в настоящее время (щелкнул, наведите курсор и т. д.) и красить углы и границы etc... Ты понимаешь, что это выполнимо, но очень больно.

Если вы хотите, хотя, вот только некоторые примеры кода, чтобы вы начали:

 //Custom ButtonCell
 public class MyButtonCell : DataGridViewButtonCell
    {
        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)
        {
            ButtonRenderer.DrawButton(graphics, cellBounds, formattedValue.ToString(), new Font("Comic Sans MS", 9.0f, FontStyle.Bold), true, System.Windows.Forms.VisualStyles.PushButtonState.Default);
        }
    }

тогда вот тест DataGridView:

DataGridViewButtonColumn c = new DataGridViewButtonColumn();
            c.CellTemplate = new MyButtonColumn();
            this.dataGridView1.Columns.Add(c);
            this.dataGridView1.Rows.Add("Click Me");

все, что делает этот образец, это нарисовать кнопку с шрифтом "Comic Sans MS". Он не учитывает состояние кнопки, как вы увидите при запуске приложения.

УДАЧИ!!


Я пропустил заметку Дэйва об ответе Томаса, поэтому я просто публикую простое решение.

обновить FlatStyle свойство столбца кнопки для всплывающего окна, а затем путем обновления backcolor и forecolor вы можете изменить внешний вид кнопки.

DataGridViewButtonColumn c = (DataGridViewButtonColumn)myGrid.Columns["colFollowUp"];
c.FlatStyle = FlatStyle.Popup;
c.DefaultCellStyle.ForeColor = Color.Navy;
c.DefaultCellStyle.BackColor = Color.Yellow;

Если эти ячейки содержат кнопку, Я уверен, что вам нужно получить доступ к свойству BackColor этой кнопки. То есть. получить значение ячейки преобразовать его в кнопку и установить его свойство.


кнопка по умолчанию в DataGridView рисуется с помощью ButtonRenderer, что затрудняет переопределение. на вашем месте я бы просто установил FlatStyle кнопки на "Popup".

DataGridViewButtonCell buttonCell = (DataGridViewButtonCell)dataGridMappings.Rows[0].Cells[0];
buttonCell.FlatStyle = FlatStyle.Popup;
buttonCell.Style.BackColor = System.Drawing.Color.Red;

Я думаю, что ты к ней не так:

row.Cells[2].Style.BackColor = System.Drawing.Color.Red;

вы говорите, что обновляет "контур" кнопки, но на самом деле обновляет ячейку за кнопкой.

что-то вроде этого должно работать:

row.Cells[2].ButtonName.Style.BackColor = System.Drawing.Color.Red;

Это абсолютно достаточно, чтобы сделать свой собственный класс, производный от DataGridViewButtonCell с пользовательским Paint способ, без снятия EnableVisualStyles().