如何有效地在DataGridView中按其第一列值查找行

时间:2015-11-05 18:30:09

标签: c# datagridview

我需要一种方法,从星期一到星期五打印一个月内的所有星期,然后在数据网格视图中打印与每个工作日相对应的行。

我有一个完整的解决方案,但效率不高,因为我必须逐个查看每一行,看看它是否匹配,一个月中的每个工作日:

for (int i=diaInicio;i<=diaFinal;i++)
{
    fecha = i.ToString().PadLeft(2, '0') + "-" + fechaInicio.Month.ToString().PadLeft(2, '0') 
                + "-" + fechaInicio.Year.ToString();
    fechaCiclo = new DateTime(fechaInicio.Year, fechaInicio.Month, i);
    foreach (DataGridViewRow row in dgActividades.Rows)
    {
        if (row.Cells[0].Value.ToString().Equals(fecha))
        {
            //suppose this actually prints the row's cells
            printRowCells();
        }
        else if (Convert.ToInt32(row.Cells[0].Value.ToString().Substring(0, 2)) > i)
        { 
            //break when the grid date is newer that what i want
            break;
        }
    }
}

所以这样做,就是从第一行迭代到第一行读取第一行然后断开,然后从11月9日到第13行调用等等......如你所见,我有在外面读取每天最多31天,大约20次......几乎是O(N)^ 2

是否有一些索引或地图方法可以将我自己定位在我需要的第一行,然后像我正在做的那样打破或者会不会有太多麻烦?

编辑:它有点hackish,但是如果我添加一个全局变量来存储从0开始的DataGridView索引的当前位置,我可以有效地迭代所有这一次:

int indiceFila = 0;
for (int i=diaInicio;i<=diaFinal;i++)
{
    fecha = i.ToString().PadLeft(2, '0') + "-" + fechaInicio.Month.ToString().PadLeft(2, '0') 
    + "-" + fechaInicio.Year.ToString();
    while(indiceFila<dgActividades.Rows.Count-1)
    {
        DataGridViewRow row = dgActividades.Rows[indiceFila];
        if (row.Cells[0].Value.ToString().Equals(fecha))
        {
            printValues();
        }
        else if (Convert.ToInt32(row.Cells[0].Value.ToString().Substring(0, 2)) > i)
        { 
            break;
        }
        indiceFila++;
    }
}

当然,这仅在第一列按升序日期

排序时有效

0 个答案:

没有答案