我的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问题的其他帖子,但是它们似乎都没有解决这里发生的事情。
有什么想法吗?
答案 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;
}