与大多数关于GUI表单元素无法正确更新的问题不同,这个问题不是关于被阻止的GUI线程(至少我知道)。
我有循环,每次迭代都会创建并显示一个表单实例。表单的构造函数接受我在文本框中显示的一些文本。第一次通过循环我可以看到文本,但在文本不再显示之后。
public partial class Message : Form
{
private StreamReader _inputReader= null;
private string _inputString = @"";
public Message(StreamReader reader)
{
InitializeComponent();
_inputReader = reader;
Load += Message_Load;
}
public Message(string input)
{
InitializeComponent();
_inputString = input;
Load += Message_Load;
}
private void Message_Load(object sender, EventArgs e)
{
if (_inputReader == null)
{
//form was constructed with a string
textBox.Text = _inputString;
}
else
{
//form was constructed with a StreamReader
textBox.Text = _inputReader.ReadToEnd();
}
textBox.Select(0, 0);
}
}
string installNoticeFP = @"Test.notice.txt";
StreamReader sr = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(installNoticeFP));
while (!installerExists()) //returns a boolean
{
Message message = new Message(sr);
message.ShowDialog();
message.Dispose();
}
我确保Message.Designer.cs
文件中没有任何内容可以覆盖textBox.Text
我需要做些什么才能使文字每次出现在TextBox
?
答案 0 :(得分:2)
问题不在于文本框,而在于流。您正在读取流以检索字符串,并且下次将相同的流传递到表单时,流将在末尾,因此无需从中读取。
在将流传递给表单之前添加它:
sr.BaseStream.Seek(0, SeekOrigin.Begin);
这将使流处于开始状态,您将能够再次读取数据。
但更好的是,在循环之前将流读入字符串并将该字符串传递给表单,它将更有效。