6.5使用共享行
实现有效的内存使用在通过共享行的DataGridView控制。作为行会分享他们的外观和行为,尽可能通过DataGridViewRow类的共享实例的信息。
虽然共享行实例节省内存,很容易成为非共享行。例如,每当一个直接与用户交互的一个单元,它的行成为非共享。因为这是无法避免,在这个主题中的准则是有用的,只有当工作与数据量非常大,只有当用户将与每一个数据你的程序运行时间的一小部分。
阿行不能共享在未绑定的DataGridView控制,如果它的任何单元包含。当DataGridView控件绑定到外部数据源,或当您实现虚拟模式,并提供您自己的数据源,该单元存储以外的控制,而不是在单元对象,允许行被共享。
行对象只能共享,如果它的所有细胞的状态可以从该行的状态和细胞列载的状态决定。如果您更改单元的状态,这样它可以不再从它的行和列的状态推断,该行不能被共享。
例如,行不能共享在下列情形之一:
?该行包含一个选定的单元是不是在选定的列。
?该行包含一个与它的ToolTipText或ContextMenuStrip属性设置单元。
?该行包含其项目属性的DataGridViewComboBoxCell集。
在绑定模式或虚拟模式,您可以通过处理CellToolTipTextNeeded提供CellContextMenuStripNeeded事件和个别细胞工具提示和快捷菜单。
DataGridView控件将自动尝试使用共享每当行添加到DataGridViewRowCollection行。使用下面的指引,以确保行共享:
?避免调用Add(Object []的)的添加方法和插入(对象[])的插入的行的集合方法重载超载。这些重载自动创建非共享行。
?确保在RowTemplate属性指定的行可以在下列情况下,共享:
?当调用add()或Add方法添加或插入(智力,智力)的行的集合插入方法重载(智力)重载。
?当增加RowCount属性的。
?当设置DataSource属性。
?确保该行的indexSource参数指定当呼叫可以共享的行集合AddCopy,AddCopies,InsertCopy和InsertCopies方法。
?请确定指定的行或列时,可以共享调用Add(的DataGridViewRow)Add方法的重载,AddRange方法,插入(Int32的,的DataGridViewRow)方法重载的插入,和Rows集合InsertRange方法。
要确定行是否是共享的,使用DataGridViewRowCollection.SharedRow(int)方法来检索行对象,然后检查对象的Index属性。共享行总是为-1 Index属性。
6.6防止行成为非共享
共享成为非共享行可以作为一个代码或用户操作的结果。为了避免影响性能,你应该避免造成行成为非共享。在应用开发,你可以处理RowUnshared事件来确定行成为非共享。这是非常有用的调试行共享问题。
为了防止行成为非共享,请使用下列准则:
?避免索引中的行集或通过它迭代与foreach循环。你不会通常需要直接访问行。 DataGridView的操作方法,对行,而不是采取行实例行索引参数。此外,对于行相关的事件处理程序接收行属性,您可以用它来操作,而不会造成他们成为非共享行的事件参数对象。
?如果您需要访问的行对象,请使用DataGridViewRowCollection.SharedRow(int)方法并传入行的实际索引。请注意,但是,修改一个共享行对象通过此方法检索将修改所有行共享此对象。在新记录行不共享,所以这是不会受到影响,当您修改任何其他行中的其他行。还要注意的是一个共享行代表不同的行可能有不同的快捷菜单。以检索共享行实例的正确快捷菜单中,使用GetContextMenuStrip方法并传入行的实际索引。如果您访问共享行的ContextMenuStrip属性,而是将使用-1共享行的索引,将不检索正确的快捷菜单。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-50070-42.html
现在不给了