GridView行在编辑数据时跳来跳去

问题描述

| 我有一个简单的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会将数据存储在其中。 因此,最重要的是,这些解决方法有两个(我尚未成功实现)。 在每次页面加载时停止GridView的数据绑定,并坚持将其缓存在ViewState中。 GridView的OnDataBinding事件args上没有\“ Cancel \”属性,并且在数据源的OnSelecting事件期间设置Cancel只会使我留下一个空的GridView。 修正传播延迟。再说一次,我对此没什么好担心的,但是,如果这是修复意外跳动的行的一种方式,那对我来说很好。我是否只需要确保在数据库视图中以及从ASP.NET更新AD时都明确地连接到同一DC?还是还有其他事情发生? 根据行的主键而不是索引触发行编辑。我猜想我将不得不在行中创建一个CommandButton,将CommandArgument设置为该行的主键,然后遍历GridView中的所有行并进行回退,并相应地手动设置EditIndex。 我也欢迎其他想法。如果ViewState最终只有几百KB,那是可行的。该站点可通过非常快速的LAN访问,并且仅供内部使用。     

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...