如何在 RowDataBound 事件中访问 GridView 的列?

7

当值为1时,我希望将我的网格视图列的值更改为“active”。 我有一个类似于以下的网格视图列:

<asp:BoundField   DataField="STATUS" HeaderText="STATUS" SortExpression="STATUS" HeaderStyle-HorizontalAlign="Left">
                <HeaderStyle HorizontalAlign="Left"></HeaderStyle>
            </asp:BoundField>

和计算机科学代码

 protected void gvCategory_RowDataBound(object sender, GridViewRowEventArgs e)
    {

        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if (e.Row.Cells[5].Text=="0")
            {
                e.Row.Cells[5].Text = "INACTIVE";
            }
        }
    }

这个代码实现是正确的,但是如果我更改了列的顺序,它就会出错。我需要像 findControl 函数一样的东西。谢谢。

3个回答

18

这是我几年前编写的一些实用工具,可能会对你有所帮助:

// ---- GetCellByName ----------------------------------
//
// pass in a GridViewRow and a database column name 
// returns a DataControlFieldCell or null

static public DataControlFieldCell GetCellByName(GridViewRow Row, String CellName)
{
    foreach (DataControlFieldCell Cell in Row.Cells)
    {
        if (Cell.ContainingField.ToString() == CellName)
            return Cell;
    }
    return null;
}

// ---- GetColumnIndexByHeaderText ----------------------------------
//
// pass in a GridView and a Column's Header Text
// returns index of the column if found 
// returns -1 if not found 

static public int GetColumnIndexByHeaderText(GridView aGridView, String ColumnText)
{
    TableCell Cell;
    for (int Index = 0; Index < aGridView.HeaderRow.Cells.Count; Index++)
    {
        Cell = aGridView.HeaderRow.Cells[Index];
        if (Cell.Text.ToString() == ColumnText)
            return Index;
    }
    return -1;
}

// ---- GetColumnIndexByDBName ----------------------------------
//
// pass in a GridView and a database field name
// returns index of the bound column if found 
// returns -1 if not found 

static public int GetColumnIndexByDBName(GridView aGridView, String ColumnText)
{
    System.Web.UI.WebControls.BoundField DataColumn;

    for (int Index = 0; Index < aGridView.Columns.Count; Index++)
    {
        DataColumn = aGridView.Columns[Index] as System.Web.UI.WebControls.BoundField;

        if (DataColumn != null)
        {
            if (DataColumn.DataField == ColumnText)
                return Index;
        }
    }
    return -1;
}

对于第一个函数 GetCellByName,它只应在标题行类型为 e.Row.RowType == DataControlRowType.Header 时调用。 - David d C e Freitas
@DavidFreitas 我不这么认为。它使用给定单元格的基础DataControlField。 - Steve Wellens

3

您可以循环所有列以获取正确的索引,也可以使用以下LINQ:

String colToFind = "status";
int colIndex = ((GridView)sender).Columns.Cast<DataControlField>()
                .Where((c, index) => c.HeaderText.ToLower().Equals(colToFind))
                .Select((c,index)=>index).First();

0

更清晰易读的LINQ。Tim的方法对我不起作用。

private int GetFirstGridViewColIndex(string dataField, object sender)
{
    var boundFieldColumns = ((GridView)sender).Columns.Cast<BoundField>();

    return boundFieldColumns.Where((column, index) => string.Equals(column.DataField, dataField, StringComparison.InvariantCultureIgnoreCase))
        .Select((column, index) => index)
        .First();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接