Почему мой GridView периодически не отображает мои .net TemplateFields - PullRequest
0 голосов
/ 08 декабря 2010

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

У меня есть ASP.net GridView с семью столбцами;данные поступают из SQL.Два столбца содержат JavaScript, по которому пользователь может щелкнуть, чтобы удалить или изменить запись в базе данных.Другие пять полей содержат имена, номера телефонов и адреса электронной почты людей в базе данных.

Четыре из моих полей - ASP.net TemplateFields.

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

Чтобы вы могли видеть, с чем я работаю, у меня есть столбец «name», который определяется следующим образом:

<asp:TemplateField HeaderText="Name" SortExpression="name" ItemStyle-Width="150">
<ItemTemplate>
<%#(string)Eval("surname") + ", " + (string)Eval("fname")  %>
</ItemTemplate>
</asp:TemplateField>

Если я перейду черезКод в отладчике, я вижу, что в случае, если поля шаблона отображаются правильно, отладчик останавливается на строке, которая отображает имя.В случае, если все поля не заполнены, он перепрыгивает через код для отображения содержимого этих полей;и ни по какой недвусмысленной причине.

Единственное, что, кажется, вызывает проблему, - это то, что из строки запроса установлено единственное значение перечисления (которое сообщает странице, какие данныенагрузка).Когда значение enum установлено в 1, я никогда не вижу эту ошибку, но мне кажется, что я всегда вижу ее, когда значение enum установлено в 2.

Однако, на перечисление никогда не ссылаются нигде в моем gridviewcode.

В любом случае всегда вызывается GridView.DataSource = x и всегда вызывается GridView.DataBind ().Я попытался пройти через код и проверить правильность данных из базы данных.Я попытался отладить блок кода, откуда вызывается DataBind, а также обработчик событий GridViewRow_DataBound.

В других местах я видел другие сообщения о проблемах с TemplateField, но ни одна из них, похоже, не касается того, что здесь происходит..

Есть идеи?

1 Ответ

0 голосов
/ 08 декабря 2010

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

if (!userIsAllowedToSeePrivatePhoneNumbers)
    removePrivatePhoneNumber(gridView);
***
    protected void removePrivatePhoneNumber(GridView gridView)
    {
        DataControlField privatePhoneNumberColumn = null;
        foreach (DataControlField column in gridView.Columns)
        {
            if (column.HeaderText.ToUpper() == "PRIVATE PHONE")
                privatePhoneNumberColumn = column;
        }            

        gridView.Columns.Remove(privatePhoneNumberColumn);
    }

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

    protected void removePrivatePhoneNumber(GridView gridView)
    {
        DataControlField privatePhoneNumberColumn = null;
        foreach (DataControlField column in gridView.Columns)
        {
            if (column.HeaderText.ToUpper() == "PRIVATE PHONE")
                privatePhoneNumberColumn = column;
        }            

        privatePhoneNumber.Visible = false;
    }
...