C#DataGridView:GetCellDisplayRectangle.Location返回错误的值

时间:2017-02-22 05:12:59

标签: c# datagridview

在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都有问题。

0 个答案:

没有答案