向DataGridView添加按钮

时间:2017-03-23 11:51:06

标签: c# .net winforms datagridview

我正在尝试自定义DataGridView类,在所有行下面都有一个按钮。

到目前为止,我已经为DataGridView.Controls添加了一个按钮。

在每个添加/删除行上计算此按钮的位置,DataGridView调整大小并滚动。

这有效,但是有一个问题。在DataGridView上调整大小或滚动,当DataGridView的下边缘直接位于最后一行下方时,该按钮根本不可见或仅部分显示。

有没有办法让按钮始终可见?

我尝试过设置滚动条位置和FirstDisplayedScrollingRowIndex。这不起作用。 不幸的是,这个项目不可能添加一个全新的行。

button partially visible

添加按钮:

buttonAddRow.Height = 17;
buttonAddRow.Text = "+";
buttonAddRow.FlatStyle = FlatStyle.System;
buttonAddRow.Font = new Font(buttonAddRow.Font.FontFamily, 6.75F);
buttonAddRow.Click += ButtonAddRow_Click;
dataGridView.Controls.Add(buttonAddRow);

位置:

private void setLocation()
{
    if (dataGridView.FirstDisplayedCell != null)
    {
        int positionY = 0;
        positionY += dataGridView.ColumnHeadersHeight;

        var visibleRowsCount = dataGridView.DisplayedRowCount(true);
        var firstDisplayedRowIndex = dataGridView.FirstDisplayedCell.RowIndex;
        var lastvisibleRowIndex = (firstDisplayedRowIndex + visibleRowsCount) - 1;
        for (int rowIndex = firstDisplayedRowIndex; rowIndex <= lastvisibleRowIndex; rowIndex++)
        {
            positionY += dataGridView.Rows[rowIndex].Height;
        }

        buttonAddRow.Location = new Point(dataGridView.ClientRectangle.X, dataGridView.ClientRectangle.Y + positionY);
        buttonAddRow.Visible = true;
    }
}

1 个答案:

答案 0 :(得分:0)

下面是一些代码,它创建了我之前描述的“按钮行”,并将此按钮行添加到DataGridView的顶部,底部和第4行。如图所示,此按钮仅在第一列中。如果要在所有列中显示按钮,则必须实现OnPaint方法来调整此行。但是,查看图片时,如果用户向下滚动,则顶部按钮行将不可见,这是您必须实现的位置,以便在用户向下滚动时将按钮行保持在顶部。如果这是您正在寻找的,那么您最终得到的是一个始终显示在网格顶部的STATIC按钮。再次将此按钮放在网格上方和外侧将完成相同的操作,而且工作量更少。

enter image description here

以下代码使用带有3个文本列的DataGridView

private void Form1_Load(object sender, EventArgs e) {
  FillGrid();
  InsertButtonRow(0);
  InsertButtonRow(4);
  InsertButtonRow(dataGridView.Rows.Count -1);
}

private void FillGrid() {
  for (int i = 1; i < 15; i++) {
    dataGridView.Rows.Add("Row" + i + "C1", "Row" + i + "C2", "Row" + i + "C3");
  }
}

private void InsertButtonRow(int rowIndex) {
  if (rowIndex >= 0 && rowIndex < dataGridView.Rows.Count) {
    DataGridViewButtonCell buttonCell = new DataGridViewButtonCell();
    buttonCell.Value = "+";
    buttonCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
    DataGridViewRow row = (DataGridViewRow)dataGridView.Rows[0].Clone();
    row.Cells[0] = buttonCell;
    dataGridView.Rows.Insert(rowIndex, row);
  }
}