2 years ago
#69067
MMil
DataGridView data not showing on adding button to column header
I have a datagridview with a custom column header which was created as below
public readonly Button button = new Button();
private Padding m_ButtonPadding = Padding.Empty;
public DataGridViewButtonHeaderCell(int buttonWidth = 40)
{
button = new Button()
{
BackColor = Color.Transparent,
Width = buttonWidth,
FlatStyle = FlatStyle.Flat,
Image = Properties.Resources.Add
};
button.FlatAppearance.BorderSize = 0;
m_ButtonPadding = new Padding(button.Width + 2, 0, 0, 0);
button.Click += ButtonClick;
}
public void ReplaceHeaderCell(DataGridViewColumnHeaderCell previousHeader)
{
if (previousHeader == null) return;
SetStandardValues(previousHeader);
var dgv = previousHeader.DataGridView;
dgv.Columns[previousHeader.OwningColumn.Index].HeaderCell = this;
previousHeader.Dispose();
}
private void SetStandardValues(DataGridViewColumnHeaderCell previous)
{
if (previous == null) return;
this.Style = previous.Style;
button.Font = this.Style.Font ?? previous.DataGridView.ColumnHeadersDefaultCellStyle.Font;
// etc.
}
private void ButtonClick(object sender, EventArgs e)
{
OnClick(new DataGridViewCellEventArgs(ColumnIndex, RowIndex));
MessageBox.Show("You clicked me");
}
protected override void OnDataGridViewChanged()
{
base.OnDataGridViewChanged();
if (this.DataGridView == null) return;
this.DataGridView.Controls.Add(button);
}
protected override void Paint(Graphics g, Rectangle clipBounds, Rectangle bounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advBorderStyle, DataGridViewPaintParts parts)
{
cellStyle.Padding = Padding.Add(m_ButtonPadding, cellStyle.Padding);
base.Paint(g, clipBounds, bounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advBorderStyle, parts);
button.Location = new Point(bounds.Left, bounds.Top + 2);
button.Height = bounds.Height - 4;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
button.MouseClick -= ButtonClick;
button.Dispose();
}
base.Dispose(disposing);
}
The custom column headers are created as below
foreach (DataGridViewColumn dc in GridV.Columns)
{
var newButtonHeaderCell = new DataGridViewButtonHeaderCell();
newButtonHeaderCell.ReplaceHeaderCell(dc.HeaderCell);
}
The datagridview is bound to a datatable via bindingsource. The problem is that, after adding the custom column headers, my data does not appear in the datagridview unless i click on a column header. Why does this happen? P.S. found this code from a helpful user here.
c#
winforms
datagridview
0 Answers
Your Answer