ASP.NET GridView использует FindControl () в BoundField для управления полем - PullRequest
5 голосов
/ 21 июля 2011

Я работаю со старым приложением, в котором были жестко закодированные столбцы для разных местоположений, теперь, когда добавляются новые местоположения, я решил попробовать и динамически заполнить их. Одной из особенностей приложения было отображение красного текста и текста, выделенного жирным шрифтом, когда состояние считалось «плохим». Это было выполнено с помощью функции «FindControl ()» из ячеек в выбранной строке с TemplateFields.

Теперь, когда я настроил использование ограниченного поля, как мне изменить цвет текста, размер и т. Д. Во время события DataBound?

BoundField добавляется в GridView

        BoundField statusField = new BoundField();
        statusField.DataField = "ExceptionStatusCode";
        statusField.HeaderText = "Status";
        statusField.SortExpression = "ExceptionStatusCode";
        this.gvView.Columns.Add(statusField);

Событие DataBound для GridView

    protected void gvView_DataBound(object sender, EventArgs e)
    {
        foreach (GridViewRow row in this.gvView.Rows)
        {
            //NO LONGER WORKS, NEED TO KNOW HOW TO REPRODUCE
            //WHAT IS BELOW FOR BOUND FIELD
            Label lblPartStatus = ((Label) row.Cells[StatusColumn].FindControl("lblPartStatus"));
            if (lblPartStatus.Text == "BAD")
            {
                lblPartStatus.ForeColor = System.Drawing.Color.Red;
                row.ToolTip = "One or more locations is missing information!";
                row.BackColor = System.Drawing.Color.Salmon;
            }
        }
    }

Ответы [ 3 ]

4 голосов
/ 21 июля 2011

Несколько лет назад я написал некоторый код, который поможет вам найти индекс ячейки, используя столбец SortExpression, HeaderText или DataField.Это сэкономило мне много усилий за эти годы, и вы просто называете это как myRow.Cells[myRow.GetCellIndexByFieldHandle(myDataFieldName)]


public static class Utility
{
    /// <summary>
    /// Gets the ordinal index of a TableCell in a rendered GridViewRow, using a text fieldHandle (e.g. the corresponding column's DataFieldName/SortExpression/HeaderText)
    /// </summary>
    public static int GetCellIndexByFieldHandle(this GridView grid, string fieldHandle)
    {
        int iCellIndex = -1;

        for (int iColIndex = 0; iColIndex < grid.Columns.Count; iColIndex++)
        {
            if (grid.Columns[iColIndex] is DataControlField)
            {
                DataControlField col = (DataControlField)grid.Columns[iColIndex];
                if ((col is BoundField && string.Compare(((BoundField)col).DataField, fieldHandle, true) == 0)
                    || string.Compare(col.SortExpression, fieldHandle, true) == 0
                    || col.HeaderText.Contains(fieldHandle))
                {
                    iCellIndex = iColIndex;
                    break;
                }
            }
        }
        return iCellIndex;
    }

    /// <summary>
    /// Gets the ordinal index of a TableCell in a rendered GridViewRow, using a text fieldHandle (e.g. the corresponding column's DataFieldName/SortExpression/HeaderText)
    /// </summary>
    public static int GetCellIndexByFieldHandle(this GridViewRow row, string fieldHandle)
    {
        return GetCellIndexByFieldHandle((GridView)row.Parent.Parent, fieldHandle);
    }
}

Когда у вас есть ячейка, я предлагаю вам манипулировать ею, установив Cell.CssClass, а затем с помощью CSS для стилизации его соответственно.Держитесь подальше от встроенного стиля, который вы получаете, когда устанавливаете ForeColor, BackColor и т. Д.

2 голосов
/ 21 июля 2011

Если в вашей сетке всегда есть X столбцов, вы можете получить к ним следующий доступ:

void grid_RowDataBound(Object sender, GridViewRowEventArgs e)
  {

    if(e.Row.RowType == DataControlRowType.DataRow)
    {
      string text = e.Row.Cells[1].Text;

      if( text.Equals("BAD") )
      {
         //do your stuff...
      }
    }

  }

теперь измените индекс ячейки на любой столбец индекса, который вас интересует, имеет ... прикрепить функцию к событию OnRowDataBound вместо OnDataBound

0 голосов
/ 21 июля 2011

Необработанным решением было бы добавить индекс столбца в ViewState ...

statusField.SortExpression = "ExceptionStatusCode";
ViewState("StatusIndex") = this.gvView.Columns.Count;
this.gvView.Columns.Add(statusField);

... и затем использовать его снова для привязки данных

Label lblPartStatus = ((Label) row.Cells[ViewState("StatusIndex")].FindControl("lblPartStatus"));
...