所以我有这个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(或文本文件中有多少项目?)
答案 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行位于一个包含在异步函数中的循环中。