在迭代listView项目时如何使标签计数

时间:2017-01-11 23:47:02

标签: c# winforms loops listview increment

所以我有这个listview,我可以通过openfiledialog添加项目然后我做File.ReadLine并读取我刚刚选择的文本文件的所有行。

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

鲍勃 猫 人

那么它的作用是将项目添加到列表视图中。

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

/** Thread safe cout class
  * Exemple of use:
  *    PrintThread{} << "Hello world!" << std::endl;
  */
class PrintThread: public std::ostringstream
{
public:
    PrintThread() = default;

    ~PrintThread()
    {
        std::lock_guard<std::mutex> guard(_mutexPrint);
        std::cout << this->str();
    }

private:
    static std::mutex _mutexPrint;
};

std::mutex PrintThread::_mutexPrint{};

我尝试了但是一旦我运行它就出错了,我很确定它不会起作用,因为它背后没有真正的位置,我如何让我的标签从0开始增加&gt; 3(或文本文件中有多少项目?)

3 个答案:

答案 0 :(得分:1)

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

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();
    }
}

答案 1 :(得分:0)

using System;
using System.IO;
using System.Windows.Forms;

namespace Jonny
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        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 (string name in recipients)
                    {
                        lvRecipient.Items.Add(name);
                        //increment the number of items in the list
                        foreach (var item in lvRecipient.Items)
                        {
                            int i = 0;
                            i++;
                            lbCount.Text = i.ToString();
                        }
                    }
                }
            }
        }
    }
}

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

答案 2 :(得分:0)

这可能是你正在寻找的,也许有人会发现它很有用,我的功能虽然运行异步,但我不得不调用标签。

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行位于一个包含在异步函数中的循环中。