0

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

有任何想法吗?

4

1 回答 1

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;
    }
于 2010-12-08T15:34:00.173 回答