Изменить цвет кнопки в ячейке DataGridView - PullRequest
12 голосов
/ 25 февраля 2009

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

Это меняет «контур» кнопки, но не самой кнопки.

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

Похоже, это ничего не меняет:

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

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

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

Ответы [ 7 ]

26 голосов
/ 08 мая 2010

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

Обновите свойство FlatStyle столбца Button до Всплывающего, а затем, изменив задний и передний цвета, вы можете изменить внешний вид кнопки.

DataGridViewButtonColumn c = (DataGridViewButtonColumn)myGrid.Columns["colFollowUp"];
c.FlatStyle = FlatStyle.Popup;
c.DefaultCellStyle.ForeColor = Color.Navy;
c.DefaultCellStyle.BackColor = Color.Yellow;
13 голосов
/ 25 февраля 2009

Согласно MSDN:

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

Следовательно, у вас есть один из двух вариантов. В вашем Program.cs вы можете удалить эту строку:

Application.EnableVisualStyles();

, что заставит его работать, но все остальное будет выглядеть как дерьмо. Другой вариант, который вам не понравится, - наследовать от DataGridViewButtonCell и переопределять метод Paint (). Затем вы можете использовать статический метод класса ButtonRenderer с именем DrawButton , чтобы нарисовать кнопку самостоятельно. Это означает выяснение, в каком состоянии находится ячейка в данный момент (щелчок, зависание и т. Д.) И рисование углов и границ и т. Д. Вы понимаете, это выполнимо, но ОГРОМНАЯ боль

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

 //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». Он не учитывает состояние кнопки, как вы увидите при запуске приложения.

УДАЧИ !!

2 голосов
/ 02 августа 2013

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

DataGridViewButtonCell buttonCell = (DataGridViewButtonCell)dataGridMappings.Rows[0].Cells[0];
buttonCell.FlatStyle = FlatStyle.Popup;
buttonCell.Style.BackColor = System.Drawing.Color.Red;
1 голос
/ 25 февраля 2009

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

0 голосов
/ 21 мая 2019

Измените ячейку FlatStyle на следующее:

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

Это будет работать.

0 голосов
/ 25 апреля 2011

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

0 голосов
/ 25 февраля 2009

Я думаю, что вы обращаетесь к нему неправильно:

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

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

примерно так должно работать:

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