gpt4 book ai didi

c# - for 循环中的动态标签文本

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:46 24 4
gpt4 key购买 nike

我用 C# 做了一个简单的 WF,试图动态改变标签。

但是,当我运行这段代码时,没有任何可见的变化,直到代码运行之后,它才变为“Processing 9”,0-8 从未显示。是因为在循环内吗?

 private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
label9.Text = "Processing " + i.ToString();
Thread.Sleep(1000);
}
}

编辑:X-Tech 的代码有效,但当我尝试将其合并到我的代码中时,出现以下线程问题。我正在尝试在进度条摇摆时动态更改循环中的 label.text:

System.Windows.Forms.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理附加信息:跨线程操作无效:从创建它的线程以外的线程访问控件“progressBar1”。如果有这个异常的处理程序,程序可以安全地继续

我不确定如何解决这个问题,因为我对 Task.Factory.StartNew() 和 Invoke 语句不是很熟悉。

编辑 2:改编代码:

 Task.Factory.StartNew(() =>
{
for (int i = 0; i < lstFilesToZip.Items.Count; i++)
{
zipArray[i] = lstFilesToZip.Items[i].ToString();
// Report progress.
ExecuteSecure(() => label9.Text = "Processing :" + Path.GetFileNameWithoutExtension(lstFilesToZip.Items[i].ToString()));
ExecuteSecure(() => progressBar1.PerformStep());

string zipFileName = Path.GetFileName(zipArray[i]);
string newFolder = txtDestinationFolder.Text + "\\" + Path.GetFileNameWithoutExtension(zipArray[i]);
//check to see if a directory with the file name for the zip file already exists, if not, it will create it
if (Directory.Exists(newFolder) == false)
{
DirectoryInfo newPath = Directory.CreateDirectory(newFolder);
if (lstCommonFiles.Items.Count > 0)
{
//copies each file in the common file list to each new folder created, the boolean indicates that it will overwrite existing files (true) or won't (false)
for (int k = 0; k < lstCommonFiles.Items.Count; k++)
{
File.Copy(lstCommonFiles.Items[k].ToString(), (newFolder + "\\" + Path.GetFileName(commonArray[k])), true);
}
}
//adds the zip file into the folder as well
File.Copy(zipArray[i], (newFolder + "\\" + zipFileName), true);

}
}

if (txtCommonFiles.Text.Length <= 0)
{
string result = "There are no common files selected, would you still like to proceed?";
DialogResult result1 = MessageBox.Show(result, "Common Files Missing", MessageBoxButtons.YesNo);
if (result1 == DialogResult.No)
{
return;
}
}
string[] dirs = Directory.GetDirectories(txtDestinationFolder.Text);

// Grabs the folders in the newly created directory
foreach (string dir in dirs)
lstDestinationFinal.Items.Add(dir);

//send sample file contents to preview window
string[] sampleFiles = Directory.GetFiles(lstDestinationFinal.Items[0].ToString());

//grabs the files
foreach (string zipFiles in sampleFiles)
lstSampleFile.Items.Add(zipFiles);

ExecuteSecure(() =>tabControl1.SelectedTab = tabPage2);
});

以及添加的方法:

 private void ExecuteSecure(Action action)
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(() => action()));
}
else
{
action();
}
}

最佳答案

试试这个

Task.Factory.StartNew(() =>
{
for (int i = 0; i < 10; i++)
{
Invoke(new MethodInvoker(() => label9.Text = "Processing " + i.ToString()));
Thread.Sleep(1000);
}
});

编辑:

Task.Factory.StartNew(() =>
{
for (int i = 0; i < 10; i++)
{
// Any GUI control which you want to use within thread,
// you need Invoke using GUI thread. I have declare a method below for this
//Now use this method as
ExecuteSecure(() => label9.Text = "Processing " + i);
ExecuteSecure(() => progressBar1.Value = i * 10);
//... other code etc.
Thread.Sleep(1000);
}
});


//---
private void ExecuteSecure(Action action)
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(() => action()));
}
else
{
action();
}
}

关于c# - for 循环中的动态标签文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32012376/

24 4 0