为什么我的GridView间歇性地不显示我的.net TemplateFields

时间:2010-12-07 23:17:27

标签: asp.net gridview web-controls templatefield

我的GridView很糟糕。我一直用细齿梳子检查我的代码,但找不到问题。

我有一个包含七列的ASP.net GridView;数据来自SQL。两列包含用户可以单击以删除或修改数据库中的条目的javascript。其他五个字段包含数据库中人员的姓名,电话号码和电子邮件地址。

我的四个字段是ASP.net TemplateFields。

页面加载后,所有内容都会正确显示。但是,如果用户单击JavaScript链接,单击以按任何字段对GridView进行排序,或者执行导致回发的任何其他操作,则生成的页面可能不会显示我的TemplateFields的内容;他们都是空白的。

这样你就可以看到我正在使用的内容,我有一个“名称”列,其定义如下:

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

如果我通过调试器中的代码,我看到在模板字段正确显示的情况下,调试器在显示名称的行上停止。如果字段都是空白的,它会跳过代码以显示这些字段的内容;并且没有任何可靠的理由。

唯一可能导致问题的是,从查询字符串(它告诉页面要加载哪些数据)中设置了一个枚举值。当枚举值设置为1时,我从未看到此错误,但似乎我总是在枚举值设置为2时看到它。

但是,在我的gridview代码中,枚举永远不会被引用。

无论如何,总是调用GridView.DataSource = x并且总是调用GridView.DataBind()。我已经尝试逐步执行代码并检查数据库中的数据是否正确。我已经尝试调试调用DataBind的代码块以及GridViewRow_DataBound事件处理程序。

我在其他地方看到过有关TemplateField问题的其他帖子,但是它们似乎都没有解决这里发生的事情。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我想出了部分答案。我发现一些代码如下:

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;
    }