【问题标题】:Why does my GridView intermittently not display my .net TemplateFields为什么我的 GridView 间歇性地不显示我的 .net TemplateFields
【发布时间】:2010-12-07 23:17:27
【问题描述】:

我的 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 问题的其他帖子,但似乎都没有解决这里发生的问题。

有什么想法吗?

【问题讨论】:

  • 请验证您在每次回发时将gridview 与填充数据的数据源绑定,而不是空的。
  • 我用调试器验证了好几次。

标签: asp.net gridview web-controls templatefield


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多