我是c#的新手,我在做一个项目时遇到了一些困难。我有一个有两种形式的mdi程序。我需要从父窗体(Form1)中的MenuStrip打开一个文件到子窗体(Form2)中的richTextBox。如何使用父窗体中的方法从子窗体中获取richTextBox?我不知道我做错了什么。任何帮助将非常感激。以下是我父表单上的代码。谢谢!
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
ofd.Filter = "Text Files|*.txt";
openFileDialog1.Title = "";
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
Form2 f2 = new Form2();
f2.MdiParent = this;
f2.Show();
StreamReader sr = new StreamReader(openFileDialog1.FileName);
Text = sr.ReadToEnd();
sr.Close();
}
}
答案 0 :(得分:2)
有很多方法可以做到这一点。
一种方法是将文件名添加到子窗体的构造函数中。因此,您的主要表单将包含
Form2 f2 = new Form2(openFileDialog1.FileName);
f2.MdiParent = this;
f2.Show();
然后在子窗体的构造函数中定义:
public void Form2(string fileName);
{
StreamReader sr = new StreamReader(fileName);
this.RichTextBox1.Text = sr.ReadToEnd();
sr.Close();
}
如果在没有相关文件名的情况下合法地显示子表单,则上述操作是明智的选择,因为您在构造时强制调用者提供文件名。
如果子表单具有无文件模式(例如,在创建新文档时),则可以使用其他方法。为文件名提供公共属性。
父:
Form2 f2 = new Form2()
f2.OpenFile(openFileDialog1.FileName);
f2.MdiParent = this;
f2.Show();
子:
public void OpenFile(string fileName);
{
StreamReader sr = new StreamReader(fileName);
this.RichTextBox1.Text = sr.ReadToEnd();
sr.Close();
}
最后,如果你想在MDI类中拥有文件I / O逻辑,你可以只公开文本框:
父:
Form2 f2 = new Form2()
StreamReader sr = new StreamReader(openFileDialog1.FileName);
f2.DocumentText = sr.ReadToEnd();
sr.Close();
f2.MdiParent = this;
f2.Show();
子:
public string DocumentText
{
set
{
this.RichTextBox1.Text = value;
}
}
传递文件名而不是文本的一个好处是您可以设置窗口的标题栏以显示文件名。
子:
public void Form2(string fileName);
{
StreamReader sr = new StreamReader(fileName);
this.RichTextBox1.Text = sr.ReadToEnd();
this.Text = String.Format("NotePad -- {0}", fileName); //Title
sr.Close();
}
或
public void OpenFile(string fileName);
{
StreamReader sr = new StreamReader(fileName);
this.RichTextBox1.Text = sr.ReadToEnd();
sr.Close();
this.Text = String.Format("NotePad -- {0}", fileName); //Title
}
答案 1 :(得分:1)
这行代码似乎是设置了Text
的{{1}}属性,这不是您想要的。
Form1
在Text = sr.ReadToEnd();
中创建一个设置Form2
属性的公共属性:
RichTextBox.Text
然后,您可以将上面的第一行更改为以下内容,这会将文本发送到public string SomeText // name it something more appropriate :)
{
set { RichTextBox.Text = value; }
}
中的RichTextBox
控件:
Form2