Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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_Loops_Listview_Increment - Fatal编程技术网

C# 在遍历listView项时,如何使标签计数

C# 在遍历listView项时,如何使标签计数,c#,winforms,loops,listview,increment,C#,Winforms,Loops,Listview,Increment,所以我有这个列表视图,我可以通过openfiledialog向它添加项目,然后我执行File.ReadLine并读取我刚才选择的文本文件的所有行 假设我选择了一个包含3行的文本文件 鲍勃 猫 人 然后它会将项目添加到listview中 现在,对于它添加的每个项目,我希望增加标签(从0添加>3) 我试过了,但一运行它就出现了一个错误,我非常确定它不会工作,因为它后面没有真正的locig,我如何使我的标签从0>3(或文本文件中有多少项)递增?要解决您提出的问题,可以这样做: private void

所以我有这个列表视图,我可以通过openfiledialog向它添加项目,然后我执行File.ReadLine并读取我刚才选择的文本文件的所有行

假设我选择了一个包含3行的文本文件

鲍勃 猫 人

然后它会将项目添加到listview中

现在,对于它添加的每个项目,我希望增加标签(从0添加>3)


我试过了,但一运行它就出现了一个错误,我非常确定它不会工作,因为它后面没有真正的locig,我如何使我的标签从0>3(或文本文件中有多少项)递增?

要解决您提出的问题,可以这样做:

private void btnAddItems_Click(object sender, EventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "Names|*.txt";

    if(ofd.ShowDialog() == DialogResult.OK)
    {
        string[] recipients = File.ReadAllLines(ofd.FileName);

        foreach(var name in recipients)
        {
            lvRecipient.Items.Add(name);

            lbCount.Text = lvRecipient.Items.Count.ToString();
        }
    }
}
最好是在添加所有项目后设置计数标签,而不是在每次添加新项目时设置计数标签,因为添加操作应该非常快速,这样人类甚至不可能检测到变化的数字。可以这样做:

private void btnAddItems_Click(object sender, EventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "Names|*.txt";

    if(ofd.ShowDialog() == DialogResult.OK)
    {
        string[] recipients = File.ReadAllLines(ofd.FileName);

        foreach(var name in recipients)
        {
            lvRecipient.Items.Add(name);
        }

        lbCount.Text = lvRecipient.Items.Count.ToString();
    }
}

它确实有效——我试过了。如果您只是将“int”更改为“var”-因为“lvRecipient.Items”在foreach循环中不能被视为整数。

这可能就是您正在寻找的,也许有人会发现它很有用,但我的函数是异步运行的,我必须调用标签

delegate void SetTextCallback1(string name);
private void SetTextLabel(string name)
{
    if (this.label1.InvokeRequired)
    {
        SetTextCallback1 d = new SetTextCallback1(SetTextLabel);
        this.Invoke(d, new object[] { name });
    }
    else
    {
        this.label1.Text = name;
    }
}
然后我使用task.run:

await Task.Run(() => SetTextLabel(name));

当然,Task.Run行在异步函数中包装的循环中。

移动
inti=0那些循环之外的声明。这很有效!但它并不算真的,它从0跳到1000。@JonnyKhanas我更新了答案以解决你的确切问题,还包括了我认为可能更好的解决方案。它仍然跳,即使我把它放在foreach中loop@JonnyKhanas是的,这是因为添加操作非常快。所有项目可能都需要毫秒的时间。如果你想看到数字慢慢勾选,添加
Thread.Sleep(1000)
在foreach循环中,尽管这就是为什么我建议只在最末端设置计数-人类不会检测到标签变化如此之快。它“跳跃”是因为您在主UI线程上执行阻塞循环,并且在按钮处理程序完成之前它无法更新自身。要“修复”它,您必须将该代码移动到后台线程并正确调用()更新。你需要一个大的文件,这是引人注目的,它会减慢事情。。。
delegate void SetTextCallback1(string name);
private void SetTextLabel(string name)
{
    if (this.label1.InvokeRequired)
    {
        SetTextCallback1 d = new SetTextCallback1(SetTextLabel);
        this.Invoke(d, new object[] { name });
    }
    else
    {
        this.label1.Text = name;
    }
}
await Task.Run(() => SetTextLabel(name));