【问题标题】:GridView rows jumping around while editing dataGridView 行在编辑数据时跳来跳去
【发布时间】:2011-09-14 21:09:42
【问题描述】:

我有一个简单的 Intranet 表单 (ASP.NET 2.0),其中 GridView 绑定到来自 Active Directory 的数据。它使用 SqlDataSource 执行此操作,该 SqlDataSource 从从 AD 中提取数据的视图中进行选择。这比直接从 ASP.NET 进行 LDAP 查询效果更好,因为我可以毫不费力地进行表连接等。 GridView 有一个带有编辑按钮的 CommandField 列,以及一些带有 DropDownLists 的 EditItemTemplate,用于选择有效值。

另一方面,更新是通过直接连接到 AD 来完成的。为此,我必须处理 GridView 的 OnRowUpdating 事件,并将 GridViewUpdateEventArgs 中的 Cancel 设置为 true,因为 SqlDataSource 没有定义更新命令。然后它只是创建一个 DirectorySearcher,根据 distinctName(GridView 的数据键)查找用户,在结果上调用 GetDirectoryEntry(),设置几个属性,最后在 DirectoryEntry 上调用 CommitChanges()。没有问题 - 它正在更新数据就好了。

,但是,行为有点混乱。更新数据时似乎有一点传播延迟。在用于 SqlDataSource 的视图反映更改之前,更新后大约需要十秒钟。我不确定这是否是典型的 AD 行为,或者视图是否连接到与发布更新的 DC 不同的 DC。这种行为本身不是问题,如有必要,我可以忍受。

虽然这不是一个大问题,但它会导致 另一个 问题 - 默认情况下,GridView 在“公司”列上排序,这是允许用户编辑的属性之一.如果用户连续更改公司,稍等片刻(或继续进行多次编辑),然后去编辑另一行,他们最终可能会编辑与他们想要的行相邻的行。这是因为 GridView 重新绑定,突然改变公司的行在列表中的其他位置排序。 GridView 显然是根据行的索引触发了编辑,突然在该索引处出现了不同的行,因为用于数据源的视图突然赶上了现实。

令人困惑的是,GridView 试图在每次回发时进行数据绑定。过去,我必须确保在进行数据编辑后调用 DataBind() 以确保数据是最新的,但现在它每次都能愉快地访问数据源。然而,页面 ViewState 的大小约为 66 KB,所以我知道 GridView 正在将其数据放在那里。

所以,在我的脑海中,这将是几个修复(我还没有成功实施)。

  1. 在每次页面加载时停止 GridView 的数据绑定,并坚持它在 ViewState 中缓存的内容。 GridView 的 OnDataBinding 事件参数上没有“取消”属性,在数据源的 OnSelecting 事件期间设置 Cancel 只会给我留下一个空的 GridView。

  2. 修复传播延迟。再说一次,我对此并不感兴趣,但如果这是一种修复意外跳来跳去的行的方法,那对我来说没问题。我是否只需要确保在数据库视图中以及从 ASP.NET 更新 AD 时都明确连接到同一个 DC?还是有更多的事情发生?

  3. 根据行的主键而不是索引触发行编辑。我猜我必须在该行中创建一个 CommandButton,将 CommandArgument 设置为该行的主键,然后在回发时遍历 GridView 中的所有行并相应地手动设置 EditIndex。

我也对其他想法持开放态度。如果 ViewState 最终有几百 KB,那是可行的。该站点可通过非常快速的 LAN 访问,并且仅供内部使用。

【问题讨论】:

  • 您是否考虑过完全不使用 SqlDataSource 并以编程方式绑定整个应用程序?
  • 我已经考虑过了,但是我将不得不做更多的工作来处理数据绑定、排序等。这不是不可能的,但是如果有更简单的解决方法,我显然更喜欢那个。

标签: asp.net gridview active-directory


【解决方案1】:

无论您如何访问它,从 ASP.NET 更新 Active Directory 都会有点慢。

不知道您的代码是什么样的,如果您使用默认的 ASP.NET 工具集,我建议您使用 UpdatePanel 和 UpdateProgess 工具。

这将阻止对服务器的任何其他调用,直到更新完成。像这样的

    <asp:UpdateProgress ID="updateMyGridViewProgress" runat="server">
        <ProgressTemplate>
            <img src="images/loading.gif" alt="Updating the information" />
        </ProgressTemplate>
    </asp:UpdateProgress>

    <asp:UpdatePanel ID="updateMyGridView" runat="server">
        <ContentTemplate>
            <asp:GridView 
                ID="myGridView" 
                OnRowUpdating="UpdateAdInfo"
                runat="server" >
            </asp:GridView>
        </ContentTemplate>
    </asp:UpdatePanel>

我不得不使用与此类似的东西来帮助用户了解过去何时完成更新。

但是,默认的 ASP.NET AJAX UpdatePanel 往往会在回传到服务器以进行简单操作的信息中变得冗长。

就个人而言,我会尽量避免使用 GridView 并使用对 AJAX 更友好的东西(即 jqGrid http://www.trirand.com/blog/

【讨论】:

  • 嗯,问题是,更新请求几乎立即完成,页面加载后不久,所以我不知道如何检测并等待延迟,而不是仅仅测量几次运行,并以最佳猜测进行睡眠呼叫。但是故意放慢体验是没有意义的。我可以在更新实际需要之前有延迟,只要我能在一行突然跳转到其他地方时找到愚蠢的编辑行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多