我在一个.cs文件中有messagebox,我想在ok按钮点击时清除另一个.cs文件中的文本框。 我用过
System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke((Action)(() =>
{
_upload._txtbxNotes.Text = "";
}));
解决线程问题。但它没有帮助我。它仍然显示相同的错误。 任何帮助表示赞赏。
更新
您好,我也更新了我的代码,但它没有更改文本框值。保持原样。我在进度栏的上传屏幕上还有一个帖子。
这是我的代码:FileUpload.cs
if (String.Equals(objFileUploadResponse.responseCode, 102))
{
// MessageBox.Show("File Uploaded Successfully");
ipbup.ReportProgress(qpvsChunk);
DialogResult dialogResult = System.Windows.Forms.MessageBox.Show("File Uploaded", "", MessageBoxButtons.OK);
if (dialogResult == DialogResult.OK)
{
_upload.SetNotes(" ");
}
}
else
{
System.Windows.MessageBox.Show("File Uploaded Failed");
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Upload.cs:
public void SetNotes(string note)
{
_txtbxNotes.Dispatcher.Invoke(() =>
{
_txtbxNotes.Text = note;
});
}
答案 0 :(得分:2)
这可能是因为您正在另一个线程上运行。当您在另一个线程上调用System.Windows.Threading.Dispatcher.CurrentDispatcher
时,它将创建一个新的Dispatcher
。但是你不想要一个新的调度员,你想要使用“拥有”控制/窗口的Dispatcher
。
要解决此问题,您的控件/窗口具有Dispatcher
属性。 (它引用它创建的Dispatcher)
您可以尝试:
// use the Dispatcher from the _upload control.
_upload._txtbxNotes.Dispatcher.Invoke(() =>
{
_upload._txtbxNotes.Text = "";
}));
'更好'的方法可能是:在_upload
类中创建一个名为的方法(例如) _upload.SetNotes(string note);
这样就可以保持逻辑分离。今天你希望TextBox
明天你可能需要一个Label
。这样只会导致上传窗口/控件/类。
// for example: (pseudo)
_upload.SetNotes("");
class UploadWindow
{
// ......
public void SetNotes(string note)
{
_txtbxNotes.Dispatcher.Invoke(() =>
{
_txtbxNotes.Text = note;
}));
}
}