我有一个SQL表,包含当前100万行,随着时间的推移会增长.
特定用户需要提供可排序网格,该网格显示所有行而不进行分页.用户希望能够通过使用滚动条快速地从一行跳到另一行以及从上到下跳转.
我熟悉"虚拟模式"网格,它只显示整个数据的可见子集.它们可以提供出色的UI性能和最小的内存要求(我甚至多年前使用这种技术实现了一个应用程序).
Windows窗体DataGridView提供了一个看起来应该是答案的虚拟模式.但是,与我遇到的其他虚拟模式不同,它仍然为每一行分配内存(在ProcessExplorer中确认).显然,这会导致整体内存使用量不必要地大大增加,并且在分配这些行时,会出现明显的延迟.滚动性能也会受到100万+行的影响.
真正的虚拟模式不需要为未显示的行分配任何内存.您只需给它总行数(例如1,000,000),所有网格都会相应地缩放滚动条.当它首次显示时,网格只询问数据前n个(比如30个)可见行,即时显示.
当用户滚动网格时,提供简单的行偏移和可见行的数量,并且可用于从数据存储中检索数据.
这是我正在使用的DataGridView代码的示例:
public void AddVirtualRows(int rowCount)
{
dataGridList.ColumnCount = 4;
dataGridList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dataGridList.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
dataGridList.VirtualMode = true;
dataGridList.RowCount = rowCount;
dataGridList.CellValueNeeded += new DataGridViewCellValueEventHandler(dataGridList_CellValueNeeded);
}
void dataGridList_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
e.Value = e.RowIndex;
}
Run Code Online (Sandbox Code Playgroud)
我在这里遗漏了什么,或者DataGridView的"虚拟"模式根本不是虚拟的?
[更新]
看起来好的旧ListView实现了我正在寻找的那种虚拟模式.但不幸的是ListView没有DataGridView的单元格格式化功能,所以我无法使用它.
对于其他可能的人,我使用四列ListView(详细模式),VirtualMode = True和VirtualListSize = 100,000,000行测试它.
该列表立即显示,前30行可见.然后我可以毫不拖延地快速滚动到列表的底部.内存使用量始终为10 MB.
有谁知道围绕Windows API功能的.NET托管包装器在.NET框架本身不可用?
窗口创建和显示样式,常见UI控件操作,键盘/鼠标输入,文件和磁盘信息,内存映射文件等区域
我一直是访客http://www.pinvoke.net/的常客,并发现它是一个很好的资源.但是,必须直接使用DllImport函数,然后每次定位所需的结构和枚举都很慢并且容易出错.
(我确实意识到在可能的情况下以100%托管代码执行操作几乎总是更好的方法,但是有很多东西,特别是在Windows窗体中,您只能使用托管代码来执行此操作.)
目前专注于Windows XP,但未来可能会转向Windows 7.
我经常读到这个框架太大了,一个开发人员无法体验它的每一部分.有一些实际数字肯定有助于把事情放在眼里.
MSDN似乎列出了所有这些,但没有实际的数字(从我能看到的),花费数小时计算它们并不是我对生产时间的看法.
我意识到还有代表,枚举,事件等,但上述类型是最感兴趣的.
此外,基类库(BCL)中的类型数量以及整个框架类库(FCL)的大小将是有趣的.
这些信息有两种用途:
首先,要了解您实际使用的整体框架的数量以及您还需要学习多少.
其次,来自其他平台(和非技术人员)的许多程序员经常会惊讶于程序员可以将大部分时间花在".NET Framework"中.有一些数字肯定有助于解释为什么这不是狭隘的技能/经验的迹象.
[更新]
使用安德鲁的代码(在我的.NET 3.5 SP1系统上),我得到:
Classes: 12688 Value types: 4438 Interfaces: 1296
我认为自己是一个经验丰富的.NET开发人员,但我几乎从未在System.ComponentModel命名空间中直接使用类型.(我已经实现了一些自定义属性并通过反射消耗它们).
在什么样的场景中,诸如Component,Container,PropertyDescriptor,TypeDescriptor,License和TypeConverter等类型最有用?
在谈论"设计者"时,我经常看到System.ComponentModel,例如Visual Studio中提供的那些.
例如,当您想要使用漂亮的可视化设计器(例如自定义属性等)构建自定义控件时,这些类型是否有用?或者我也可以在更通用的代码中使用它们吗?
我正在使用Windows API函数FindFirstFileEx,因为它提供了仅返回给定目录的子目录(忽略文件)的功能.但是,当我用所需的标志调用此函数时,我仍然会收到文件和目录.
FindFirstFileEx使用的FindExSearchLimitToDirectories标志的MSDN文档 说:
这是一个咨询标志.如果文件系统支持目录过滤,则该函数将搜索与指定名称匹配的文件,并且也是目录.如果文件系统不支持目录过滤,则会以静默方式忽略此标志.
使用此搜索值时,FindFirstFileEx函数的lpSearchFilter参数必须为NULL.
如果需要目录筛选,则此标志可用于所有文件系统,但由于它是一个顾问标志并且仅影响支持它的文件系统,因此应用程序必须检查存储在FindFirstFileEx函数的lpFindFileData参数中的文件属性数据确定函数是否已返回目录句柄.
那么,什么文件系统实际上支持这个标志? 实际在同一页面上列出这些支持的文件系统是明智的,但我找不到它.
我的开发系统是Windows XP SP3,NTFS,.NET 3.5.
我知道我可以检查文件属性以确定文件是否是目录,但这意味着检查每个文件/目录.它也首先违背了使用FindFirstFileEx的目的.
当然,我的代码中仍有可能出错.我唯一能看到的是将IntPtr.Zero传递给lpSearchFilter可能与传递NULL不同(如引用中所述).
这是我正在使用的代码示例:
m_searchDirHandle = WinAPI.FindFirstFileEx(@"C:\Temp\*",
WinAPI.FINDEX_INFO_LEVELS.FindExInfoStandard ,
ref m_findDirData, WinAPI.FINDEX_SEARCH_OPS.FindExSearchLimitToDirectories,
IntPtr.Zero , 0);
if (m_searchDirHandle != WinAPI.INVALID_HANDLE_VALUE)
{
do
{
foundNextDir = WinAPI.FindNextFile(m_searchDirHandle, ref m_findDirData);
} while (foundNextDir);
}
Run Code Online (Sandbox Code Playgroud) 这些IDE的目标是什么类型的开发人员?一个IDE是另一个的超集/子集吗?我可以用一个而不是另一个做什么?
我现在打算主要做基于桌面的(Windows)工作,所以我相信我在忽略Java EE 下载并专注于这两个方面是正确的.
功能页面的 比较没有用,因为我还是Eclipse和Java的新手.例如,"Code Recommenders Developer Tools"对我来说毫无意义.
Eclipse标准已下载170万次,为246MB(截至9月7日至13日).Eclipse IDE for Java开发人员已下载430,000次,为151MB.
所以我猜Eclipse Standard是要走的路,但为什么他们提供第二种选择呢?
作为一种学习经历,我最近尝试使用 C#中的3路分区实现Quicksort.
除了需要在递归调用之前在左/右变量上添加额外的范围检查之外,它似乎工作得很好.
我事先知道框架在List <>中提供了内置的Quicksort实现.排序(通过Array.Sort).所以我尝试了一些基本的分析来比较性能.结果:内置的List <>.Sort方法在同一个列表上运行,比我自己的手动实现快10倍.
使用反射器,我发现List <>中的实际排序.排序是在外部代码中实现的,而不是IL(在名为tryszsort()的函数中).
看看我自己的Quicksort实现,我希望用迭代替换递归调用可能会有所改进.此外,禁用数组边界检查(如果可能)也可以带来一些好处.也许这会更接近内置实现,但我不自信.
所以我的问题是:期望在优化算法(用.NET IL编写,与本机代码相匹配)中的性能是否可以与外部实现的算法的性能竞争?
再一次,我意识到Quicksort是框架的一部分,这对我来说只是一次学习经历.然而,还有许多算法(CRC32可以想到)未提供,但仍然可能对许多应用程序有很大价值.这是关于在.NET中实现CRC32和性能问题的相关问题.
因此,如果您需要在.NET中实现这样的算法,需要了解哪些主要的性能注意事项,以便您的算法至少可以接近外部代码的性能?
[更新]
通过更改算法以在Int的简单数组上操作而不是List,我将执行速度提高到内置Array.Sort的大约10%以内.在Reflector中,我可以看到这避免了对列表中的每个get或set上的Callvirt()操作.我认为这可能会改善一些事情,但我对此感到惊讶.
关于如何在Visual Studio 2005中将现有Delphi 7业务应用程序迁移到.NET 2.0的任何建议?
Visual Studio 2005已经被购买,该公司希望摆脱Borland/Codegear工具.
该应用程序是单个客户端服务器可执行文件,利用许多第三方UI控件和Crystal报表10进行报告.
UI中的Delphi类型以及许多SQL Server 2000存储过程都有广泛的业务逻辑.将大部分存储过程逻辑移动到.NET类是另一个目标.
为了减少对客户的影响,如果可能的话,首选一种方法而不是完全重写/转换.提前致谢.
[更新]有没有人使用托管VCL进行此类场景的经验,好,坏或丑陋?
根据3D Programming for Windows(Charles Petzold)第7章中的信息,我试图编写一个辅助函数,将Point3D投影到包含相应屏幕坐标(x,y)的标准2D点:
public Point Point3DToScreen2D(Point3D point3D,Viewport3D viewPort )
{
double screenX = 0d, screenY = 0d;
// Camera is defined in XAML as:
// <Viewport3D.Camera>
// <PerspectiveCamera Position="0,0,800" LookDirection="0,0,-1" />
// </Viewport3D.Camera>
PerspectiveCamera cam = viewPort.Camera as PerspectiveCamera;
// Translate input point using camera position
double inputX = point3D.X - cam.Position.X;
double inputY = point3D.Y - cam.Position.Y;
double inputZ = point3D.Z - cam.Position.Z;
double aspectRatio = viewPort.ActualWidth / viewPort.ActualHeight;
// Apply projection to X and …Run Code Online (Sandbox Code Playgroud) 正如您可能已经知道的那样,在JQuery中选择具有特定CSS类的文档中的所有元素是很简单的,然后使用链接将常用事件处理程序分配给所选元素:
$(".toolWindow").click(toolWindow_click);
$(".toolWindow").keypress(toolWindow_keypress);
Run Code Online (Sandbox Code Playgroud)
像往常一样,类"toolWindow"通常也在CSS中定义并与一些视觉样式相关联:
.toolWindow{
color:blue;
background-color:white;
}
Run Code Online (Sandbox Code Playgroud)
class属性现在不仅要指示元素的外观(可视状态),还要指示行为.因此,我经常使用这种方法并将CSS类名称更多地定义为伪对象类,然后仅视觉化CSS类.换句话说,每个类都代表状态(CSS样式)和行为(事件).
在某些情况下,我甚至创建了没有视觉样式的类,只是使用它们作为向元素分配行为的便捷方式.
此外,jQuery LiveQuery插件(以及live()内置函数)通过自动将事件绑定到属于特定类的动态创建元素,使这种方法更加有效.
最近我主要使用类名来定义关联DOM元素的一组公共行为,并且稍后使用它们来定义视觉样式.
问题:这是一个可怕的滥用CSS"类"属性,如果是这样,为什么?
另一方面,也许这是进一步实现"关注点分离"和提高HTML/DHTML页面可维护性的完美有效方法?