Datagridview 行高问题

Datagridview row height issue

我最近更新了我的代码,从在 foreach 循环中使用 Rows.Add 到使用 AddRange 填充 list of rows。事实证明,这可以提高填充 datagridview 的速度(显着),但我遇到了行高问题。这不是 Rows.Add 的问题,因为我可以轻松地设置 rowtemplate.height 属性。部分活动:

var items = listItems; int count = 1;
object[] buffer = new object[3];
List<DataGridViewRow> rows = new List<DataGridViewRow>();

foreach (var i in items)
{
buffer[0] = count;
buffer[1] = i.Desc;
buffer[2] = i.ID;

rows.Add(new DataGridViewRow());
rows[rows.Count - 1].CreateCells(datagridItems, buffer);
count++;
}
datagridItems.Rows.AddRange(rows.ToArray());

无论出于何种原因,无论 rowtemplate.height 属性 设置为什么,以这种方式添加行时都没有关系。我很确定它与这个 rows.Add(new DataGridViewRow()); 有关,因为如果我尝试在 AddRange:

之前添加它
    foreach (DataGridViewRow r in rows)
    {
        r.MinimumHeight = 46;
        r.Height = 46;
    }

^ 有效。但是我认为这不是一个好方法。所以我尝试使用 new DataGridViewRow(),但到目前为止没有成功:

var items = listItems; int count = 1;
object[] buffer = new object[3];
List<DataGridViewRow> rows = new List<DataGridViewRow>();

foreach (var i in items)
{
buffer[0] = count;
buffer[1] = img;
buffer[2] = i.ID;

//rows.Add(new DataGridViewRow()); From the old example   
rows.Add(new DataGridViewRow
{
    MinimumHeight = 46,
    Height = 46
});
rows[rows.Count - 1].CreateCells(datagridItems, buffer);
count++;   
}

/* this works, but there should be a much better way of doing it
foreach (DataGridViewRow r in rows)
{
    r.MinimumHeight = 46;
    r.Height = 46
}
*/
datagridItems.Rows.AddRange(rows.ToArray());

郑重声明,这些是在 datagridview 上设置的一些(可能)相关属性

//by the way, the datagridview is added in the designer
datagridItems.RowTemplate.Height = 46;
datagridItems.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
datagridItems.CellBorderStyle = DataGridViewCellBorderStyle.None;
datagridItems.RowTemplate.MinimumHeight = 46;

DataGridView.RowTemplate 对于您没有显式添加 DataGridViewRow 并且您只是设置数据源或传递值或传递行数的情况很有用。在您的情况下,由于您是自己创建行,因此您有责任手动配置行的属性,或通过手动克隆模板来创建行。

在以下所有示例中,RowTemplate 属性 将自动用于创建行:

  • dataGridView1.DataSource = myList;
  • dataGridView1.RowCount = 5;
  • dataGridView1.Rows.Add(3);
  • dataGridView1.Rows.Add(new object[]{1, "One"});
  • dataGridView1.Rows.Insert(0, new object[]{1, "One"});

如果你像这样添加一行 dataGridView1.Rows.Add(myNewRow),你必须自己处理 myNewRow 属性,例如:\

  • var myNewRow = new DataGridViewRow() {Height = 50};

或者您可以通过克隆 RowTemplate 创建 myNewRow,例如:

  • var myNewRow = (DataGridViewRow)dataGridView1.RowTemplate.Clone();

您可以通过跟踪用法了解更多信息,在 RowTemplate 属性 的 source code 中。