Подтвердить что ты не робот

Метод поиска индекса столбца GridView по имени

Я пытаюсь написать небольшой метод для прокрутки и найти столбец GridView по его индексу, так как он может изменять позицию на основе того, что может быть видимым.

Вот что я до сих пор:

private int GetColumnIndexByName(GridView grid, string name)
{
    foreach (DataColumn col in grid.Columns)
    {
        if (col.ColumnName.ToLower().Trim() == name.ToLower().Trim()) return col.Ordinal;
    }

    return -1;
}

В этом случае DataColumn, похоже, не подходит для использования, но я как бы потерял то, что я должен делать здесь.

Я могу использовать только .NET 2.0/3.5. Я не могу использовать 4.0.

4b9b3361

Ответ 1

Я понял, мне нужно было использовать DataControlField и немного другой синтаксис.

Рабочая версия:

private int GetColumnIndexByName(GridView grid, string name)
    {
        foreach (DataControlField col in grid.Columns)
        {
            if (col.HeaderText.ToLower().Trim() == name.ToLower().Trim())
            {
                return grid.Columns.IndexOf(col);
            }
        }

        return -1;
    }

Ответ 2

Я предпочитаю сборку итераций, но зачем беспокоиться об издержках вызова foreach и grid.Columns.IndexOf в этом случае? Просто перебирайте массив с индексом.

private int GetColumnIndexByName(GridView grid, string name)
{
    for(int i = 0; i < grid.Columns.Count; i++)
    {
        if (grid.Columns[i].HeaderText.ToLower().Trim() == name.ToLower().Trim())
        {
            return i;
        }
    }

    return -1;
}

Ответ 3

Лучшее решение, которое работает для Datafield, SortExpression и headerText.

public static int GetBoundFieldIndexByName(this GridView gv,string name)
    {
        int index = 0;
        bool found = false;
        foreach (DataControlField c in gv.Columns)
        {
            if (c is BoundField)
            {
                BoundField field = (BoundField)c;
                if (name == field.DataField ||
                    name == field.SortExpression ||
                    name == field.HeaderText)
                {
                    found = true;
                    break;
                }
            }
            index++;
        }
        return found ? index : -1;
    }

Ответ 4

Этот способ работает для меня (.NET Gridview):

    private int GetColumnIndexByName(GridView grid, string name)
    {
        for (int i = 0; i < grid.HeaderRow.Cells.Count; i++)
        {
            if (grid.HeaderRow.Cells[i].Text.ToLower().Trim() == name.ToLower().Trim())
            {
                return i;
            }
        }
        return -1;
    }

Ответ 5

//Get index of column by header text.
    int GetColumnIndexByName(GridViewRow row, string headerText)
    {
        int columnIndex = 0;
        foreach (DataControlFieldCell cell in row.Cells)
        {
            if(cell.ContainingField is TemplateField){
                if(((TemplateField)cell.ContainingField).HeaderText.Equals(headerText))
                {
                    break;
                } 
            }
          if(cell.ContainingField is BoundField){
                    if (((BoundField)cell.ContainingField).HeaderText.Equals(headerText))
                {
                    break;
                }
          }
            columnIndex++; 
        }


        return columnIndex;
    }