我正在尝试自定义DataGridView类,在所有行下面都有一个按钮。
到目前为止,我已经为DataGridView.Controls添加了一个按钮。
在每个添加/删除行上计算此按钮的位置,DataGridView调整大小并滚动。
这有效,但是有一个问题。在DataGridView上调整大小或滚动,当DataGridView的下边缘直接位于最后一行下方时,该按钮根本不可见或仅部分显示。
有没有办法让按钮始终可见?
我尝试过设置滚动条位置和FirstDisplayedScrollingRowIndex。这不起作用。 不幸的是,这个项目不可能添加一个全新的行。
添加按钮:
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;
}
}
答案 0 :(得分:0)
下面是一些代码,它创建了我之前描述的“按钮行”,并将此按钮行添加到DataGridView
的顶部,底部和第4行。如图所示,此按钮仅在第一列中。如果要在所有列中显示按钮,则必须实现OnPaint方法来调整此行。但是,查看图片时,如果用户向下滚动,则顶部按钮行将不可见,这是您必须实现的位置,以便在用户向下滚动时将按钮行保持在顶部。如果这是您正在寻找的,那么您最终得到的是一个始终显示在网格顶部的STATIC按钮。再次将此按钮放在网格上方和外侧将完成相同的操作,而且工作量更少。
以下代码使用带有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);
}
}