2 years ago

#69067

test-img

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

Accepted video resources