Так что я пытаюсь изменить текст из проекта WinForms из другого класса, кроме класса Form. Он должен работать так:C# Как изменить/получить доступ к элементам управления WinForms из другого класса
Но вместо этого он делает это:
Путь я сделать это передать объект в качестве параметра для моего другого класса и из этого другого класса я мог бы изменить текст. Я делаю то же самое с индикатором progressbar, и он работает там, поэтому странно, что он работает с индикатором progressbar, но не с меткой.
Я использую этот метод, чтобы изменить прогрессбар:
public void IncreaseProgress(int progBarStepSize, String statusMsg, int currentProject=-1) {
if (currentProject != -1) {
lblStatus.Text = String.Format("Status: {0} | project {1} of {2}",statusMsg,currentProject,ProjectCount);
}
else {
lblStatus.Text = String.Format("Status: {0}",statusMsg);
}
pb.Increment(progBarStepSize);
}
А вот где я использую метод:
public void InitialiseFile(List<string> filePaths, int eurojobType)
{
foreach (string sheet in outputSheets) {
switch (sheet) {
case "Summary":
for (int i = 0; i < filePaths.Count; i++) {
var filePath = filePaths[i];
IncreaseProgress(1, "Reading Summary", i);
worksheetIn = excelReader.ReadExcelSummary(filePath);
IncreaseProgress(1, "Writing Summary", i);
excelWriter.WriteExcelSummary(worksheetIn);
}
break;
case "Monthly_Cat1":
for (int i = 0; i < filePaths.Count; i++) {
var filePath = filePaths[i];
IncreaseProgress(1, "Reading Monthly", i);
worksheetIn = excelReader.ReadExcelMonthly(filePath);
IncreaseProgress(1, "Writing Monthly", i);
excelWriter.WriteExcelMonthly(worksheetIn);
}
break;
}
}
IncreaseProgress(1, "Completed!");
}
Теперь я знаю, этот код работает, потому что приращения ProgressBar. И он должен прыгать в первом if-loop, потому что i
передается как параметр, который никогда не -1
.
//manager class
private Label lblStatus;
private ProgressBar pb;
public Manager(ProgressBar pb, Label lbl){
this.pb = pb;
lblStatus = lbl;
}
//Form class
Manager mgr = new Manager(progressBar1, lblStatus, projectFilePaths.Count, outputSheets.ToArray(), exportPath);
mgr.InitialiseFile(projectFilePaths, eurjobType);
Не делайте блокировки работы с потоком пользовательского интерфейса. – SLaks
Эдвард, найдите момент, чтобы просмотреть «Задачи» и «Асинхронный шаблон»; а также интерфейс 'IProgress' –
@SLaks, что именно вы имеете в виду? Весь метод mgr.InitialiseFile() должен находиться в фоновой работе, чтобы пользовательский интерфейс не нуждался в том, чтобы дождаться завершения этого метода? – Edward