我的ListView选择事件处理错过了什么

时间:2009-02-27 12:03:26

标签: c# winforms listview

...或者c#listviews真是个噩梦吗?

好的,我正在处理的问题非常简单。或者至少看起来如此:

我有一个文本文件,其中包含有关单独行上的客户订单的信息。数据项以分号分隔。

我的表单遍历这些命令,将项目信息放入哈希表中,并将每个哈希表放入主哈希表中。有关每个订单(产品/订单#/客户名称/客户#)的一些摘要信息显示在我的列表视图中,由可排序列分隔。列表视图下方是一个选项卡控件,其中包含文本框,订单详细信息的可编辑部分分布在三个选项卡中。

以下是我想要发生的事情:

  • 用户点击单个条目:标签控件文本框填充订单详细信息。
  • 用户在标签控件中修改详细信息。
  • 用户点击另一个订单:确认消息检查是否应提交更改,如果“是”,则应将详细信息保存回相关的Hashtable并更新列表视图中的显示。
  • 用户选择多个listview项目:顶部项目应在选项卡控件中可编辑。
  • 用户按下表单顶部工具条上的“删除项目”按钮:从哈希表中删除项目,并更新列表视图控件以反映删除。文本框在选项卡控件上都设置为空白。

在我看来,这似乎是非常普通和合理的行为。我猜测使用SelectedIndexChanged事件将提供进行数据工作的机会。但是事件在每次选择/取消选择时都会触发两次,并且并不总是清楚哪些项目应该在列表视图中更新。

用于测试刚刚发生了什么样的“选择/取消选择”的代码,并决定应该采取什么样的行动才开始变得很长,我只是想知道我是不是太复杂了。

所以:

  • 我可以用另一个事件来实现我的功能目标吗?或
  • 是否有一些关于SelectedIndexChanged事件的内容,我不知道这有助于程序决定在任何给定点应该做什么?或
  • 我只是以错误的方式解决这个问题吗?

任何有关重新设计表单的建议都会受到欢迎。

编辑:尝试从不同角度解决此问题时,我将主哈希表更改为已排序列表。问题的其余部分保持不变。

2 个答案:

答案 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处理程序中的更新。

例如:

  1. ListViewTimer拖到您的WinForm
  2. 使用设计器
  3. ListView添加一系列项目
  4. ListView的{​​{1}}事件和SelectedIndexChanged Timer事件添加处理程序
  5. 将现有代码替换为:

  6. 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意味着该对将被视为单个复合事件。

    我希望这会有所帮助。