Как я могу изменить тип поля в GridView во время выполнения с AutoGenerate = "True"? - PullRequest
2 голосов
/ 15 сентября 2009

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

Теперь у меня есть сетка с AutoGenerateColumns = "true", с помощью которой я бы хотел перехватить HeaderText, посмотреть, является ли это конкретное значение, а затем заменить его на "SpecialBoundField". Я пытался использовать событие OnDataBinding для циклического перемещения по столбцам, но на данный момент в сетке нет столбцов. Я думаю, что RowDataBound и DataBound слишком поздно в игре, поэтому не уверен, что делать.

Моя следующая мысль состояла в том, чтобы переопределить сам элемент управления сеткой, чтобы добавить в него событие «AutoGeneratingColumn» в

protected virtual AutoGeneratedField CreateAutoGeneratedColumn(AutoGeneratedFieldProperties fieldProperties)

Может кто-нибудь помочь или направить меня в лучшем направлении? Спасибо!

Ответы [ 2 ]

3 голосов
/ 15 сентября 2009

Если в наборе данных возвращаются оба поля, я бы предложил установить видимость столбцов, а не пытаться динамически добавлять или изменять поля данных. Невидимые столбцы не отображают HTML, поэтому нужно просто посмотреть на строку заголовка, когда она будет привязана, проверить интересующее вас поле и установить видимость столбца.

void myGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
  {

    if (e.Row.RowType == DataControlRowType.Header)
    {
      if (e.Row.Cells[1].Text = "BadText")
      {
         myGridView.Columns[1].Visible = false;
         myGridView.Columns[5].Visible = true;
      }
    }
  }
1 голос
/ 21 сентября 2009

Чем я закончил:

public class SpecialGridView : GridView
{
    protected override void OnRowDataBound(GridViewRowEventArgs e)
    {
        ModifyData(e);
        base.OnRowDataBound(e);
    }

    IList<string> _columnNames = new List<string>();
    protected void ModifyData(GridViewRowEventArgs e)
    {
        LoadColumnNames(e);

        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            for (int i = 0; i < e.Row.Cells.Count; i++)
            {
                string currentColumnName = _columnNames[i];
                if (IsSpecialColumn(currentColumnName))
                {
                    string text = e.Row.Cells[0].Text;
                    bool isSpecialData = text.ToUpper() == "Y";

                    if (isSpecialData)
                    {
                        e.Row.Cells[i].CssClass += " specialData";
                    }
                }
            }
        }
    }

    private void LoadColumnNames(GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        {
            foreach (TableCell cell in e.Row.Cells)
            {
                _columnNames.Add(cell.Text);
            }
        }
    }

    private bool IsSpecialColumn(string currentColumnName)
    {
        foreach (string columnName in SpecialColumnNames)
        {
            if (currentColumnName.ToUpper() == columnName.ToUpper())
            {
                return true;
            }
        }
        return false;
    }

    private IList<string> _specialColumnNames = new List<string>();
    public IList<string> SpecialColumnNames
    {
        get { return _specialColumnNames; }
        set { _specialColumnNames = value; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...