1

我的问题有两个:首先,当设置 asp.net gridview 的 autogeneratecolumns=true 属性时,即使对于 datakeynames 属性中列出的字段也会生成列,这是否是微软的错误?当然,这与 datakeys 的整个基本原理相反吗?其次,有没有一种方法可以使用数据键,而不必将网格中的所有非数据键列显式列出为绑定字段,这既繁琐又不利于维护?

根据 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 列没有出现。我已经看到许多建议在数据绑定后隐藏列,但它们对我和其他人不起作用 当自动生成列时,即使在 PreRender 中它们似乎也不可用/生成。

4

1 回答 1

2

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 永远不会显示它不应该显示的内容。我从来没有发现它像你想的那样乏味。

于 2015-06-04T13:13:21.020 回答