Изменение свойств столбца GridView из-за кода - PullRequest
5 голосов
/ 17 июля 2009

Я создаю GridView в методе, подобном так:

GridView gridView = new GridView();
gridView.DataSource = reportData.Tables[0];
gridView.DataBind();

Позже я экспортирую его в Excel, и он отлично работает. Столбцы генерируются автоматически из моих исходных данных. Однако я хотел бы изменить свойство DataFormatString некоторых столбцов после привязки данных и перед экспортом в Excel. Я не могу найти правильное свойство для изменения. Кто-нибудь может указать мне правильное направление?

Ответы [ 4 ]

7 голосов
/ 23 июля 2009

Согласно документации AutoGenerateColumns :

Эта опция обеспечивает удобный способ отображать каждое поле в данных источник; однако, у вас есть ограниченный контроль над тем, как автоматически сгенерированное поле столбца отображается или ведет себя .

Примечание: автоматически сгенерированные поля связанных столбцов не являются добавлено в коллекцию Columns .

Я устал искать эти AutoGeneratedField без удачи.
Я могу придумать несколько вариантов для достижения этого (от худшего к лучшему):

  1. Добавьте событие в сетку (например, RowDataBound), это даст вам доступ к ячейкам строк, но это не слишком удобно.
  2. Не использовать AutoGeneratedField Создать эти столбцы вручную, как в:

    BoundField dateField = new BoundField();
    dateField.HeaderText = "Date";
    dateField.DataField = "date";
    dateField.DataFormatString = "{0:MMMM, yyyy}";
    gridView.Columns.Add(dateField); 
    

    Эта опция позволяет вам контролировать заголовки.

  3. Добавить еще один слой для форматирования данных и представления. Это, наверное, лучший вариант. Кроме того, таким образом, вам не нужно использовать DataTables, GridView может быть привязан к любой коллекции объектов с открытыми свойствами (например, к List<Employee)), а AutoGeneratedField превращает их в столбцы.
    Я думаю, что это лучший вариант. Предположим, вы можете получить доступ к автоматическим столбцам, что тогда? Вам придется искать столбец по его имени или индексу, который кажется очень грязным и увеличивает сцепление.

И, как последнее замечание, вы должны подумать о создании файлов Excel с помощью API. Это не так просто, но файлы HTML XLS менее совместимы с Excel 2007 - он отображает предупреждающее сообщение о том, что формат файла несовместим с расширением, и, что еще хуже, файл тормозит, если он открыт и сохраняется (может быть Save As хотя), делая ваши файлы менее удобными для пользователя.

0 голосов
/ 20 июля 2009

Например:

String newDataFormatString = "{0:d}";
BoundField bf = gridView.Columns[Index] as BoundField;
if (bf != null) {
    bf.DataFormatString = "{0}"; // workaround to sync with ViewState (it's documented)
    bf.DataFormatString = newDataFormatString;
}
0 голосов
/ 22 июля 2009

Вот выдержка из экспортера GridView, который я написал, который преобразует элементы управления в GridView в литералы, которые переформатируются. Это может помочь:

        /// <summary>
    /// Parses and cleans up data from the GridView controls collection
    /// to make the data more suitable for Exported
    /// </summary>
    /// <param name="gv">The GridView to parse</param>
    private void CleanUpControls(Control gv)
    {
        Literal l = new Literal();

        for (int i = 0; i < gv.Controls.Count; i++)
        {

            if (gv.Controls[i].GetType() == typeof (LinkButton))
            {
                l.Text = (gv.Controls[i] as LinkButton).Text;
                ReplaceWithLiteral(gv, l, i);
            }
            else if (gv.Controls[i].GetType() == typeof (ListControl))
            {
                l.Text = (gv.Controls[i] as ListControl).SelectedItem.Text;
                ReplaceWithLiteral(gv, l, i);
            }
            else if (gv.Controls[i].GetType() == typeof (CheckBox))
            {
                l.Text = (gv.Controls[i] as CheckBox).Checked ? "True" : "False";
                ReplaceWithLiteral(gv, l, i);
            }
            else if (gv.Controls[i].GetType() == typeof (BooleanImage))
            {
                l.Text = (gv.Controls[i] as BooleanImage).Value ? "True" : "False";
                ReplaceWithLiteral(gv, l, i);
            }
            else if (gv.Controls[i].GetType().ToString() == "System.Web.UI.WebControls.PagerTable")
                ReplaceWithLiteral(gv, l, i);

            else if (gv.Controls[i].GetType() == typeof (HyperLink))
            {
                HyperLink hl = gv.Controls[i] as HyperLink;
                if (MakeHyperLinksAbsolute)
                {
                    if (hl != null)
                        hl.NavigateUrl = UrlHelper.MakeAbsoluteUrl(hl.NavigateUrl);
                }

                switch (TreatHyperLinksAs)
                {
                    case HyperLinkMode.Text:
                        l.Text = hl.Text;
                        ReplaceWithLiteral(gv, l, i);
                        break;

                    case HyperLinkMode.NavigateUrl:
                        if (hl != null) l.Text = hl.NavigateUrl;
                        ReplaceWithLiteral(gv, l, i);
                        break;

                    case HyperLinkMode.ToolTip:
                        l.Text = hl.ToolTip;
                        ReplaceWithLiteral(gv, l, i);
                        break;

                    case HyperLinkMode.TextAndLink:
                        l.Text = String.Format("{0} ({1})", hl.Text, hl.NavigateUrl);
                        ReplaceWithLiteral(gv, l, i);
                        break;

                    case HyperLinkMode.HyperLink:
                        break;
                }
            }

            if (gv.Controls[i].HasControls())
                CleanUpControls(gv.Controls[i]);
        }
    }
0 голосов
/ 20 июля 2009

Это вопрос о том, как работает asp.net. Когда вы создаете некоторые элементы управления (столбцы) в методе и устанавливаете для этих элементов управления значение user, в следующий раз, когда пользователь отправляет данные обратно вам, у вас не будет доступа к этим столбцам, поскольку они ... не существуют. Каждый раз, когда вы отображаете свой сайт, создается новый объект (экземпляр).
Единственный способ получить данные в записи обратно из ранее созданных элементов управления - это создать элементы управления в методе Page_Init…

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...