我的问题有两方面:首先,微软是否错误地设置了asp.net gridview的autogeneratecolumns = true属性,即使对于datakeynames属性中列出的字段,也会生成列?当然这与datakeys的整个基本原理相反? 其次,有没有办法使用datakeys而不必明确地将网格中的所有非datakey列列为绑定字段,这对于维护来说既乏味又不好?
根据AVD的评论,我举一个例子:假设我有这个查询作为我网格的来源
SELECT intAssessmentElementID, strModuleCode, strAssessmentElement,
Weighting, intSemester, SubmissionDate FROM tblAssessmentElements
我不想显示intAssessmentElementID。这是我的gridview定义
<asp:GridView ID="grdAssessmentElements" runat="server" DataKeyNames="intAssessmentElementID">
<Columns>
<asp:BoundField HeaderText="Module Code" DataField="strModuleCode" />
<asp:BoundField HeaderText="Element" DataField="strAssessmentElement" />
<asp:BoundField HeaderText="Weighting" DataField="Weighting" />
<asp:BoundField HeaderText="Semester" DataField="intSemester" />
<asp:BoundField HeaderText="Submission Date" DataField="SubmissionDate" />
</Columns>
</asp:GridView>
写出那些绑定字段很繁琐,如果我在查询中添加一个字段,我必须记住将它添加到网格定义中。使用autogeneratecolumns = true,更新将是自动的。但autogeneratecolumns = true会生成所有列,甚至是datakeynames中列出的列。我认为这是对等的。我想要一种方法来同时使用autogeneratecolumns = true和datakeynames,但不会出现datakeynames列。我看到了很多关于数据绑定后隐藏列的建议,但它们不适合我和others 当列自动生成时,即使在PreRender中,它们似乎也不可用/生成。
答案 0 :(得分:1)
AutoGenerateColumns的定义如下(强调我的):
获取或设置一个值,该值指示是否为数据源中的每个字段自动创建绑定字段。
如果您不想显示所有字段,则必须为要显示的每个字段手动创建DataField。不幸的是,AutoGenerateColumns和DataKeyNames互不了解。
另一个选择是使用AutoGenerateColumns,但隐藏您不希望在创建时看到的单元格。首先,挂钩RowCreated
事件。
<asp:GridView ID="grdAssessmentElements" runat="server"
DataKeyNames="intAssessmentElementID"
OnRowCreated="grdAssessmentElements_RowCreated">
然后在此事件中隐藏单元格。这个问题是你必须硬编码索引。例如,如果您知道第一列是您要隐藏的列。
protected void grdAssessmentElements_RowCreated(object sender, GridViewRowEventArgs e)
{
e.Row.Cells[0].Visible = False;
}
但是,这仍然无法解决在开始返回新列时必须立即更改代码的问题。只要添加新列并且您不想显示它,就必须添加更多代码。
要回答第二个问题,您可以随时使用DataKeys。您可以将它与AutoGenerateColumns一起使用并自己隐藏单元格。或者您可以使用它并明确列出您的列。
我更喜欢列出每一列。这样,如果查询在您不知情的情况下发生变化,您就会知道您的GridView永远不会显示它不应该显示的内容。我从来没有发现它像你似乎在思考那样乏味。