如果没有行,GetColumnDisplayRectangle没有值

时间:2017-12-04 08:45:33

标签: c# winforms datagridview .net-4.0

在winforms中我需要检索DataGridView中每列的位置,为此我使用此函数:

Rectangle rec = dgv.GetColumnDisplayRectangle(getColumnIndexByName(entry.Key), true);

并给我回复列,但如果我有一个没有记录的表,该函数得到一个带有0值的rec ...

我该如何解决这个问题?

如果网格有行,那么这就是我所拥有的:

enter image description here

在蓝色面板中,我有一些文本框,我用它作为下面一列值的过滤器

现在如果网格有一些行,它可以很好地工作,我得到了列矩形,我获得了左边和宽度,我可以将过滤器放在标题上面但是如果我设置错了过滤器和查询检索0记录,我不知道文本框的位置

修改:getColumnIndexByName的代码:

protected int getColumnIndexByName(string name)
{
    foreach (DataGridViewColumn col in dgv.Columns)
    {
        if (col.Name.ToLower().Trim() == name.ToLower().Trim()) return col.Index;
    }
    return -1;
}

感谢

1 个答案:

答案 0 :(得分:0)

如果列不是GetColumnDisplayRectangle,则

Rectangle.Empty会返回Displayed

您可能还想查看DataGridView方法的源代码,if (!this.Columns[columnIndex].Displayed) { return Rectangle.Empty; } 用它来计算给定列的矩形。

该方法包含以下代码:

this.SuspendLayout();
var width = this.dataGridView1.Width;
this.dataGridView1.Width = 8388607;
var rectangles = this.dataGridView1.Columns.Cast<DataGridViewColumn>()
    .Select(x => dataGridView1.GetColumnDisplayRectangle(x.Index, false))
    .ToList();
this.dataGridView1.Width = width;
this.ResumeLayout();

解决方法

如果您正在寻找一种解决方法,可以使用以下代码获取矩形列表而不会出现任何闪烁:

let mainBundle = Foundation.Bundle.main