在 asp.net gridview 中,autogeneratecolumns=true 是否应该忽略数据键?
in an asp.net gridview, should autogeneratecolumns=true ignore datakeys?
我的问题有两个:首先,当 asp.net gridview 的 autogeneratecolumns=true 属性设置时,即使在 datakeynames 属性中列出的字段也会生成列,这是否是 Microsoft 的错误?这肯定与数据密钥的整个基本原理相反吗?
其次,有没有一种方法可以使用datakeys而不必将网格中的所有非datakey列显式列为绑定字段,这既繁琐又不利于维护?
根据 AVD 的评论,我将举一个例子:假设我将此查询作为我的网格的来源
SELECT intAssessmentElementID, strModuleCode, strAssessmentElement,
Weighting, intSemester, SubmissionDate FROM tblAssessmentElements
而且我不想显示 intAssessmentElementID。这是我的网格视图定义
<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 中,它们也不会显示为 available/generated。
AutoGenerateColumns 的定义如下(强调我的):
Gets or sets a value indicating whether bound fields are automatically created for each field in the data source.
如果您不想显示所有字段,则必须为每个要显示的字段手动创建一个 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 永远不会显示它不应该显示的内容。我从来没有发现它像你想的那样乏味。
我的问题有两个:首先,当 asp.net gridview 的 autogeneratecolumns=true 属性设置时,即使在 datakeynames 属性中列出的字段也会生成列,这是否是 Microsoft 的错误?这肯定与数据密钥的整个基本原理相反吗? 其次,有没有一种方法可以使用datakeys而不必将网格中的所有非datakey列显式列为绑定字段,这既繁琐又不利于维护?
根据 AVD 的评论,我将举一个例子:假设我将此查询作为我的网格的来源
SELECT intAssessmentElementID, strModuleCode, strAssessmentElement,
Weighting, intSemester, SubmissionDate FROM tblAssessmentElements
而且我不想显示 intAssessmentElementID。这是我的网格视图定义
<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 中,它们也不会显示为 available/generated。
AutoGenerateColumns 的定义如下(强调我的):
Gets or sets a value indicating whether bound fields are automatically created for each field in the data source.
如果您不想显示所有字段,则必须为每个要显示的字段手动创建一个 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 永远不会显示它不应该显示的内容。我从来没有发现它像你想的那样乏味。