GridView行在编辑数据时跳转

时间:2011-06-14 16:49:10

标签: asp.net gridview active-directory

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

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

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

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

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

所以,在我的头脑中,这些将是一些修复(我还没有成功实现)。

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

  2. 修复传播延迟。再说一遍,我没有心情,但如果它是一种固定行意外跳跃的方法,那对我来说没关系。我是否必须确保在数据库视图中以及从ASP.NET更新AD时明确连接到同一个DC?或者还有什么事情要发生?

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

  4. 我也对其他想法持开放态度。如果ViewState最终只有几百KB,那就可行了。该网站可通过相当快速的局域网访问,严格供内部使用。

1 个答案:

答案 0 :(得分:0)

无论您如何访问,从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/