C# 我是否缺少ListView选择事件处理方面的内容
…或者c#ListView真的是一场噩梦吗 好的,我正在研究的问题很简单。或者至少看起来是这样的: 我有一个文本文件,其中包含关于客户订单的信息,在单独的行中。数据项用分号分隔 我的表单遍历这些顺序,将项目信息放入哈希表,并将每个哈希表放入主哈希表。有关每个订单(产品/订单#/客户名称/客户#)的一些摘要信息显示在我的列表视图中,由可排序的列分隔。listview下面是一个选项卡控件,其中包含用于订单详细信息可编辑部分的文本框,这些可编辑部分分布在三个选项卡上 以下是我希望发生的事情:C# 我是否缺少ListView选择事件处理方面的内容,c#,winforms,listview,C#,Winforms,Listview,…或者c#ListView真的是一场噩梦吗 好的,我正在研究的问题很简单。或者至少看起来是这样的: 我有一个文本文件,其中包含关于客户订单的信息,在单独的行中。数据项用分号分隔 我的表单遍历这些顺序,将项目信息放入哈希表,并将每个哈希表放入主哈希表。有关每个订单(产品/订单#/客户名称/客户#)的一些摘要信息显示在我的列表视图中,由可排序的列分隔。listview下面是一个选项卡控件,其中包含用于订单详细信息可编辑部分的文本框,这些可编辑部分分布在三个选项卡上 以下是我希望发生的事情: 用户单
- 用户单击单个条目:选项卡控件文本框填充订单详细信息
- 用户在选项卡控件中编辑详细信息
- 用户单击另一个订单:确认消息检查是否应提交更改,如果“是”,则应将详细信息保存回相关哈希表,并更新listview中的显示
- 用户选择多个listview项目:顶部项目应在选项卡控件中可编辑
- 用户按下表单顶部工具条上的“删除项”按钮:从哈希表中删除项,并更新listview控件以反映删除。选项卡控件中的文本框都设置为空白
- 是否有其他活动可用于实现我的功能目标?或
- SelectedIndexChanged事件是否有一些我不知道的东西可以帮助程序决定在任何给定点应该做什么?或
- 我是不是走错了路
编辑:当我试图从另一个角度解决这个问题时,我将我的主哈希表更改为sortedlist。问题的其余部分保持不变。在不知道“开始变得很长”的代码的情况下,我建议如下: 确保Listview1.MultiSelect为false。 使用表单上的字段(或属性)跟踪SelectedItem。 在该事件中,检查新列表视图是否为1。选择编辑项[0]!=这是SelectedItem
第2部分:将DataGridView和DataTables作为替代解决方案。您的数据听起来非常“相关”,数据内容有很多过滤/排序/链接功能。您可以将列表作为数据源附加到网格中,或者更进一步,将数据读取到数据表中。在
列表视图
上触发SelectedIndexChanged
时,不要更新UI,而是启动一个持续时间较短的计时器
(默认为100ms),并在计时器中执行UI更新。勾选处理程序
例如:
将列表视图
和计时器
拖到WinForm上
使用设计器将所选项目添加到列表视图
为列表视图
的SelectedIndexChanged
事件和计时器
勾选
事件添加处理程序
将现有代码替换为:
这是因为取消选择和重新选择事件彼此非常接近-比计时器的持续时间要快。以这种方式使用计时器
意味着该对将被视为单个复合事件
我希望这能有所帮助。恐怕Multiselect必须处于启用状态。有时,我们希望丢失90%的数据,而不得不单独删除90条记录一点也不好玩。但是单一数据表可能是个好主意。我会调查的。是的。。。事实证明,DataTable是一种不那么令人头痛的数据结构。非常感谢。我理解为什么每次点击都会触发两次。一次当它取消选择当前选择时,另一次当它选择新选择时,谷歌搜索结果中到处都是解释这一点的结果。至少,这是我被告知的……对于我前面例子中的错误,我感到抱歉。我已经修改了原来的条目,希望这更合适。
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());
}