Подтвердить что ты не робот

Изменение цвета кнопки в ячейке DataGridView

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

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

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

Это не изменяет ничего видимого:

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

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

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

4b9b3361

Ответ 1

По 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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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