Любой способ манипулировать столбцами в GridView с AutoGenerateColumns = true? - PullRequest
7 голосов
/ 26 марта 2009

Кажется, что нет способа манипулировать столбцами Gridview, если AutoGenerateColumns = true. Вот мой сценарий:

У меня есть общий GridView, который отображает результаты различных запросов LINQ в зависимости от того, что выбрал пользователь. Мне нравится тот факт, что AutoGenerateColumns работает так, как должно, и мне не нужно указывать все столбцы BoundField, TemplateField и т. Д. ...

Кроме того, я также программно добавляю другие столбцы по мере необходимости. Столбцы, которые добавляются программным способом, отображаются слева от автоматически сгенерированных столбцов. Что если бы я хотел переместить их вправо?

GridView.Columns.Count учитывает только те, которые запрограммированы, а не созданы автоматически, поэтому я не могу переставить столбцы, которые мне нужны. Я могу перехватить событие RowDataBound и «спрятать» что-нибудь, если это необходимо, но я не могу переставить.

Должен ли я просто отказаться от AutoGeneratedColumns = true и разложить их с помощью BoundFields для каждого запроса? Что я могу сделать?

Ответы [ 5 ]

3 голосов
/ 26 марта 2009

Вы можете манипулировать вещами в привязке данных следующим образом:

Private Sub MyGrid_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles Me.RowDataBound
  If Me.AutoGenerateColumns = True Then
    If e.Row.RowType = DataControlRowType.DataRow Then
          e.row.cells.add(some code here to add your special column)
    End If
    End If
End Sub

Вы должны создать свой собственный заголовок, но это очень выполнимо.

1 голос
/ 10 августа 2010

Если кому-то все еще нужен ответ: просто используйте e.Row.Cells.Count из RowDataBound .

1 голос
/ 07 августа 2009

Ответ Брендана напомнил мне, что я лежал без дела .. Хорошо для форматирования.

GridView ...

<asp:GridView .... OnRowDataBound="myGridView_RowDataBound">

Код позади ...

Sub myGridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
      ' Display the data in italics.
      e.Row.Cells(1).Text = "<i>" & e.Row.Cells(1).Text & "</i>"
    End If
End Sub
1 голос
/ 26 марта 2009

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

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

Из документации MSDN:

Когда свойство AutoGenerateColumns имеет значение true, AutoGeneratedField объект автоматически создается для каждое поле в источнике данных. каждый поле отображается в виде столбца в элемент управления GridView в том порядке, поля появляются в источнике данных. Эта опция обеспечивает удобный способ отображать каждое поле в данных источник; однако, вы ограничили контроль над тем, как автоматически сгенерированное поле столбца отображается или ведет себя.

Автоматически сгенерированный связанный столбец поля не добавляются в столбцы коллекция.

Вместо того, чтобы позволить GridView контроль автоматически сгенерировать поля столбца, вы можете вручную определить поля столбца с помощью установка AutoGenerateColumns свойство ложь, а затем создание Пользовательская коллекция столбцов. К тому же привязать поля столбцов, вы также можете отобразить поле столбца кнопки, чек поле столбца поля, поле команды, поле столбца гиперссылки, изображение поле или поле столбца на основе вашего собственный настраиваемый шаблон. Для большего информация, см. столбцы.

0 голосов
/ 29 июля 2017

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

Dictionary<string, int> _columnIndiciesForAbcGridView = null;

protected void detailsReportGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (_columnIndiciesForAbcGridView == null)
    {
        int index = 0;
        _columnIndiciesForAbcGridView = ((Table)((GridView)sender).Controls[0]).Rows[0].Cells
            .Cast<TableCell>()
            .ToDictionary(c => c.Text, c => index++);
    }

    // Add a column, this shifts the _columnIndiciesForAbcGridView though.

    TableCell cell = new TableCell();
    cell.Text = "new Column";
    e.Row.Cells.AddAt(2, cell);

    // Swap 0 and 1

    int c0 = _columnIndiciesForAbcGridView["ConfigId"];
    int c1 = _columnIndiciesForAbcGridView["CreatedUtc"];

    string text = e.Row.Cells[c0].Text;
    e.Row.Cells[c0].Text = e.Row.Cells[c1].Text;
    e.Row.Cells[c1].Text = text;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...