Изменение цвета кнопки в ячейке DataGridView
У меня есть большой элемент управления DataGridView, который содержит несколько ячеек, большинство из которых содержат кнопку. Как изменить цвет этих кнопок?
Это изменяет "контур" кнопки, но не сама кнопка.
row.Cells[2].Style.BackColor = System.Drawing.Color.Red;
Это не изменяет ничего видимого:
row.Cells[2].Style.ForeColor = System.Drawing.Color.Red;
Если изменить фон невозможно, можно ли изменить шрифт на кнопке?
Использование .NET 2.0.
Ответы
Ответ 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;
Это будет работать.