Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我是否缺少ListView选择事件处理方面的内容_C#_Winforms_Listview - Fatal编程技术网

C# 我是否缺少ListView选择事件处理方面的内容

C# 我是否缺少ListView选择事件处理方面的内容,c#,winforms,listview,C#,Winforms,Listview,…或者c#ListView真的是一场噩梦吗 好的,我正在研究的问题很简单。或者至少看起来是这样的: 我有一个文本文件,其中包含关于客户订单的信息,在单独的行中。数据项用分号分隔 我的表单遍历这些顺序,将项目信息放入哈希表,并将每个哈希表放入主哈希表。有关每个订单(产品/订单#/客户名称/客户#)的一些摘要信息显示在我的列表视图中,由可排序的列分隔。listview下面是一个选项卡控件,其中包含用于订单详细信息可编辑部分的文本框,这些可编辑部分分布在三个选项卡上 以下是我希望发生的事情: 用户单

…或者c#ListView真的是一场噩梦吗

好的,我正在研究的问题很简单。或者至少看起来是这样的:

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

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

以下是我希望发生的事情:

  • 用户单击单个条目:选项卡控件文本框填充订单详细信息
  • 用户在选项卡控件中编辑详细信息
  • 用户单击另一个订单:确认消息检查是否应提交更改,如果“是”,则应将详细信息保存回相关哈希表,并更新listview中的显示
  • 用户选择多个listview项目:顶部项目应在选项卡控件中可编辑
  • 用户按下表单顶部工具条上的“删除项”按钮:从哈希表中删除项,并更新listview控件以反映删除。选项卡控件中的文本框都设置为空白
在我看来,这似乎是相当普通和合理的行为。我猜想使用SelectedIndexChanged事件将提供执行数据工作的机会。但是,每次选择/取消选择时,事件都会触发两次,并且并不总是清楚应该在哪个点在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());
    }