如何在设计器中设置DataGridView的第一行高度

3

我尝试在设计师中控制列,并在设计师或代码中更改所有行的高度。以下代码和设置更改了除第一行外所有行的高度,就像图像一样。

private void Form1_Load(object sender, EventArgs e)
{
    Text = dataGridView1.Rows[0].Height.ToString(); // always 33

    // in Designer
    // RowTemplate.Height = 50
    // AutoSizeRowsMode = none
}

在此输入图片描述

当我填写第一行单元格时,会创建50个高度为50的行。运行时代码没有任何区别。要修复它,我必须在网格绘制完成后编写dataGridView1.Rows[0].Height = 50。为什么会这样,如何在设计级别上实现?

1个回答

3
如果您没有为DataGridView设置数据源,控件的构造函数会缓存多个属性的默认值(设置默认状态),然后调用PerformLayout();但是,正如您在源代码中所看到的,布局被设置为:
SetState(States.LayoutDeferred, true); 
//[...] 
LayoutEngine.ProcessSuspendedLayoutEventArgs(this, args);. 

默认布局不考虑行模板的高度,因为应用了默认布局。
另一方面,当您设置数据源时,OnDataSourceChanged() 方法被调用,进而调用 InvalidateRowHeights()RefreshColumnsAndRows(),因此进行完整的布局,包括预设的行模板。
您有多种方法来解决当前问题:
  • 将值强制为 DataGridView 的第一行,这里指的是简单的新行对象,例如:dataGridView1.Rows[0].Height = dataGridView1.RowTemplate.Height;,如果您有预定义的值,那么这些值将应用于所有 (*) 之后的行。
  • 添加一个新的空数据行,即 dataGridView1.Rows.Add();
  • 设置一个空的数据源然后移除它,例如:DataGridView1.DataSource = new BindingSource(); dataGridView1.DataSource = null;
  • 设置一个实际的数据源

可能存在一些问题,当自定义绘画被使用时,相关的代码应该被设计来处理这种情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接