TextBox不会更新内容

时间:2017-06-14 18:41:23

标签: c# winforms

与大多数关于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

1 个答案:

答案 0 :(得分:2)

问题不在于文本框,而在于流。您正在读取流以检索字符串,并且下次将相同的流传递到表单时,流将在末尾,因此无需从中读取。

在将流传递给表单之前添加它:

sr.BaseStream.Seek(0, SeekOrigin.Begin);

这将使流处于开始状态,您将能够再次读取数据。

但更好的是,在循环之前将流读入字符串并将该字符串传递给表单,它将更有效。