【问题标题】:in an asp.net gridview, should autogeneratecolumns=true ignore datakeys?在 asp.net gridview 中,autogeneratecolumns=true 是否应该忽略数据键?
【发布时间】:2015-08-18 20:34:20
【问题描述】:

我的问题有两个:首先,当设置了 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 中,它们似乎也不可用/生成。

【问题讨论】:

  • 嗯,你需要设置DataKeyNames属性。设置 DataKeyNames 属性后,GridView 控件会自动为控件中的每一行创建一个 DataKey 对象。 msdn.microsoft.com/en-us/library/…

标签: asp.net gridview autogeneratecolumn


【解决方案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 将永远不会显示它不应该显示的内容。我从未发现它像您想的那样乏味。

【讨论】:

  • j.f.,您的回答肯定很有帮助,因为e.Row.Cells[0].Visible = False; 成功隐藏了一个列,而类似的行试图在 PreRender 中隐藏整个列却没有。你引用了 AutoGenerateColumns 的定义——但你认为它是矛盾的吗?
  • 不,不完全是。虽然在我看到你的帖子之前,我从来没有像你这样想过。我一直认为AutoGenerateColumns 只是一种快速创建非常简单的GridView 的方法。我给它字段,它会根据这些字段为我创建一个 GridView。但是,我以前从未在商业环境中实际使用过它。存储过程可能随时更改,并可能让我的 GridView 显示它不应该显示的敏感信息。我总是喜欢控制。
  • 另外,如果AutoGenerateColumnsDataKeyNames 合作,我想提前知道这一点——比如AutoGenerateColumnsWithoutDataKeyNames。如果我自动生成列并在其中放置一些数据键,但我开始看不到某些列,如果不阅读 AutoGenerateColumns 的文档,可能很难理解为什么。您最不想做的就是让不/不能阅读文档的程序员感到困惑。
  • j.f.还有@DJDave - 多年后我知道,但不幸的是现在尝试这个单元格隐藏代码会使分页不起作用(如果我添加此代码,则没有分页控件,如果我删除它,它们会回来):-( - 建议手动指定列仍然很好!
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 2014-11-12
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多