...或者c#listviews真是个噩梦吗?
好的,我正在处理的问题非常简单。或者至少看起来如此:
我有一个文本文件,其中包含有关单独行上的客户订单的信息。数据项以分号分隔。
我的表单遍历这些命令,将项目信息放入哈希表中,并将每个哈希表放入主哈希表中。有关每个订单(产品/订单#/客户名称/客户#)的一些摘要信息显示在我的列表视图中,由可排序列分隔。列表视图下方是一个选项卡控件,其中包含文本框,订单详细信息的可编辑部分分布在三个选项卡中。
以下是我想要发生的事情:
在我看来,这似乎是非常普通和合理的行为。我猜测使用SelectedIndexChanged事件将提供进行数据工作的机会。但是事件在每次选择/取消选择时都会触发两次,并且并不总是清楚哪些项目应该在列表视图中更新。
用于测试刚刚发生了什么样的“选择/取消选择”的代码,并决定应该采取什么样的行动才开始变得很长,我只是想知道我是不是太复杂了。
所以:
任何有关重新设计表单的建议都会受到欢迎。
编辑:尝试从不同角度解决此问题时,我将主哈希表更改为已排序列表。问题的其余部分保持不变。
答案 0 :(得分:0)
如果不知道“开始变得很长”的代码,我会建议如下:
确保Listview1.MultiSelect为false。 使用表单上的字段(或属性)来跟踪SelectedItem。 在这种情况下,检查新的ListView1.Selecteditems [0]!= this.SelectedItem
第2部分:查看DataGridView和DataTables作为替代解决方案。您的数据听起来非常“关系”,Data的东西有很多过滤/排序/链接功能。您可以将List作为DataSource附加到Grid,或者进一步将数据读入DataTables。
答案 1 :(得分:0)
而不是在SelectedIndexChanged
上触发ListView
时更新用户界面,而是使用短Timer
(比如默认的100毫秒)启动Duration
,并执行用户界面Timer.Tick
处理程序中的更新。
例如:
ListView
和Timer
拖到您的WinForm ListView
添加一系列项目
ListView
的{{1}}事件和SelectedIndexChanged
Timer
事件添加处理程序Tick
这是有效的,因为取消选择和重新选择事件彼此非常接近 - 比private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
timer1.Start();
}
private string GetIndices()
{
string indices = "";
foreach (int i in listView1.SelectedIndices)
{
indices += i.ToString() + ", ";
}
if (indices.Length > 0)
{
indices = indices.Substring(0, indices.Length - 2);
}
return indices;
}
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Stop();
Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") +
". Selected indices = " + GetIndices());
}
的{{1}}更快。以这种方式使用Timer
意味着该对将被视为单个复合事件。
我希望这会有所帮助。