在DataGridView中,当我在运行时调整列的位置以使其标题的高度被修改(因为从一行切换到两行显示,反之亦然), GetCellDisplayRectangle.Location()仍然指示单元格的旧垂直位置。 dataGridView1.Refresh()没有帮助。例如,如果我调整表格尺寸(它锚定到表单),则刷新位置信息。这是为什么?我能做什么?感谢。
更新:
我想要实现的目标是在DataGridView的第二列中添加时间选择器。我知道这是一个古老的主题,我知道MSDN的例子,我不喜欢它因为它庞大,繁琐而且不完全是我需要的。我使用一个简单的解决方案:使用每个新的DataGridView行我添加DateTimePickers配置为我想要DataGridView控件,我将它们定位到所需的单元格位置。这个解决方案几乎可以工作:我现在的问题是,每次滚动或更改单元格的高度/高度时,我必须重新定位/调整大小/隐藏/显示选择器。 附加DataGridView行的代码:
List<DateTimePicker> tplist;
int index;
int x, y;
private void button_append_Click( object sender, EventArgs e )
{
DateTimePicker tp;
tp = new DateTimePicker();
tp.Format = DateTimePickerFormat.Custom;
tp.CustomFormat = "mm:ss";
tp.ShowUpDown = true;
tp.Value = DateTime.Now.Date;
tp.Value = new DateTime( 2000, 1, 1, 0, index, 0 );
dataGridView1.Controls.Add( tp );
dataGridView1.Rows.Add( new object[] { "line " +
Convert.ToString( index ),
"val " + Convert.ToString( index ) } );
Rectangle frame = dataGridView1.GetCellDisplayRectangle( 1,
dataGridView1.RowCount - 1, false );
tp.Size = frame.Size;
tp.Location = frame.Location;
if( dataGridView1.RowCount <=
dataGridView1.FirstDisplayedCell.RowIndex +
dataGridView1.DisplayedRowCount( true ) )
tp.Visible = true;
else tp.Visible = false;
tplist.Add( tp );
if( tplist.Count == 1 )
{ x = tplist[ 0 ].Location.X; y = tplist[ 0 ].Location.Y; }
index++;
}
变量&#34;指数&#34;仅用于调试。 每当我更改单元格的几何形状时,我会删除行或滚动DataGridView我调用函数:
private void Adjust()
{
for( int i = 0; i < tplist.Count; i++ )
{
tplist[ i ].Location = dataGridView1.GetCellDisplayRectangle( 1, i, true ).Location;
if( tplist[ i ].Location.X == 0 )
{
tplist[ i ].Location = new Point( x, y );
}
else
{
x = tplist[ 0 ].Location.X; y = tplist[ 0 ].Location.Y;
}
tplist[ i ].Size = dataGridView1.GetCellDisplayRectangle( 1, i, false ).Size;
if( i >= dataGridView1.FirstDisplayedCell.RowIndex && i < dataGridView1.FirstDisplayedCell.RowIndex + dataGridView1.DisplayedRowCount( true ) )
tplist[ i ].Visible = true;
else tplist[ i ].Visible = false;
}
dataGridView1.Refresh();
}
请注意,对于第一行(对于第一行DataGridView行,而不是取决于滚动的顶部可见行),我必须专门做一些杂技。这是因为有时候GetCellDisplayRectangle.Location为单元格0,1返回0,0。无论如何,我实际上对所有单元格的GetCellDisplayRectangle.Location都有问题。