Как изменить RichTextBox другой формы в C # .NET - PullRequest
2 голосов
/ 13 февраля 2010

Я создаю Блокнот. У меня есть форма «Найти и заменить». Когда я нажимаю кнопку, форма открывается, пользователь вводит два ввода в два текстовых поля и нажимает кнопку. Затем 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();
        }

Проблема в том, что он не работает .. Я получаю исключение NullReferenceException в строке f1.MainText.Replace(findMe, replaceMe); Есть идеи?

Ответы [ 3 ]

2 голосов
/ 13 февраля 2010

Здесь вы создаете новый экземпляр формы:

Form1 f1 = new Form1();

Все свойства инициализируются их значениями по умолчанию (то есть строки равны нулю). Затем вы пытаетесь вызвать метод Replace для свойства MainText, равного null, и получаете исключение:

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 голосов
/ 13 февраля 2010

Вы можете добавить статические ссылки на формы в класс вашей Программы.

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.Form1 или Program.Form2 в качестве уже созданной ссылки.

0 голосов
/ 13 февраля 2010

Ваша форма для поиска и замены должна знать о вашей основной форме. То, как вы это делаете, вы создаете совершенно новую основную форму, которая не будет иметь текста в основной текстовой области. При создании формы «Найти и заменить» необходимо передать родительскую форму или даже просто основной текст в форму «Найти и заменить», а затем выполнить поиск в основном тексте формы из только что переданной формы.

Вы хотите что-то вроде следующего:

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();
    }
}
...