在我的C#(2010)应用程序中,我在虚拟模式下有一个DataGridView,它拥有数千行.是否有可能找出目前屏幕上的哪些细胞?
我有一个ListView,我希望调整项目的绘图(例如突出显示列表视图中的某些字符串),但我不想从根本上改变项目的显示方式.
我已将OwnerDraw设置为true并且可以了解如何绘制我的突出显示效果,但是每当我尝试按照默认实现绘制列表视图项的其余部分时,事情就会出错并且我会留下一个整体加载图形问题,表明实际上我已经完全出错了.
有什么地方我可以看到DrawItem和DrawSubItem事件的"默认"处理程序做什么,以便我可以更好地理解并更容易调整我的代码?
这里有一个片段,显示我目前正在做的事情:
public MyListView()
{
this.OwnerDraw = true;
this.DoubleBuffered = true;
this.DrawColumnHeader += new DrawListViewColumnHeaderEventHandler(MyListView_DrawColumnHeader);
this.DrawItem += new DrawListViewItemEventHandler(MyListView_DrawItem);
this.DrawSubItem += new DrawListViewSubItemEventHandler(MyListView_DrawSubItem);
}
private void MyListView_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
// Not interested in changing the way columns are drawn - this works fine
e.DrawDefault = true;
}
private void MyListView_DrawItem(object sender, DrawListViewItemEventArgs e)
{
e.DrawBackground();
e.DrawFocusRectangle();
}
private void MyListView_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
string searchTerm = "Term"; …Run Code Online (Sandbox Code Playgroud) 是否可以在"虚拟"模式下使用TextBox.
当用户滚动文档时,我想按需提供文本.
我正在寻找Gtk.ListStore中的一个功能,它像Winforms中的ListView.VirtualMode一样工作.
有类似的东西吗?
我在虚拟模式下使用DataGridView进行winform应用,一切都很好!唯一的问题是当我点击双击一个列分隔符时,控件正试图使列宽适合所有单元格,而不仅仅是显示的或可见的!很明显,它挂起了应用程序.
我尝试了各种配置
AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader;
AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
Run Code Online (Sandbox Code Playgroud)
Everything!,datagrid和每一列中的设置!没有任何作用
任何的想法?
最终结果是:用户可以调整列的大小,但不能通过双击en de column border!..我不在乎它是否完全不适合.
我想在列表视图中显示我们数据库中的记录 - 但检索可能需要很长时间.我可以使用RetrieveVirtualItem告诉我何时需要新的ListViewItem,添加一个虚拟项目,然后开始检索; 但是当数据库返回时我该如何处理记录呢?当ListView在VirtualMode中时,我无法更新ListView的Items集合.有没有办法告诉ListView重新加载项目?或者我可以保持对ListViewItem的引用并填充它?如果这些都不起作用,我怎么能异步地在虚拟模式下填充ListView?
我知道复制听起来很复杂,但请关注我:
你有一个ListView VirtualMode = true.
选择一个项目,向下滚动以使所选项目超出可视区域,然后尝试将另一个项目添加到ListView.
你会看到它瞬间表现异常,看到一些闪烁.如果你升级情况并试图快速添加很多项目(我每秒增加约20次),你会发现小问题变得非常大.它是周围闪烁和无效项目的组合.
我已经调查了这个问题,似乎ListView RetrieveVirtualItem为所选项目生成了很多事件(即使它显然不可见).
看起来当我添加一个新项目(增加VirtualListSize)时,ListView首先尝试关注所选项目,然后返回到之前的位置.
有没有人遇到同样的问题?
我在虚拟模式下有一个ListView.我想进入SelectedItems物业.
但是当我使用时ListView1.SelectedItems,我收到以下异常:
Cannot access the selected items collection when the ListView is in virtual mode
Run Code Online (Sandbox Code Playgroud)
如何ListView1.SelectedItems在VirtualMode中访问.
我正在使用listview的虚拟模式来显示大数据.但我不知道如何显示每个项目的图像.谁能帮我 ?
我写
private void ListContact_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
MyContact contact = ContactData.GetMyContact(e.ItemIndex);
if (e.Item == null) e.Item = new ListViewItem(contact.ToString());
if (contact.Photo != null)
{
e.Item.ImageList.Images.Add("" + contact.Id, contact.Photo);
e.Item.ImageKey = "" + contact.Id;
}
else
{
e.Item.ImageKey = "default";
}
}
Run Code Online (Sandbox Code Playgroud)
但它不能正常工作
关于实施建议的一般问题。
我有一个绑定到datagridview.
BindingList<Line> allLines = new BindingList<Line>();
dataGridView1.DataSource = allLines;
Run Code Online (Sandbox Code Playgroud)
我想实现virtual mode是因为该集合可能包含数百万个条目(Line对象),所以我认为只“缓存”或一次显示一些需要的条目可能会更快。哪个是我理解的虚拟模式?
我看过:http : //msdn.microsoft.com/en-us/library/2b177d6d.aspx
但我无法让它为datagridviewthat is 工作databound。
我无法指定行数:
this.dataGridView1.RowCount = 20;
`RowCount property cannot be set on a data-bound DataGridView control.`
Run Code Online (Sandbox Code Playgroud)
编辑:此链接表明我可能必须完全删除绑定。是这种情况吗?http://msdn.microsoft.com/en-us/library/ms171622.aspx
“如果绑定模式不能满足您的性能需求,您可以通过虚拟模式事件处理程序管理自定义缓存中的所有数据。”
VirtualMode = true
MultiSelect = false
Run Code Online (Sandbox Code Playgroud)
我可以获得选择的索引项,但是如何改变呢?
SelectedIndices 只读.
我有一些网格场景,我希望在ListView中显示> 500,000,000行.
如果我人为限制我的ListView显示100,000,000:
_listView.VirtualListSize = _data.Count;
if (_listView.VirtualListSize > 100000000)
_listView.VirtualListSize = 100000000;
Run Code Online (Sandbox Code Playgroud)
一切正常(自然在VirtualMode中).当我将我的代码更改为:
_listView.VirtualListSize = _data.Count;
if (_listView.VirtualListSize > 100000001)
_listView.VirtualListSize = 100000001;
Run Code Online (Sandbox Code Playgroud)
ListView显示一个空网格......这是一个Microsoft Bug吗?这是从哪里来的?这是Win32 ListView限制吗?最重要的是,为什么没有记录?
subj 有什么好的/简短的解决方案吗?
我能想到:
获取TopItem索引(在VirtualMode创建项目之前是否可以为空?),如果所需项目的索引较小,则不可见,否则获取底部可见索引(顶部索引+ listView.ClientSize.Height / GetItemRect(TopItem).Height),如果所需项目的索引较多,则为无形的。否则可见。
以某种方式检测滚动并做一些事情。
或者也许有更简单的方法?
virtualmode ×13
c# ×11
listview ×9
winforms ×4
.net ×3
datagridview ×3
asynchronous ×1
autosize ×1
data-binding ×1
flicker ×1
gtk# ×1
image ×1
lazy-loading ×1
selecteditem ×1
textbox ×1
wpf ×1