开发者

Method to Find GridView Column Index by Name

I'm trying to write a small method to loop through and find a GridView Column by its Index, since it can change position based on what might be visible.

Here is what I have so far:

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;
}

In this case, DataColumn doesn't appear to be the right type to use, but I'm kind of lost as to what I should be doing here.

I can only use .NE开发者_StackOverflowT 2.0 / 3.5. I can't use 4.0.


I figured it out, I needed to be using DataControlField and slightly different syntax.

The working version:

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;
    }


I prefer collection iteration but why bother with the overhead of foreach and grid.Columns.IndexOf call in this case? Just iterate through array with an index.

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;
}


Better solution which works for Datafield, SortExpression and 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;
    }


//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;
    }


In case if you need a column itself and not just its index you can use some Linq magic:

DataControlField col=GridView1.Columns.Cast<DataControlField>().First(c => c.HeaderText == "Column_header")


Here's a VB version

Protected Function GetColumnIndexByHeaderText(grid As GridView, findHeader As String) As Integer
    Dim i As Integer = 0
    For i = 0 To grid.Columns.Count - 1
        If grid.Columns(i).HeaderText.ToLower().Trim() = findHeader.ToLower().Trim() Then
            Return i
        End If
    Next

    Return -1
End Function


This way, works for me (.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;
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜