Изменить цвет кнопки в 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()
.