2010-02-13 53 views
2

我正在构建一个记事本。我有一个查找和替换表单。当我点击窗体打开的按钮时,用户在两个文本框中输入两个输入,然后按下一个按钮。然后主窗体中的RichTextBoxes应该被修改。如何在C#.NET中修改其他窗体的RichTextBox

这里是FindAndReplace表格的形式:

private void btnReplaceAll_Click(object sender, EventArgs e) 
     { 
      string findMe = txtFind.Text; 
      string replaceMe = txtReplace.Text; 
      Form1 f1 = new Form1(); 
      f1.MainText.Replace(findMe, replaceMe); 
      //this.Hide(); 
     } 

的问题是它不工作..我在该行f1.MainText.Replace(findMe, replaceMe); 任何想法得到一个NullReferenceException?

回答

2

在这里,您创建窗体的新实例:

Form1 f1 = new Form1(); 

所有属性都初始化为它们的默认值(即字符串为null)。接下来,您尝试呼吁MainText属性,它是nullReplace方法,你会得到异常:

f1.MainText.Replace(findMe, replaceMe); 

您需要先初始化这个属性:

f1.MainText = "blablabla"; 
f1.MainText = f1.MainText.Replace(findMe, replaceMe); 

UPDATE:

当您创建FindAndReplace表单时,您可以将文本的当前值传递给其构造函数:

public class Form1 : Form 
{ 
    protected void FindAndReplace_Click(object sender, EventArgs e) 
    { 
     var findAndReplaceForm = new FindAndReplaceForm(MainText.Text); 
     findAndReplaceForm.ShowDialog(); 
     MainText.Text = findAndReplaceForm.NewText; 
    } 
} 

public class FindAndReplaceForm : Form 
{ 
    private readonly string _originalText; 

    public FindAndReplaceForm(string originalText) 
    { 
     _originalText = originalText; 
    } 

    public string NewText 
    { 
     get 
     { 
      return (_originalText ?? string.Empty).Replace(findMe, replaceMe); 
     } 
    } 
} 
+0

还应该指出,调用'f1.MainText.Replace'不会做任何事情。 'Replace'返回一个新的字符串和所要求的替换;它不执行就地修改(字符串是不可变的)。 – 2010-02-13 16:20:45

+0

我需要用'MainText'的当前值初始化'f1' ..任何方式? – 2010-02-13 16:20:48

+0

@Bibhas,你认为'当前值'是什么意思?它存储在哪里? – 2010-02-13 16:22:37

0

您的查找和替换窗体必须知道您的主窗体。你这样做的方式,你正在创建一个全新的主表格,在主文本区域没有文字。创建查找和替换表单时,应将父表单或甚至是主文本传递给查找和替换表单,然后从刚刚传入的表单中搜索主表单文本。

您希望如下所示:

public class FindAndReplaceForm 
{ 
    private Form1 MainForm; 

    public FindAndReplaceForm(Form1 parentForm) 
    { 
     this.MainForm = parentForm; 
     //The rest of you constructor here 
    } 

    private void btnReplaceAll_Click(object sender, EventArgs e) 
    { 
     string findMe = txtFind.Text; 
     string replaceMe = txtReplace.Text; 

     //The following line will search the parent form 
     this.MainForm.MainText.Replace(findMe, replaceMe); 
     //this.Hide(); 
    } 
} 
+0

层次结构可能会带来多种形式的麻烦。 – Lazlo 2010-02-13 16:24:15

+0

'this.ParentForm = parentForm;'这一行无效。 'this.parentform'获取父窗体的一个实例.. – 2010-02-13 16:30:26

+1

@Bibhas,你是不正确的。它是一个实例变量,它对获取或设置没有限制。 – 2010-02-13 16:50:50

-1

您可以将静态表单引用添加到您的Program类。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    static class Program 
    { 
     public static Form1 F1 { get; set; } 
     public static Form2 F2 { get; set; } 

     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      Form1 = new Form1(); 
      Form2 = new Form2(); 

      Application.Run(Form1); 
     } 
    } 
} 

然后,任何形式的应用程序,你就可以使用Program.Form1Program.Form2为已经实例化的参考。

+0

如果我们需要使用Form1访问它,为什么我们需要'F1'和'F2'? – 2010-02-13 16:36:24

+0

这并没有真正回答这个问题。 – 2010-02-13 16:58:13

相关问题