2

我正在构建一个记事本。我有一个查找和替换表格。当我单击表单打开的按钮时,用户在两个文本框中输入两个输入并按下一个按钮。然后应该修改主窗体中的 RichTextBoxes。

这是表单的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();
        }

问题是它不起作用..我在行中得到一个 NullReferenceExceptionf1.MainText.Replace(findMe, replaceMe); 知道吗?

4

3 回答 3

2

在这里,您创建了一个新的表单实例:

Form1 f1 = new Form1();

所有属性都被初始化为其默认值(即字符串为空)。接下来,您尝试调用is 属性Replace上的方法,然后您得到异常:MainTextnull

f1.MainText.Replace(findMe, replaceMe);

您需要首先初始化此属性:

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

更新:

当您创建 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);
        }
    }
}
于 2010-02-13T16:15:34.350 回答
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();
    }
}
于 2010-02-13T16:23:08.477 回答
-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作为已经实例化的引用。

于 2010-02-13T16:23:09.680 回答